> -----Original Message-----
> From: [email protected] <[email protected]> On Behalf Of Chao
> Yu
> Sent: Thursday, November 25, 2021 11:15 PM
> To: 常凤楠 <[email protected]>; [email protected]
> Cc: [email protected]
> Subject: Re: [PATCH 2/2] f2fs: support POSIX_FADV_DONTNEED drop
> compressed page cache
> 
> On 2021/11/24 16:39, Fengnan Chang wrote:
> > Previously, compressed page cache drop when clean page cache, but
> > POSIX_FADV_DONTNEED can't clean compressed page cache, this commit try
> > to support it.
> >
> > Signed-off-by: Fengnan Chang <[email protected]>
> > ---
> >   fs/f2fs/compress.c | 10 ++++++++--
> >   fs/f2fs/f2fs.h     |  7 ++++---
> >   2 files changed, 12 insertions(+), 5 deletions(-)
> >
> > diff --git a/fs/f2fs/compress.c b/fs/f2fs/compress.c index
> > fb9e5149af5d..7ec5e3c2590b 100644
> > --- a/fs/f2fs/compress.c
> > +++ b/fs/f2fs/compress.c
> > @@ -842,7 +842,7 @@ void f2fs_end_read_compressed_page(struct page
> *page, bool failed,
> >             WRITE_ONCE(dic->failed, true);
> >     else if (blkaddr)
> >             f2fs_cache_compressed_page(sbi, page,
> > -                                   dic->inode->i_ino, blkaddr);
> > +                                   dic, blkaddr);
> >
> >     if (atomic_dec_and_test(&dic->remaining_pages))
> >             f2fs_decompress_cluster(dic);
> > @@ -1659,6 +1659,7 @@ static void f2fs_put_dic(struct decompress_io_ctx
> *dic)
> >   static void __f2fs_decompress_end_io(struct decompress_io_ctx *dic, bool
> failed)
> >   {
> >     int i;
> > +   nid_t ino = dic->inode->i_ino;
> >
> >     for (i = 0; i < dic->cluster_size; i++) {
> >             struct page *rpage = dic->rpages[i]; @@ -1666,6 +1667,9 @@
> static
> > void __f2fs_decompress_end_io(struct decompress_io_ctx *dic, bool failed)
> >             if (!rpage)
> >                     continue;
> >
> > +           if (dic->cpage_cached)
> > +                   set_page_private_data(rpage, ino);
> 
> I didn't get the point, why should we set ino into raw page's private field?
Yes, because raw page will add into page cache, and 
POSIX_FADV_DONTNEED:
invalidate_mapping_pagevec
  ->__invalidate_mapping_pages
    ->invalidate_inode_page
      ->invalidate_complete_page  // call try_to_release_page when page has 
private data

So, if raw page don't have private data, it will not call 
f2fs_invalidate_compress_pages.
This commit try use private data to connect raw page which compressed page has 
been cached.
 
> 
> Thanks,
> 
> > +
> >             /* PG_error was set if verity failed. */
> >             if (failed || PageError(rpage)) {
> >                     ClearPageUptodate(rpage);
> > @@ -1772,10 +1776,11 @@ void f2fs_invalidate_compress_page(struct
> f2fs_sb_info *sbi, block_t blkaddr)
> >   }
> >
> >   void f2fs_cache_compressed_page(struct f2fs_sb_info *sbi, struct page
> *page,
> > -                                           nid_t ino, block_t blkaddr)
> > +                           struct decompress_io_ctx *dic, block_t blkaddr)
> >   {
> >     struct page *cpage;
> >     int ret;
> > +   nid_t ino = dic->inode->i_ino;
> >
> >     if (!test_opt(sbi, COMPRESS_CACHE))
> >             return;
> > @@ -1804,6 +1809,7 @@ void f2fs_cache_compressed_page(struct
> f2fs_sb_info *sbi, struct page *page,
> >     }
> >
> >     set_page_private_data(cpage, ino);
> > +   dic->cpage_cached = true;
> >
> >     if (!f2fs_is_valid_blkaddr(sbi, blkaddr,
> DATA_GENERIC_ENHANCE_READ))
> >             goto out;
> > diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index
> > ac6dda6c4c5a..128190b0c737 100644
> > --- a/fs/f2fs/f2fs.h
> > +++ b/fs/f2fs/f2fs.h
> > @@ -1551,6 +1551,7 @@ struct decompress_io_ctx {
> >      */
> >     refcount_t refcnt;
> >
> > +   bool cpage_cached;              /* indicate cpages cached in compress
> mapping*/
> >     bool failed;                    /* IO error occurred before 
> > decompression?
> */
> >     bool need_verity;               /* need fs-verity verification after
> decompression? */
> >     void *private;                  /* payload buffer for specified
> decompression algorithm */
> > @@ -4085,7 +4086,7 @@ void f2fs_destroy_compress_cache(void);
> >   struct address_space *COMPRESS_MAPPING(struct f2fs_sb_info *sbi);
> >   void f2fs_invalidate_compress_page(struct f2fs_sb_info *sbi, block_t
> blkaddr);
> >   void f2fs_cache_compressed_page(struct f2fs_sb_info *sbi, struct page
> *page,
> > -                                           nid_t ino, block_t blkaddr);
> > +                           struct decompress_io_ctx *dic, block_t blkaddr);
> >   bool f2fs_load_compressed_page(struct f2fs_sb_info *sbi, struct page
> *page,
> >                                                             block_t 
> > blkaddr);
> >   void f2fs_invalidate_compress_pages(struct f2fs_sb_info *sbi, nid_t
> > ino); @@ -4137,8 +4138,8 @@ static inline int __init
> f2fs_init_compress_cache(void) { return 0; }
> >   static inline void f2fs_destroy_compress_cache(void) { }
> >   static inline void f2fs_invalidate_compress_page(struct f2fs_sb_info *sbi,
> >                             block_t blkaddr) { }
> > -static inline void f2fs_cache_compressed_page(struct f2fs_sb_info *sbi,
> > -                           struct page *page, nid_t ino, block_t blkaddr) 
> > { }
> > +static inline void f2fs_cache_compressed_page(struct f2fs_sb_info *sbi,
> struct page *page,
> > +                           struct decompress_io_ctx *dic, block_t blkaddr) 
> > { }
> >   static inline bool f2fs_load_compressed_page(struct f2fs_sb_info *sbi,
> >                             struct page *page, block_t blkaddr) { return 
> > false; }
> >   static inline void f2fs_invalidate_compress_pages(struct
> > f2fs_sb_info *sbi,
> >

_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to