<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">Both size of qhash and limit of each bucket can affect performance of<o:p></o:p></p>
<p class="MsoNormal">certain workload significantly. There is no single set of value that'd<o:p></o:p></p>
<p class="MsoNormal">be the best for all workload, we may need to choose a value based on<o:p></o:p></p>
<p class="MsoNormal">workload, so it'd be better make them configurable.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Here we choose the default value to be 16 (qhash size) x 256 (bucket<o:p></o:p></p>
<p class="MsoNormal">limit).<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 | 5 ++---<o:p></o:p></p>
<p class="MsoNormal">fs/fuse/fuse_i.h | 6 ++++--<o:p></o:p></p>
<p class="MsoNormal">fs/fuse/inode.c | 8 ++++++++<o:p></o:p></p>
<p class="MsoNormal">3 files changed, 14 insertions(+), 5 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 0023acc35204..8d15f76e0aea 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">@@ -367,7 +367,7 @@ void __fuse_request_end( struct fuse_req *req, bool flush_bg)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> bg = true;<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">- if (atomic_dec_return(&fc->qhash[bkt].num_reqs) < ((2*fc->max_background) / FUSE_QHASH_SIZE)) {<o:p></o:p></p>
<p class="MsoNormal">+ if (atomic_dec_return(&fc->qhash[bkt].num_reqs) < fuse_qhash_bucket_len) {<o:p></o:p></p>
<p class="MsoNormal"> if (waitqueue_active(&fc->qhash[bkt].waitq))<o:p></o:p></p>
<p class="MsoNormal"> wake_up(&fc->qhash[bkt].waitq);<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal">@@ -629,8 +629,7 @@ static int fuse_request_queue_background(struct fuse_req *req)<o:p></o:p></p>
<p class="MsoNormal"> __clear_bit(FR_BACKGROUND, &req->flags);<o:p></o:p></p>
<p class="MsoNormal"> __set_bit(FR_NO_ACCT, &req->flags);<o:p></o:p></p>
<p class="MsoNormal"> if (wait_event_killable_exclusive(fc->qhash[bkt].waitq,<o:p></o:p></p>
<p class="MsoNormal">- (atomic_read(&fc->qhash[bkt].num_reqs) <<o:p></o:p></p>
<p class="MsoNormal">- ((2 * fc->max_background) / FUSE_QHASH_SIZE) ||<o:p></o:p></p>
<p class="MsoNormal">+ (atomic_read(&fc->qhash[bkt].num_reqs) < fuse_qhash_bucket_len ||<o:p></o:p></p>
<p class="MsoNormal"> !READ_ONCE(fc->connected) ||<o:p></o:p></p>
<p class="MsoNormal"> (ff && test_bit(FUSE_S_FAIL_IMMEDIATELY, &ff->ff_state)))))<o:p></o:p></p>
<p class="MsoNormal"> return -EIO;<o:p></o:p></p>
<p class="MsoNormal">diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h<o:p></o:p></p>
<p class="MsoNormal">index 487e1125f7e7..1633db46c6ef 100644<o:p></o:p></p>
<p class="MsoNormal">--- a/fs/fuse/fuse_i.h<o:p></o:p></p>
<p class="MsoNormal">+++ b/fs/fuse/fuse_i.h<o:p></o:p></p>
<p class="MsoNormal">@@ -642,7 +642,7 @@ struct fuse_kio_ops {<o:p></o:p></p>
<p class="MsoNormal">int fuse_register_kio(struct fuse_kio_ops *ops);<o:p></o:p></p>
<p class="MsoNormal">void fuse_unregister_kio(struct fuse_kio_ops *ops);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">-#define FUSE_QHASH_SIZE 64<o:p></o:p></p>
<p class="MsoNormal">+#define FUSE_QHASH_SIZE 128<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#include <linux/jhash.h><o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">@@ -659,9 +659,11 @@ static inline unsigned int fuse_qhash_bucket(struct fuse_args * args)<o:p></o:p></p>
<p class="MsoNormal"> return jhash_2words(val & 0xFFFFFFFFU, val >> 32, 0) & (FUSE_QHASH_SIZE - 1);<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal">#else<o:p></o:p></p>
<p class="MsoNormal">+extern unsigned int fuse_qhash_size;<o:p></o:p></p>
<p class="MsoNormal">+extern unsigned int fuse_qhash_bucket_len;<o:p></o:p></p>
<p class="MsoNormal">static inline unsigned int fuse_qhash_bucket(void)<o:p></o:p></p>
<p class="MsoNormal">{<o:p></o:p></p>
<p class="MsoNormal">- return jhash_1word(current->pid, 0) & (FUSE_QHASH_SIZE - 1);<o:p></o:p></p>
<p class="MsoNormal">+ return jhash_1word(current->pid, 0) & (FUSE_QHASH_SIZE - 1) & (fuse_qhash_size - 1);<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal">#endif<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c<o:p></o:p></p>
<p class="MsoNormal">index 33cd8f9944ca..49993e1d20a5 100644<o:p></o:p></p>
<p class="MsoNormal">--- a/fs/fuse/inode.c<o:p></o:p></p>
<p class="MsoNormal">+++ b/fs/fuse/inode.c<o:p></o:p></p>
<p class="MsoNormal">@@ -54,6 +54,14 @@ MODULE_PARM_DESC(max_user_congthresh,<o:p></o:p></p>
<p class="MsoNormal"> "Global limit for the maximum congestion threshold an "<o:p></o:p></p>
<p class="MsoNormal"> "unprivileged user can set");<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">+unsigned int fuse_qhash_size = 16;<o:p></o:p></p>
<p class="MsoNormal">+module_param(fuse_qhash_size, uint, 0600);<o:p></o:p></p>
<p class="MsoNormal">+MODULE_PARM_DESC(fuse_qhash_size, "Number of qhash buckets, must be power of 2");<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+unsigned int fuse_qhash_bucket_len = 256;<o:p></o:p></p>
<p class="MsoNormal">+module_param(fuse_qhash_bucket_len, uint, 0600);<o:p></o:p></p>
<p class="MsoNormal">+MODULE_PARM_DESC(fuse_qhash_bucket_len, "Limit of a qhash bucket");<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">#define FUSE_SUPER_MAGIC 0x65735546<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#define FUSE_DEFAULT_BLKSIZE 512<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>