Messages in this thread | | | Date | Thu, 25 Apr 2024 13:15:37 +0800 | Subject | Re: [PATCH 12/12] cachefiles: make on-demand read killable | From | Jia Zhu <> |
| |
在 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:
| |