From: Hou Tao <houtao1@huawei.com>
To: <linux-fsdevel@vger.kernel.org>
Cc: <linux-kernel@vger.kernel.org>, <viro@zeniv.linux.org.uk>,
<jbaron@akamai.com>, <oleg@redhat.com>, <dave@stgolabs.net>,
<koct9i@gmail.com>
Subject: [RFC][PATCH 4/8] epoll: free eventpoll by rcu to provide existence guarantee
Date: Sat, 28 Oct 2017 20:58:23 +0800 [thread overview]
Message-ID: <1509195507-29037-5-git-send-email-houtao1@huawei.com> (raw)
In-Reply-To: <1509195507-29037-1-git-send-email-houtao1@huawei.com>
Before the removal of epmutex, it's OK to access epi->ep in
reverse_path_check_proc(), because the freeing of ep will be
blocked on ep_free().
After the removal of epmutex, when accessing epi->ep in
reverse_path_check_proc(), it's possible that it has been
release because this eventpoll struct belongs to an epoll fd
which also polls the target file.
So freeing eventpoll by rcu to ensure the accessed fields of
eventpoll are still valid when invoking reverse_path_check_proc().
Signed-off-by: Hou Tao <houtao1@huawei.com>
---
fs/eventpoll.c | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/fs/eventpoll.c b/fs/eventpoll.c
index 998c635..18de596 100644
--- a/fs/eventpoll.c
+++ b/fs/eventpoll.c
@@ -230,6 +230,9 @@ struct eventpoll {
/* used to track busy poll napi_id */
unsigned int napi_id;
#endif
+
+ /* used to free itself */
+ struct rcu_head rcu;
};
/* Wait structure used by the poll hooks */
@@ -818,6 +821,12 @@ static int ep_remove(struct eventpoll *ep, struct epitem *epi)
return 0;
}
+static void ep_rcu_free(struct rcu_head *head)
+{
+ struct eventpoll *ep = container_of(head, struct eventpoll, rcu);
+ kfree(ep);
+}
+
static void ep_free(struct eventpoll *ep)
{
struct rb_node *rbp;
@@ -877,7 +886,8 @@ static void ep_free(struct eventpoll *ep)
mutex_destroy(&ep->mtx);
free_uid(ep->user);
wakeup_source_unregister(ep->ws);
- kfree(ep);
+
+ call_rcu(&ep->rcu, ep_rcu_free);
}
static int ep_eventpoll_release(struct inode *inode, struct file *file)
--
2.7.5
next prev parent reply other threads:[~2017-10-28 12:52 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-10-28 12:58 [RFC][PATCH 0/8] epoll: remove epmutex from ep_free() and eventpoll_release_file() for non-nested case Hou Tao
2017-10-28 12:58 ` [RFC][PATCH 1/8] epoll: remove epmutex from ep_free() & eventpoll_release_file() Hou Tao
2017-10-28 13:58 ` Davidlohr Bueso
2017-10-30 7:09 ` Hou Tao
2017-10-28 12:58 ` [RFC][PATCH 2/8] epoll: remove ep from visited_list when freeing ep Hou Tao
2017-10-28 12:58 ` [RFC][PATCH 3/8] epoll: remove file from tfile_check_list when releasing file Hou Tao
2017-10-28 12:58 ` Hou Tao [this message]
2017-10-28 12:58 ` [RFC][PATCH 5/8] epoll: iterate epi in file->f_ep_links by using list_first_or_null_rcu Hou Tao
2017-10-28 12:58 ` [RFC][PATCH 6/8] epoll: ensure the validity of ep when removing epi in eventpoll_release_file() Hou Tao
2017-10-28 12:58 ` [RFC][PATCH 7/8] epoll: prevent the double-free of " Hou Tao
2017-10-28 12:58 ` [RFC][PATCH 8/8] epoll: protect the iteration of ep->rbr by ep->mtx in ep_free() Hou Tao
2017-10-31 13:01 ` [RFC][PATCH 0/8] epoll: remove epmutex from ep_free() and eventpoll_release_file() for non-nested case Davidlohr Bueso
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1509195507-29037-5-git-send-email-houtao1@huawei.com \
--to=houtao1@huawei.com \
--cc=dave@stgolabs.net \
--cc=jbaron@akamai.com \
--cc=koct9i@gmail.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=oleg@redhat.com \
--cc=viro@zeniv.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).