From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from out30-98.freemail.mail.aliyun.com (out30-98.freemail.mail.aliyun.com [115.124.30.98]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E70D21D554 for ; Tue, 21 Jan 2025 12:17:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=115.124.30.98 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737461829; cv=none; b=hL7b2GqUfwpBX/Wu6RYeZbgtLRZLmmhQjQVKe5eV8NXjzKWcSysLjOXJX+dKV3vF1KnxwPd2+TXcobD81cLt4CNSXtCUrDqh7x6T8EWEidGmMDc0GNCYY1dVaO9BzwJjGCrXTPkB8O139nbq3UvaTBda76AGtofPLuj9tb+soBE= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737461829; c=relaxed/simple; bh=HS/VUAnA7HteBVegjHRycs1QTqr+dRWYRsheIWiADF4=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=oMI1hzls9LPeKQslM8T7uDbNX1p0xdTh5gE2EqfTE1XxYmiwDRU/zcj2qGbWsucCWnwlyS1iFMt3uGhw+n5oBLLTl0yfHXHfVHwRDPjg5Az5P4yqjyzQsuGuphEXpvGYKJunVpINUjaQiQETKDkLGU5cWerWLiuN8V2kfsavrbo= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.alibaba.com; spf=pass smtp.mailfrom=linux.alibaba.com; dkim=pass (1024-bit key) header.d=linux.alibaba.com header.i=@linux.alibaba.com header.b=I1+rFk6d; arc=none smtp.client-ip=115.124.30.98 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.alibaba.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.alibaba.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.alibaba.com header.i=@linux.alibaba.com header.b="I1+rFk6d" DKIM-Signature:v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.alibaba.com; s=default; t=1737461816; h=Message-ID:Date:MIME-Version:Subject:To:From:Content-Type; bh=WIkn6AkjKb6XtnGUE7RS7G54jEYjiMZnBqfiqxhBLLQ=; b=I1+rFk6db96FiIIJ99/Dh64cxII01RcEHaDMRVeAPwpwvpCgZYvcgNMdPXZ0wjQeGWclVHxCZtf2C5PVU+GQlQouzMeaEIvgP8msmFcjZ79ysENf4+Nyy2WTR12B1i9+7gFfGEzOH4+NtSMohirQ/KRRghiiexwY5w5TVxGg6j8= Received: from 30.41.15.245(mailfrom:hsiangkao@linux.alibaba.com fp:SMTPD_---0WO5QVp7_1737461809 cluster:ay36) by smtp.aliyun-inc.com; Tue, 21 Jan 2025 20:16:55 +0800 Message-ID: <26a59c6f-f90d-4e99-9e7b-3f42efaad1f7@linux.alibaba.com> Date: Tue, 21 Jan 2025 20:16:46 +0800 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [RFC PATCH v5 3/4] erofs: apply the page cache share feature To: Hongbo Li , Hongzhen Luo , linux-erofs@lists.ozlabs.org Cc: linux-kernel@vger.kernel.org References: <20250105151208.3797385-1-hongzhen@linux.alibaba.com> <20250105151208.3797385-4-hongzhen@linux.alibaba.com> <5d34b289-c0f1-4c37-9536-fc955ce8b53b@huawei.com> From: Gao Xiang In-Reply-To: <5d34b289-c0f1-4c37-9536-fc955ce8b53b@huawei.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 2025/1/21 19:59, Hongbo Li via Linux-erofs wrote: > > > On 2025/1/5 23:12, Hongzhen Luo wrote: >> This modifies relevant functions to apply the page cache >> share feature. >> >> Below is the memory usage for reading all files in two different minor >> versions of container images: >> >> +-------------------+------------------+-------------+---------------+ >> |       Image       | Page Cache Share | Memory (MB) |    Memory     | >> |                   |                  |             | Reduction (%) | >> +-------------------+------------------+-------------+---------------+ >> |                   |        No        |     241     |       -       | >> |       redis       +------------------+-------------+---------------+ >> |   7.2.4 & 7.2.5   |        Yes       |     163     |      33%      | >> +-------------------+------------------+-------------+---------------+ >> |                   |        No        |     872     |       -       | >> |      postgres     +------------------+-------------+---------------+ >> |    16.1 & 16.2    |        Yes       |     630     |      28%      | >> +-------------------+------------------+-------------+---------------+ >> |                   |        No        |     2771    |       -       | >> |     tensorflow    +------------------+-------------+---------------+ >> |  1.11.0 & 2.11.1  |        Yes       |     2340    |      16%      | >> +-------------------+------------------+-------------+---------------+ >> |                   |        No        |     926     |       -       | >> |       mysql       +------------------+-------------+---------------+ >> |  8.0.11 & 8.0.12  |        Yes       |     735     |      21%      | >> +-------------------+------------------+-------------+---------------+ >> |                   |        No        |     390     |       -       | >> |       nginx       +------------------+-------------+---------------+ >> |   7.2.4 & 7.2.5   |        Yes       |     219     |      44%      | >> +-------------------+------------------+-------------+---------------+ >> |       tomcat      |        No        |     924     |       -       | >> | 10.1.25 & 10.1.26 +------------------+-------------+---------------+ >> |                   |        Yes       |     474     |      49%      | >> +-------------------+------------------+-------------+---------------+ >> >> Additionally, the table below shows the runtime memory usage of the >> container: >> >> +-------------------+------------------+-------------+---------------+ >> |       Image       | Page Cache Share | Memory (MB) |    Memory     | >> |                   |                  |             | Reduction (%) | >> +-------------------+------------------+-------------+---------------+ >> |                   |        No        |      35     |       -       | >> |       redis       +------------------+-------------+---------------+ >> |   7.2.4 & 7.2.5   |        Yes       |      28     |      20%      | >> +-------------------+------------------+-------------+---------------+ >> |                   |        No        |     149     |       -       | >> |      postgres     +------------------+-------------+---------------+ >> |    16.1 & 16.2    |        Yes       |      95     |      37%      | >> +-------------------+------------------+-------------+---------------+ >> |                   |        No        |     1028    |       -       | >> |     tensorflow    +------------------+-------------+---------------+ >> |  1.11.0 & 2.11.1  |        Yes       |     930     |      10%      | >> +-------------------+------------------+-------------+---------------+ >> |                   |        No        |     155     |       -       | >> |       mysql       +------------------+-------------+---------------+ >> |  8.0.11 & 8.0.12  |        Yes       |     132     |      15%      | >> +-------------------+------------------+-------------+---------------+ >> |                   |        No        |      25     |       -       | >> |       nginx       +------------------+-------------+---------------+ >> |   7.2.4 & 7.2.5   |        Yes       |      20     |      20%      | >> +-------------------+------------------+-------------+---------------+ >> |       tomcat      |        No        |     186     |       -       | >> | 10.1.25 & 10.1.26 +------------------+-------------+---------------+ >> |                   |        Yes       |      98     |      48%      | >> +-------------------+------------------+-------------+---------------+ >> >> Signed-off-by: Hongzhen Luo >> --- >>   fs/erofs/data.c            | 14 +++++++-- >>   fs/erofs/inode.c           |  5 ++- >>   fs/erofs/pagecache_share.c | 63 ++++++++++++++++++++++++++++++++++++++ >>   fs/erofs/pagecache_share.h | 11 +++++++ >>   fs/erofs/super.c           |  7 +++++ >>   fs/erofs/zdata.c           |  9 ++++-- >>   6 files changed, 104 insertions(+), 5 deletions(-) >> >> diff --git a/fs/erofs/data.c b/fs/erofs/data.c >> index 0cd6b5c4df98..fb08acbeaab6 100644 >> --- a/fs/erofs/data.c >> +++ b/fs/erofs/data.c >> @@ -5,6 +5,7 @@ >>    * Copyright (C) 2021, Alibaba Cloud >>    */ >>   #include "internal.h" >> +#include "pagecache_share.h" >>   #include >>   #include >> @@ -370,12 +371,21 @@ int erofs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, >>    */ >>   static int erofs_read_folio(struct file *file, struct folio *folio) >>   { >> -    return iomap_read_folio(folio, &erofs_iomap_ops); >> +    int ret, pcshr; >> + >> +    pcshr = erofs_pcshr_read_begin(file, folio); >> +    ret = iomap_read_folio(folio, &erofs_iomap_ops); >> +    erofs_pcshr_read_end(file, folio, pcshr); >> +    return ret; >>   } >>   static void erofs_readahead(struct readahead_control *rac) >>   { >> -    return iomap_readahead(rac, &erofs_iomap_ops); >> +    int pcshr; >> + >> +    pcshr = erofs_pcshr_readahead_begin(rac); >> +    iomap_readahead(rac, &erofs_iomap_ops); >> +    erofs_pcshr_readahead_end(rac, pcshr); >>   } >>   static sector_t erofs_bmap(struct address_space *mapping, sector_t block) >> diff --git a/fs/erofs/inode.c b/fs/erofs/inode.c >> index d4b89407822a..0b070f4b46b8 100644 >> --- a/fs/erofs/inode.c >> +++ b/fs/erofs/inode.c >> @@ -5,6 +5,7 @@ >>    * Copyright (C) 2021, Alibaba Cloud >>    */ >>   #include "xattr.h" >> +#include "pagecache_share.h" >>   #include >>   static int erofs_fill_symlink(struct inode *inode, void *kaddr, >> @@ -212,7 +213,9 @@ static int erofs_fill_inode(struct inode *inode) >>       switch (inode->i_mode & S_IFMT) { >>       case S_IFREG: >>           inode->i_op = &erofs_generic_iops; >> -        if (erofs_inode_is_data_compressed(vi->datalayout)) >> +        if (erofs_pcshr_fill_inode(inode) == 0) >> +            inode->i_fop = &erofs_pcshr_fops; >> +        else if (erofs_inode_is_data_compressed(vi->datalayout)) >>               inode->i_fop = &generic_ro_fops; >>           else >>               inode->i_fop = &erofs_file_fops; >> diff --git a/fs/erofs/pagecache_share.c b/fs/erofs/pagecache_share.c >> index 703fd17c002c..22172b5e21c7 100644 >> --- a/fs/erofs/pagecache_share.c >> +++ b/fs/erofs/pagecache_share.c >> @@ -22,6 +22,7 @@ struct erofs_pcshr_counter { >>   struct erofs_pcshr_private { >>       char fprt[PCSHR_FPRT_MAXLEN]; >> +    struct mutex mutex; >>   }; >>   static struct erofs_pcshr_counter mnt_counter = { >> @@ -84,6 +85,7 @@ static int erofs_fprt_set(struct inode *inode, void *data) >>       if (!ano_private) >>           return -ENOMEM; >>       memcpy(ano_private, data, sizeof(size_t) + *(size_t *)data); >> +    mutex_init(&ano_private->mutex); >>       inode->i_private = ano_private; >>       return 0; >>   } >> @@ -226,3 +228,64 @@ const struct file_operations erofs_pcshr_fops = { >>       .get_unmapped_area = thp_get_unmapped_area, >>       .splice_read    = filemap_splice_read, >>   }; >> + >> +int erofs_pcshr_read_begin(struct file *file, struct folio *folio) >> +{ >> +    struct erofs_inode *vi; >> +    struct erofs_pcshr_private *ano_private; >> + >> +    if (!(file && file->private_data)) >> +        return 0; >> + >> +    vi = file->private_data; >> +    if (vi->ano_inode != file_inode(file)) >> +        return 0; >> + >> +    ano_private = vi->ano_inode->i_private; >> +    mutex_lock(&ano_private->mutex); > Can we lock in folio granularity? The erofs_pcshr_private mutex may limit the concurrent in reading. I've asked Hongzhen to prepare a new reasonable version, in this version it shouldn't be such mutex to lock the whole submit process, but just keep all inodes stable. Please just ignore this whole series. Thanks, Gao Xiang