Re: [f2fs-dev] [RFC PATCH v2 01/10] f2fs: extend folio state for large folio write path
Chao Yu via Linux-f2fs-devel <[email protected]>
| Newsgroups | net.sourceforge.lists.linux-f2fs-devel,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
On 7/10/26 09:15, Nanzhe Zhao wrote:
>> Seems there are redundant codes below, let's have a try to wrap them w/ a macro for cleanup?
>
> Got it, thanks!
> How about the following example implementation?
Good, please go ahead.
Thanks,
>
> static inline unsigned long f2fs_folio_get_private_flags(const struct folio *folio)
> {
> if (f2fs_folio_has_state(folio)) {
> struct f2fs_folio_state *ffs = folio->private;
>
> return ffs->private_flags;
> }
>
> return (unsigned long)folio->private;
> }
>
> static inline void f2fs_folio_set_private_flags(struct folio *folio,
> unsigned long flags)
> {
> if (f2fs_folio_has_state(folio)) {
> struct f2fs_folio_state *ffs = folio->private;
>
> ffs->private_flags |= flags;
> return;
> }
>
> if (!folio_test_private(folio))
> folio_attach_private(folio, (void *)flags);
> else
> folio->private = (void *)((unsigned long)folio->private | flags);
> }
>
> static inline void f2fs_folio_clear_private_flags(struct folio *folio,
> unsigned long flags)
> {
> unsigned long private;
>
> if (f2fs_folio_has_state(folio)) {
> struct f2fs_folio_state *ffs = folio->private;
>
> ffs->private_flags &= ~flags;
> return;
> }
>
> private = (unsigned long)folio->private;
> private &= ~flags;
> if (private == BIT(PAGE_PRIVATE_NOT_POINTER))
> folio_detach_private(folio);
> else
> folio->private = (void *)private;
> }
>
> #define PAGE_PRIVATE_GET_FUNC(name, flagname) \
> static inline bool folio_test_f2fs_##name(const struct folio *folio)\
> {\
> unsigned long priv = f2fs_folio_get_private_flags(folio);\
> unsigned long v = (1UL << PAGE_PRIVATE_NOT_POINTER) |\
> (1UL << PAGE_PRIVATE_##flagname);\
> return (priv & v) == v;\
> }\
> static inline bool page_private_##name(struct page *page)\
> {\
> return PagePrivate(page) &&\
> test_bit(PAGE_PRIVATE_NOT_POINTER, &page_private(page)) &&\
> test_bit(PAGE_PRIVATE_##flagname, &page_private(page));\
> }
>
> #define PAGE_PRIVATE_SET_FUNC(name, flagname) \
> static inline void folio_set_f2fs_##name(struct folio *folio)\
> {\
> unsigned long v = (1UL << PAGE_PRIVATE_NOT_POINTER) |\
> (1UL << PAGE_PRIVATE_##flagname);\
> f2fs_folio_set_private_flags(folio, v);\
> }\
> static inline void set_page_private_##name(struct page *page)\
> {\
> if (!PagePrivate(page))\
> attach_page_private(page, (void *)0);\
> set_bit(PAGE_PRIVATE_NOT_POINTER, &page_private(page));\
> set_bit(PAGE_PRIVATE_##flagname, &page_private(page));\
> }
>
> #define PAGE_PRIVATE_CLEAR_FUNC(name, flagname) \
> static inline void folio_clear_f2fs_##name(struct folio *folio)\
> {\
> f2fs_folio_clear_private_flags(folio,\
> 1UL << PAGE_PRIVATE_##flagname);\
> }\
> static inline void clear_page_private_##name(struct page *page)\
> {\
> clear_bit(PAGE_PRIVATE_##flagname, &page_private(page));\
> if (page_private(page) == BIT(PAGE_PRIVATE_NOT_POINTER))\
> detach_page_private(page);\
> }
>
_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel