<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:DengXian;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"\@DengXian";
        panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;
        mso-ligatures:none;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style>
</head>
<body lang="EN-SG" link="#0563C1" vlink="#954F72" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal">Currently flush_bg_queue() takes an input paramenter fiq, to which requests<o:p></o:p></p>
<p class="MsoNormal">in the bg_queue will be dispatched without respect to what's been set to<o:p></o:p></p>
<p class="MsoNormal">req->args->fiq. This behaviour totally breaks purpose of the request dispatching<o:p></o:p></p>
<p class="MsoNormal">algorithm when there are multiple input queues. So instead we need to enqueue<o:p></o:p></p>
<p class="MsoNormal">a request to its own req->args->fiq<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Removes the unnecessary 'spin_lock(&fc->bg_lock)' operation before return<o:p></o:p></p>
<p class="MsoNormal">just to be unlocked later immediately. This can increase lock contention under<o:p></o:p></p>
<p class="MsoNormal">heavy workload, thus negatively affects performance.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Signed-off-by: Liu Kui <Kui.Liu@acronis.com><o:p></o:p></p>
<p class="MsoNormal">---<o:p></o:p></p>
<p class="MsoNormal">fs/fuse/dev.c | 32 +++++++++++++++-----------------<o:p></o:p></p>
<p class="MsoNormal">1 file changed, 15 insertions(+), 17 deletions(-)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c<o:p></o:p></p>
<p class="MsoNormal">index fe26e8f01609..424180ff7ab2 100644<o:p></o:p></p>
<p class="MsoNormal">--- a/fs/fuse/dev.c<o:p></o:p></p>
<p class="MsoNormal">+++ b/fs/fuse/dev.c<o:p></o:p></p>
<p class="MsoNormal">@@ -267,10 +267,12 @@ void fuse_queue_forget(struct fuse_conn *fc, struct fuse_forget_link *forget,<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">-static void flush_bg_queue(struct fuse_conn *fc, struct fuse_iqueue *fiq)<o:p></o:p></p>
<p class="MsoNormal">+static void flush_bg_queue_and_unlock(struct fuse_conn *fc)<o:p></o:p></p>
<p class="MsoNormal">+__releases(fc->bg_lock)<o:p></o:p></p>
<p class="MsoNormal">{<o:p></o:p></p>
<p class="MsoNormal"> struct fuse_req *req, *next;<o:p></o:p></p>
<p class="MsoNormal"> LIST_HEAD(kio_reqs);<o:p></o:p></p>
<p class="MsoNormal">+ struct fuse_iqueue *fiq;<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> while (fc->active_background < fc->max_background &&<o:p></o:p></p>
<p class="MsoNormal"> !list_empty(&fc->bg_queue)) {<o:p></o:p></p>
<p class="MsoNormal">@@ -287,17 +289,18 @@ static void flush_bg_queue(struct fuse_conn *fc, struct fuse_iqueue *fiq)<o:p></o:p></p>
<p class="MsoNormal"> } else if (ret < 0)<o:p></o:p></p>
<p class="MsoNormal"> continue;<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal">+ fiq = req->args->fiq;<o:p></o:p></p>
<p class="MsoNormal"> spin_lock(&fiq->lock);<o:p></o:p></p>
<p class="MsoNormal"> req->in.h.unique = fuse_get_unique(fiq);<o:p></o:p></p>
<p class="MsoNormal"> queue_request_and_unlock(fiq, req);<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> spin_unlock(&fc->bg_lock);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal"> list_for_each_entry_safe(req, next, &kio_reqs, list) {<o:p></o:p></p>
<p class="MsoNormal"> list_del_init(&req->list);<o:p></o:p></p>
<p class="MsoNormal"> fc->kio.op->req_send(req, true);<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal">- spin_lock(&fc->bg_lock);<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">/*<o:p></o:p></p>
<p class="MsoNormal">@@ -356,8 +359,9 @@ void __fuse_request_end( struct fuse_req *req, bool flush_bg)<o:p></o:p></p>
<p class="MsoNormal"> fc->num_background--;<o:p></o:p></p>
<p class="MsoNormal"> fc->active_background--;<o:p></o:p></p>
<p class="MsoNormal"> if (flush_bg)<o:p></o:p></p>
<p class="MsoNormal">- flush_bg_queue(fc, fiq);<o:p></o:p></p>
<p class="MsoNormal">- spin_unlock(&fc->bg_lock);<o:p></o:p></p>
<p class="MsoNormal">+ flush_bg_queue_and_unlock(fc);<o:p></o:p></p>
<p class="MsoNormal">+ else<o:p></o:p></p>
<p class="MsoNormal">+ spin_unlock(&fc->bg_lock);<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> if (test_bit(FR_ASYNC, &req->flags)) {<o:p></o:p></p>
<p class="MsoNormal">@@ -609,6 +613,7 @@ static int fuse_request_queue_background(struct fuse_req *req)<o:p></o:p></p>
<p class="MsoNormal"> if (ff && test_bit(FUSE_S_FAIL_IMMEDIATELY, &ff->ff_state)) {<o:p></o:p></p>
<p class="MsoNormal"> ret = -EIO;<o:p></o:p></p>
<p class="MsoNormal"> } else if (likely(fc->connected)) {<o:p></o:p></p>
<p class="MsoNormal">+ ret = 0;<o:p></o:p></p>
<p class="MsoNormal"> fc->num_background++;<o:p></o:p></p>
<p class="MsoNormal"> if (fc->num_background == fc->max_background)<o:p></o:p></p>
<p class="MsoNormal"> fc->blocked = 1;<o:p></o:p></p>
<p class="MsoNormal">@@ -622,17 +627,14 @@ static int fuse_request_queue_background(struct fuse_req *req)<o:p></o:p></p>
<p class="MsoNormal"> spin_lock(&fiq->lock);<o:p></o:p></p>
<p class="MsoNormal"> req->in.h.unique = fuse_get_unique(fiq);<o:p></o:p></p>
<p class="MsoNormal"> queue_request_and_unlock(fiq, req);<o:p></o:p></p>
<p class="MsoNormal">- ret = 0;<o:p></o:p></p>
<p class="MsoNormal">- goto unlock;<o:p></o:p></p>
<p class="MsoNormal">+ } else {<o:p></o:p></p>
<p class="MsoNormal">+ list_add_tail(&req->list, &fc->bg_queue);<o:p></o:p></p>
<p class="MsoNormal">+ flush_bg_queue_and_unlock(fc);<o:p></o:p></p>
<p class="MsoNormal">+ goto out;<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">- list_add_tail(&req->list, &fc->bg_queue);<o:p></o:p></p>
<p class="MsoNormal">- flush_bg_queue(fc, fiq);<o:p></o:p></p>
<p class="MsoNormal">- ret = 0;<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal">-unlock:<o:p></o:p></p>
<p class="MsoNormal"> spin_unlock(&fc->bg_lock);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">+out:<o:p></o:p></p>
<p class="MsoNormal"> return ret;<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">@@ -2297,11 +2299,7 @@ void fuse_abort_conn(struct fuse_conn *fc)<o:p></o:p></p>
<p class="MsoNormal"> spin_lock(&fc->bg_lock);<o:p></o:p></p>
<p class="MsoNormal"> fc->blocked = 0;<o:p></o:p></p>
<p class="MsoNormal"> fc->max_background = UINT_MAX;<o:p></o:p></p>
<p class="MsoNormal">- for_each_online_cpu(cpu)<o:p></o:p></p>
<p class="MsoNormal">- flush_bg_queue(fc, per_cpu_ptr(fc->iqs, cpu));<o:p></o:p></p>
<p class="MsoNormal">- flush_bg_queue(fc, &fc->main_iq);<o:p></o:p></p>
<p class="MsoNormal">- spin_unlock(&fc->bg_lock);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">+ flush_bg_queue_and_unlock(fc);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> for_each_online_cpu(cpu)<o:p></o:p></p>
<p class="MsoNormal"> fuse_abort_iqueue(per_cpu_ptr(fc->iqs, cpu), &to_end);<o:p></o:p></p>
<p class="MsoNormal">--<o:p></o:p></p>
<p class="MsoNormal">2.32.0 (Apple Git-132)<o:p></o:p></p>
</div>
</body>
</html>