From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (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 4522B2E974D for ; Fri, 10 Jul 2026 03:06:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783652762; cv=none; b=sBHgQNFx6HqQq0e6oEJuuMNTn64SfplixW2iti5ruBVUaFmBLlbapULUdT8JsGhbl5TDoaDbgP2FKRlo2LdOTL4wsnKdPtWjbWfEjksXAviACustgfBXfPBpf1WmKh/hCFfXYnklFWfpZ4j2XCSMG5EHi4V6RIZRLsnqUb+s5ew= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783652762; c=relaxed/simple; bh=ciObyImh/0opQJWuR6tQloJZC+6eLupWwLLHZhKKOyM=; h=Message-ID:Date:MIME-Version:Cc:Subject:To:References:From: In-Reply-To:Content-Type; b=fKqksw54NPgn0Oeq/iN913kf5ZKHk+NWrTS8MAR5A+rbAaYdDrSwXzQNPpAKN2sjnsMXETWQzdS5MpRl2mdm1MEx6t20EPJ8FLhk0ToVURTZxCHn/8umhefATAskWQslAF7TkosA2tfC/Ar9qf4IMyQR8qM9Zs37P8ZTnVogWpU= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=K1bIFa+T; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="K1bIFa+T" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 65F151F000E9; Fri, 10 Jul 2026 03:05:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783652761; bh=pSv3vviw1eiycIejXFk1DvJls/TrCOQEjNqVjm41GKE=; h=Date:Cc:Subject:To:References:From:In-Reply-To; b=K1bIFa+TQjJzhlneOM15pQBcR7DuCQSUjwIZC52JZoJmz0/7nKVCKqTGFtB9nbrUA esqYWXhN7GCxFWyjYeuzLWHFjWD22VRm1t7JgpUr78m81mLekWLbzNO/sHG2qBDydE o2NJ6K++lohmnJgsvmouf7MvDB6SrIB5fTqhbtqW1KUxmSedfD7H2OssZdQn+kYoli SF9lYhTyM4zCC4A7Nug3P1p9n5t7iNZVk8qyPsjjgJsWVZDunhC2KVX2gGtudKsc6Y 8g+sjDuwi0rGMUfDk7ARZ1DqLSqk0LxGXhXluAaKo7y8TYxnKJuFpakuc+IOOPFVQh KK2zotYIwzUaw== Message-ID: Date: Fri, 10 Jul 2026 11:05:56 +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 Cc: chao@kernel.org, linux-f2fs-devel@lists.sourceforge.net, Barry Song , Juan Yescas , Dev Jain , linux-kernel@vger.kernel.org, David Hildenbrand , Bo Zhang , Kalesh Singh , Ryan Roberts , Jaegeuk Kim , Pengfei Li Subject: Re: [f2fs-dev] [RFC PATCH v2 01/10] f2fs: extend folio state for large folio write path To: Nanzhe Zhao References: <20260710011534.2307696-2-zhaonanzhe@xiaomi.com> Content-Language: en-US From: Chao Yu In-Reply-To: <20260710011534.2307696-2-zhaonanzhe@xiaomi.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit 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);\ > } >