Received: by 2002:a25:8b12:0:0:0:0:0 with SMTP id i18csp1661449ybl; Wed, 14 Aug 2019 22:17:17 -0700 (PDT) X-Google-Smtp-Source: APXvYqwYToImUlYZRDYoF3N0FRTmv3WNul7aFhfXqnYOrsACDzDWWSh87DCu2BMNStbc53gsabCC X-Received: by 2002:a05:6a00:cd:: with SMTP id e13mr3801466pfj.202.1565846237156; Wed, 14 Aug 2019 22:17:17 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1565846237; cv=none; d=google.com; s=arc-20160816; b=l+u1qYkScP7fSQtrgnWmHTPKvtC5hF1oWqOKK74F+X7gWw+/r7Qlq67Sfl8rCaaG2/ Zk3X/uk1StiWiOGCZgByyO7dkrak18GYud68UjnTinUAezGJSlhhklX0FGYdRy4h2pbs T4pnvU9H7CVRLMWiMd33+jy/aLEfbiY6efdkhyKGIjH2yU2SGA7uzyRwtSmPg616KY2a 3iObco+Lktzh8mFOCy2vvUbsnieVmBQr3p3MSx/6qA95h9KGI8T26xzWsv7GayGnheIy Zq2H+GLVHEcM1MB4SiEJInjCQOeHcDX7LQpcLzQ8CASDLl063xe+X+UsO7nTGbNMtvLs BUhw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from; bh=EJWACAT3dPJ9scNj7n7s8dgO72JxSugXVzmNNyGpYZ4=; b=Rvoi7IFt78mgjU2o3eQ0JgUzeqzuyv/EtqbhRRmAqwL1WxXieCPx12aZHNHLNTdO8b Q0/BcdvWlAE27npsSALHh/CuIoEi87OnnR6p3azh5/VvpSIMOB85dIHBs6DiQXML/RGZ WzovHOOK0uVC0FLf8PUM3lS4crxn27fnmaBhHNLgHUpdFGemcRfDghGN6wzgnoNmbF4W sglntoR+35W3/XGWlRPr9GTQD/luaUKkRacgiXnKfu+1nPlvCcorIFKKyFbdprcs565R ySMHNWSLqAHCV1uiRJnim6t4sG6QmmfatHjJmxWNhfHiRF5jeJrlYI3tsgJYOXoQ3bR1 NNvg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id t18si52610pjr.102.2019.08.14.22.17.00; Wed, 14 Aug 2019 22:17:17 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730211AbfHOEna (ORCPT + 99 others); Thu, 15 Aug 2019 00:43:30 -0400 Received: from szxga04-in.huawei.com ([45.249.212.190]:4692 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1729967AbfHOEnZ (ORCPT ); Thu, 15 Aug 2019 00:43:25 -0400 Received: from DGGEMS410-HUB.china.huawei.com (unknown [172.30.72.60]) by Forcepoint Email with ESMTP id 87FF04AAC203EA09ADAD; Thu, 15 Aug 2019 12:43:03 +0800 (CST) Received: from architecture4.huawei.com (10.140.130.215) by smtp.huawei.com (10.3.19.210) with Microsoft SMTP Server (TLS) id 14.3.439.0; Thu, 15 Aug 2019 12:42:56 +0800 From: Gao Xiang To: , , "Alexander Viro" CC: LKML , Greg Kroah-Hartman , Andrew Morton , Stephen Rothwell , Theodore Ts'o , "Pavel Machek" , David Sterba , Amir Goldstein , Christoph Hellwig , "Darrick J . Wong" , Dave Chinner , "Jaegeuk Kim" , Jan Kara , Richard Weinberger , Linus Torvalds , , Chao Yu , Miao Xie , Li Guifu , Fang Wei , Gao Xiang Subject: [PATCH v8 17/24] erofs: introduce per-CPU buffers implementation Date: Thu, 15 Aug 2019 12:41:48 +0800 Message-ID: <20190815044155.88483-18-gaoxiang25@huawei.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190815044155.88483-1-gaoxiang25@huawei.com> References: <20190815044155.88483-1-gaoxiang25@huawei.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.140.130.215] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch introduces per-CPU buffers in order for the upcoming generic decompression framework to use. Note that I tried to use in-kernel per-CPU buffer or per-CPU page approaches to clean up further, however noticeable performanace regression (about 2% for sequential read) was observed. Let's leave it as-is for now. Signed-off-by: Gao Xiang --- fs/erofs/Kconfig | 14 ++++++++++++++ fs/erofs/internal.h | 21 +++++++++++++++++++++ fs/erofs/utils.c | 12 ++++++++++++ 3 files changed, 47 insertions(+) diff --git a/fs/erofs/Kconfig b/fs/erofs/Kconfig index a475fbebb831..5f8787c0cf89 100644 --- a/fs/erofs/Kconfig +++ b/fs/erofs/Kconfig @@ -81,3 +81,17 @@ config EROFS_FS_ZIP If you don't want to enable compression feature, say N. +config EROFS_FS_CLUSTER_PAGE_LIMIT + int "EROFS Cluster Pages Hard Limit" + depends on EROFS_FS_ZIP + range 1 256 + default "1" + help + Indicates maximum # of pages of a compressed + physical cluster. + + For example, if files in a image were compressed + into 8k-unit, hard limit should not be configured + less than 2. Otherwise, the image will be refused + to mount on this kernel. + diff --git a/fs/erofs/internal.h b/fs/erofs/internal.h index 6a2407fb3013..3222947c9bab 100644 --- a/fs/erofs/internal.h +++ b/fs/erofs/internal.h @@ -222,6 +222,12 @@ static inline int erofs_wait_on_workgroup_freezed(struct erofs_workgroup *grp) return v; } #endif /* !CONFIG_SMP */ + +/* hard limit of pages per compressed cluster */ +#define Z_EROFS_CLUSTER_MAX_PAGES (CONFIG_EROFS_FS_CLUSTER_PAGE_LIMIT) +#define EROFS_PCPUBUF_NR_PAGES Z_EROFS_CLUSTER_MAX_PAGES +#else +#define EROFS_PCPUBUF_NR_PAGES 0 #endif /* !CONFIG_EROFS_FS_ZIP */ /* we strictly follow PAGE_SIZE and no buffer head yet */ @@ -482,6 +488,21 @@ int erofs_namei(struct inode *dir, struct qstr *name, extern const struct file_operations erofs_dir_fops; /* utils.c */ +#if (EROFS_PCPUBUF_NR_PAGES > 0) +void *erofs_get_pcpubuf(unsigned int pagenr); +#define erofs_put_pcpubuf(buf) do { \ + (void)&(buf); \ + preempt_enable(); \ +} while (0) +#else +static inline void *erofs_get_pcpubuf(unsigned int pagenr) +{ + return ERR_PTR(-EOPNOTSUPP); +} + +#define erofs_put_pcpubuf(buf) do {} while (0) +#endif + #ifdef CONFIG_EROFS_FS_ZIP int erofs_workgroup_put(struct erofs_workgroup *grp); struct erofs_workgroup *erofs_find_workgroup(struct super_block *sb, diff --git a/fs/erofs/utils.c b/fs/erofs/utils.c index 628178261056..f3eed9af24d6 100644 --- a/fs/erofs/utils.c +++ b/fs/erofs/utils.c @@ -9,6 +9,18 @@ #include "internal.h" #include +#if (EROFS_PCPUBUF_NR_PAGES > 0) +static struct { + u8 data[PAGE_SIZE * EROFS_PCPUBUF_NR_PAGES]; +} ____cacheline_aligned_in_smp erofs_pcpubuf[NR_CPUS]; + +void *erofs_get_pcpubuf(unsigned int pagenr) +{ + preempt_disable(); + return &erofs_pcpubuf[smp_processor_id()].data[pagenr * PAGE_SIZE]; +} +#endif + #ifdef CONFIG_EROFS_FS_ZIP /* global shrink count (for all mounted EROFS instances) */ static atomic_long_t erofs_global_shrink_cnt; -- 2.17.1