mirror of https://gitee.com/openkylin/linux.git
epoll: lock ep->mtx in ep_free to silence lockdep
Technically we do not need to hold ep->mtx during ep_free since we are certain there are no other users of ep at that point. However, lockdep complains with a "suspicious rcu_dereference_check() usage!" message; so lock the mutex before ep_remove to silence the warning. Signed-off-by: Eric Wong <normalperson@yhbt.net> Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: Arve Hjønnevåg <arve@android.com> Cc: Davide Libenzi <davidel@xmailserver.org> Cc: Eric Dumazet <eric.dumazet@gmail.com> Cc: NeilBrown <neilb@suse.de>, Cc: Rafael J. Wysocki <rjw@sisk.pl> Cc: Oleg Nesterov <oleg@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
eea1d58591
commit
ddf676c38b
|
@ -745,11 +745,15 @@ static void ep_free(struct eventpoll *ep)
|
|||
* point we are sure no poll callbacks will be lingering around, and also by
|
||||
* holding "epmutex" we can be sure that no file cleanup code will hit
|
||||
* us during this operation. So we can avoid the lock on "ep->lock".
|
||||
* We do not need to lock ep->mtx, either, we only do it to prevent
|
||||
* a lockdep warning.
|
||||
*/
|
||||
mutex_lock(&ep->mtx);
|
||||
while ((rbp = rb_first(&ep->rbr)) != NULL) {
|
||||
epi = rb_entry(rbp, struct epitem, rbn);
|
||||
ep_remove(ep, epi);
|
||||
}
|
||||
mutex_unlock(&ep->mtx);
|
||||
|
||||
mutex_unlock(&epmutex);
|
||||
mutex_destroy(&ep->mtx);
|
||||
|
|
Loading…
Reference in New Issue