Message ID | 20240424033916.2748488-13-libaokun@huaweicloud.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | cachefiles: some bugfixes and cleanups for ondemand requests | expand |
在 2024/4/24 11:39, libaokun@huaweicloud.com 写道: > From: Baokun Li <libaokun1@huawei.com> > > Replacing wait_for_completion() with wait_for_completion_killable() in > cachefiles_ondemand_send_req() allows us to kill processes that might > trigger a hunk_task if the daemon is abnormal. > > But now only CACHEFILES_OP_READ is killable, because OP_CLOSE and OP_OPEN > is initiated from kworker context and the signal is prohibited in these > kworker. > > Note that when the req in xas changes, i.e. xas_load(&xas) != req, it > means that a process will complete the current request soon, so wait > again for the request to be completed. > > Suggested-by: Hou Tao <houtao1@huawei.com> > Signed-off-by: Baokun Li <libaokun1@huawei.com> Reviewed-by: Jia Zhu <zhujia.zj@bytedance.com> > --- > fs/cachefiles/ondemand.c | 21 +++++++++++++++++++-- > 1 file changed, 19 insertions(+), 2 deletions(-) > > diff --git a/fs/cachefiles/ondemand.c b/fs/cachefiles/ondemand.c > index 673e7ad52041..b766430f4abf 100644 > --- a/fs/cachefiles/ondemand.c > +++ b/fs/cachefiles/ondemand.c > @@ -525,8 +525,25 @@ static int cachefiles_ondemand_send_req(struct cachefiles_object *object, > goto out; > > wake_up_all(&cache->daemon_pollwq); > - wait_for_completion(&req->done); > - ret = req->error; > +wait: > + ret = wait_for_completion_killable(&req->done); > + if (!ret) { > + ret = req->error; > + } else { > + xas_reset(&xas); > + xas_lock(&xas); > + if (xas_load(&xas) == req) { > + xas_store(&xas, NULL); > + ret = -EINTR; > + } > + xas_unlock(&xas); > + > + /* Someone will complete it soon. */ > + if (ret != -EINTR) { > + cpu_relax(); > + goto wait; > + } > + } > cachefiles_req_put(req); > return ret; > out:
diff --git a/fs/cachefiles/ondemand.c b/fs/cachefiles/ondemand.c index 673e7ad52041..b766430f4abf 100644 --- a/fs/cachefiles/ondemand.c +++ b/fs/cachefiles/ondemand.c @@ -525,8 +525,25 @@ static int cachefiles_ondemand_send_req(struct cachefiles_object *object, goto out; wake_up_all(&cache->daemon_pollwq); - wait_for_completion(&req->done); - ret = req->error; +wait: + ret = wait_for_completion_killable(&req->done); + if (!ret) { + ret = req->error; + } else { + xas_reset(&xas); + xas_lock(&xas); + if (xas_load(&xas) == req) { + xas_store(&xas, NULL); + ret = -EINTR; + } + xas_unlock(&xas); + + /* Someone will complete it soon. */ + if (ret != -EINTR) { + cpu_relax(); + goto wait; + } + } cachefiles_req_put(req); return ret; out: