diff mbox series

[RFC,v3,02/18] iomap: Add iomap_page_create_gfp to allocate iomap_pages

Message ID 20220518233709.1937634-3-shr@fb.com (mailing list archive)
State New, archived
Headers show
Series io-uring/xfs: support async buffered writes | expand

Commit Message

Stefan Roesch May 18, 2022, 11:36 p.m. UTC
Add the function iomap_page_create_gfp() to be able to specify gfp flags
and to pass in the number of blocks per folio in the function
iomap_page_create_gfp().

No intended functional changes in this patch.

Signed-off-by: Stefan Roesch <shr@fb.com>
---
 fs/iomap/buffered-io.c | 34 ++++++++++++++++++++++++++++------
 1 file changed, 28 insertions(+), 6 deletions(-)

Comments

Christoph Hellwig May 19, 2022, 8:18 a.m. UTC | #1
* This function returns a newly allocated iomap for the folio with the settings
> + * specified in the gfp parameter.
> + *
> + **/
>  static struct iomap_page *
> -iomap_page_create(struct inode *inode, struct folio *folio)
> +iomap_page_create_gfp(struct inode *inode, struct folio *folio,
> +		unsigned int nr_blocks, gfp_t gfp)
>  {
> -	struct iomap_page *iop = to_iomap_page(folio);
> -	unsigned int nr_blocks = i_blocks_per_folio(inode, folio);
> +	struct iomap_page *iop;
>  
> -	if (iop || nr_blocks <= 1)
> +	iop = kzalloc(struct_size(iop, uptodate, BITS_TO_LONGS(nr_blocks)), gfp);
> +	if (!iop)
>  		return iop;
>  
> -	iop = kzalloc(struct_size(iop, uptodate, BITS_TO_LONGS(nr_blocks)),
> -			GFP_NOFS | __GFP_NOFAIL);
>  	spin_lock_init(&iop->uptodate_lock);
>  	if (folio_test_uptodate(folio))
>  		bitmap_fill(iop->uptodate, nr_blocks);
> @@ -61,6 +71,18 @@ iomap_page_create(struct inode *inode, struct folio *folio)
>  	return iop;
>  }
>  
> +static struct iomap_page *
> +iomap_page_create(struct inode *inode, struct folio *folio)
> +{
> +	struct iomap_page *iop = to_iomap_page(folio);
> +	unsigned int nr_blocks = i_blocks_per_folio(inode, folio);
> +
> +	if (iop || nr_blocks <= 1)
> +		return iop;
> +
> +	return iomap_page_create_gfp(inode, folio, nr_blocks, GFP_NOFS | __GFP_NOFAIL);

Overly long line here.

Mor importantly why do you need a helper that does not do the number
of blocks check?  Why can't we just pass a gfp_t to iomap_page_create?
Stefan Roesch May 20, 2022, 6:25 p.m. UTC | #2
On 5/19/22 1:18 AM, Christoph Hellwig wrote:
>  * This function returns a newly allocated iomap for the folio with the settings
>> + * specified in the gfp parameter.
>> + *
>> + **/
>>  static struct iomap_page *
>> -iomap_page_create(struct inode *inode, struct folio *folio)
>> +iomap_page_create_gfp(struct inode *inode, struct folio *folio,
>> +		unsigned int nr_blocks, gfp_t gfp)
>>  {
>> -	struct iomap_page *iop = to_iomap_page(folio);
>> -	unsigned int nr_blocks = i_blocks_per_folio(inode, folio);
>> +	struct iomap_page *iop;
>>  
>> -	if (iop || nr_blocks <= 1)
>> +	iop = kzalloc(struct_size(iop, uptodate, BITS_TO_LONGS(nr_blocks)), gfp);
>> +	if (!iop)
>>  		return iop;
>>  
>> -	iop = kzalloc(struct_size(iop, uptodate, BITS_TO_LONGS(nr_blocks)),
>> -			GFP_NOFS | __GFP_NOFAIL);
>>  	spin_lock_init(&iop->uptodate_lock);
>>  	if (folio_test_uptodate(folio))
>>  		bitmap_fill(iop->uptodate, nr_blocks);
>> @@ -61,6 +71,18 @@ iomap_page_create(struct inode *inode, struct folio *folio)
>>  	return iop;
>>  }
>>  
>> +static struct iomap_page *
>> +iomap_page_create(struct inode *inode, struct folio *folio)
>> +{
>> +	struct iomap_page *iop = to_iomap_page(folio);
>> +	unsigned int nr_blocks = i_blocks_per_folio(inode, folio);
>> +
>> +	if (iop || nr_blocks <= 1)
>> +		return iop;
>> +
>> +	return iomap_page_create_gfp(inode, folio, nr_blocks, GFP_NOFS | __GFP_NOFAIL);
> 
> Overly long line here.
> 
> Mor importantly why do you need a helper that does not do the number
> of blocks check?  Why can't we just pass a gfp_t to iomap_page_create?


The next version removes iomap_page_create_gfp() and adds the gfp flag to
iomap_page_create.
diff mbox series

Patch

diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c
index 8ce8720093b9..85aa32f50db0 100644
--- a/fs/iomap/buffered-io.c
+++ b/fs/iomap/buffered-io.c
@@ -43,17 +43,27 @@  static inline struct iomap_page *to_iomap_page(struct folio *folio)
 
 static struct bio_set iomap_ioend_bioset;
 
+/**
+ * iomap_page_create_gfp : Create and initialize iomap_page for folio.
+ * @inode     : Pointer to inode
+ * @folio     : Pointer to folio
+ * @nr_blocks : Number of blocks in the folio
+ * @gfp       : gfp allocation flags
+ *
+ * This function returns a newly allocated iomap for the folio with the settings
+ * specified in the gfp parameter.
+ *
+ **/
 static struct iomap_page *
-iomap_page_create(struct inode *inode, struct folio *folio)
+iomap_page_create_gfp(struct inode *inode, struct folio *folio,
+		unsigned int nr_blocks, gfp_t gfp)
 {
-	struct iomap_page *iop = to_iomap_page(folio);
-	unsigned int nr_blocks = i_blocks_per_folio(inode, folio);
+	struct iomap_page *iop;
 
-	if (iop || nr_blocks <= 1)
+	iop = kzalloc(struct_size(iop, uptodate, BITS_TO_LONGS(nr_blocks)), gfp);
+	if (!iop)
 		return iop;
 
-	iop = kzalloc(struct_size(iop, uptodate, BITS_TO_LONGS(nr_blocks)),
-			GFP_NOFS | __GFP_NOFAIL);
 	spin_lock_init(&iop->uptodate_lock);
 	if (folio_test_uptodate(folio))
 		bitmap_fill(iop->uptodate, nr_blocks);
@@ -61,6 +71,18 @@  iomap_page_create(struct inode *inode, struct folio *folio)
 	return iop;
 }
 
+static struct iomap_page *
+iomap_page_create(struct inode *inode, struct folio *folio)
+{
+	struct iomap_page *iop = to_iomap_page(folio);
+	unsigned int nr_blocks = i_blocks_per_folio(inode, folio);
+
+	if (iop || nr_blocks <= 1)
+		return iop;
+
+	return iomap_page_create_gfp(inode, folio, nr_blocks, GFP_NOFS | __GFP_NOFAIL);
+}
+
 static void iomap_page_release(struct folio *folio)
 {
 	struct iomap_page *iop = folio_detach_private(folio);