All of lore.kernel.org
 help / color / mirror / Atom feed
* [f2fs-dev] [RFC PATCH] f2fs: compress: reduce one page array alloc and free when write compressed page
@ 2021-07-22  3:47 Fengnan Chang
  2021-07-22 13:53 ` Chao Yu
  0 siblings, 1 reply; 5+ messages in thread
From: Fengnan Chang @ 2021-07-22  3:47 UTC (permalink / raw)
  To: jaegeuk, chao, linux-f2fs-devel; +Cc: Fengnan Chang

Don't alloc new page array to replace old, just use old page array, try
to reduce one page array alloc and free when write compress page.

Signed-off-by: Fengnan Chang <changfengnan@vivo.com>
---
 fs/f2fs/compress.c | 14 ++------------
 fs/f2fs/f2fs.h     |  1 +
 2 files changed, 3 insertions(+), 12 deletions(-)

diff --git a/fs/f2fs/compress.c b/fs/f2fs/compress.c
index 455561826c7d..43daafe382e7 100644
--- a/fs/f2fs/compress.c
+++ b/fs/f2fs/compress.c
@@ -618,7 +618,6 @@ static int f2fs_compress_pages(struct compress_ctx *cc)
 	const struct f2fs_compress_ops *cops =
 				f2fs_cops[fi->i_compress_algorithm];
 	unsigned int max_len, new_nr_cpages;
-	struct page **new_cpages;
 	u32 chksum = 0;
 	int i, ret;
 
@@ -633,6 +632,7 @@ static int f2fs_compress_pages(struct compress_ctx *cc)
 
 	max_len = COMPRESS_HEADER_SIZE + cc->clen;
 	cc->nr_cpages = DIV_ROUND_UP(max_len, PAGE_SIZE);
+	cc->raw_nr_cpages = cc->nr_cpages;
 
 	cc->cpages = page_array_alloc(cc->inode, cc->nr_cpages);
 	if (!cc->cpages) {
@@ -683,13 +683,6 @@ static int f2fs_compress_pages(struct compress_ctx *cc)
 
 	new_nr_cpages = DIV_ROUND_UP(cc->clen + COMPRESS_HEADER_SIZE, PAGE_SIZE);
 
-	/* Now we're going to cut unnecessary tail pages */
-	new_cpages = page_array_alloc(cc->inode, new_nr_cpages);
-	if (!new_cpages) {
-		ret = -ENOMEM;
-		goto out_vunmap_cbuf;
-	}
-
 	/* zero out any unused part of the last page */
 	memset(&cc->cbuf->cdata[cc->clen], 0,
 			(new_nr_cpages * PAGE_SIZE) -
@@ -700,7 +693,6 @@ static int f2fs_compress_pages(struct compress_ctx *cc)
 
 	for (i = 0; i < cc->nr_cpages; i++) {
 		if (i < new_nr_cpages) {
-			new_cpages[i] = cc->cpages[i];
 			continue;
 		}
 		f2fs_compress_free_page(cc->cpages[i]);
@@ -710,8 +702,6 @@ static int f2fs_compress_pages(struct compress_ctx *cc)
 	if (cops->destroy_compress_ctx)
 		cops->destroy_compress_ctx(cc);
 
-	page_array_free(cc->inode, cc->cpages, cc->nr_cpages);
-	cc->cpages = new_cpages;
 	cc->nr_cpages = new_nr_cpages;
 
 	trace_f2fs_compress_pages_end(cc->inode, cc->cluster_idx,
@@ -1330,7 +1320,7 @@ static int f2fs_write_compressed_pages(struct compress_ctx *cc,
 	spin_unlock(&fi->i_size_lock);
 
 	f2fs_put_rpages(cc);
-	page_array_free(cc->inode, cc->cpages, cc->nr_cpages);
+	page_array_free(cc->inode, cc->cpages, cc->raw_nr_cpages);
 	cc->cpages = NULL;
 	f2fs_destroy_compress_ctx(cc, false);
 	return 0;
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index 867f2c5d9559..8b1f84d88a65 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -1454,6 +1454,7 @@ struct compress_ctx {
 	unsigned int nr_rpages;		/* total page number in rpages */
 	struct page **cpages;		/* pages store compressed data in cluster */
 	unsigned int nr_cpages;		/* total page number in cpages */
+	unsigned int raw_nr_cpages;	/* max total page number in cpages */
 	void *rbuf;			/* virtual mapped address on rpages */
 	struct compress_data *cbuf;	/* virtual mapped address on cpages */
 	size_t rlen;			/* valid data length in rbuf */
-- 
2.29.0



_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [f2fs-dev] [RFC PATCH] f2fs: compress: reduce one page array alloc and free when write compressed page
  2021-07-22  3:47 [f2fs-dev] [RFC PATCH] f2fs: compress: reduce one page array alloc and free when write compressed page Fengnan Chang
@ 2021-07-22 13:53 ` Chao Yu
  2021-07-23  3:52   ` Fengnan Chang
  0 siblings, 1 reply; 5+ messages in thread
From: Chao Yu @ 2021-07-22 13:53 UTC (permalink / raw)
  To: Fengnan Chang, jaegeuk, linux-f2fs-devel

On 2021/7/22 11:47, Fengnan Chang wrote:
> Don't alloc new page array to replace old, just use old page array, try
> to reduce one page array alloc and free when write compress page.

Nope, see whole story in below link:

https://lore.kernel.org/patchwork/patch/1305096/

Thanks,

> 
> Signed-off-by: Fengnan Chang <changfengnan@vivo.com>
> ---
>   fs/f2fs/compress.c | 14 ++------------
>   fs/f2fs/f2fs.h     |  1 +
>   2 files changed, 3 insertions(+), 12 deletions(-)
> 
> diff --git a/fs/f2fs/compress.c b/fs/f2fs/compress.c
> index 455561826c7d..43daafe382e7 100644
> --- a/fs/f2fs/compress.c
> +++ b/fs/f2fs/compress.c
> @@ -618,7 +618,6 @@ static int f2fs_compress_pages(struct compress_ctx *cc)
>   	const struct f2fs_compress_ops *cops =
>   				f2fs_cops[fi->i_compress_algorithm];
>   	unsigned int max_len, new_nr_cpages;
> -	struct page **new_cpages;
>   	u32 chksum = 0;
>   	int i, ret;
>   
> @@ -633,6 +632,7 @@ static int f2fs_compress_pages(struct compress_ctx *cc)
>   
>   	max_len = COMPRESS_HEADER_SIZE + cc->clen;
>   	cc->nr_cpages = DIV_ROUND_UP(max_len, PAGE_SIZE);
> +	cc->raw_nr_cpages = cc->nr_cpages;
>   
>   	cc->cpages = page_array_alloc(cc->inode, cc->nr_cpages);
>   	if (!cc->cpages) {
> @@ -683,13 +683,6 @@ static int f2fs_compress_pages(struct compress_ctx *cc)
>   
>   	new_nr_cpages = DIV_ROUND_UP(cc->clen + COMPRESS_HEADER_SIZE, PAGE_SIZE);
>   
> -	/* Now we're going to cut unnecessary tail pages */
> -	new_cpages = page_array_alloc(cc->inode, new_nr_cpages);
> -	if (!new_cpages) {
> -		ret = -ENOMEM;
> -		goto out_vunmap_cbuf;
> -	}
> -
>   	/* zero out any unused part of the last page */
>   	memset(&cc->cbuf->cdata[cc->clen], 0,
>   			(new_nr_cpages * PAGE_SIZE) -
> @@ -700,7 +693,6 @@ static int f2fs_compress_pages(struct compress_ctx *cc)
>   
>   	for (i = 0; i < cc->nr_cpages; i++) {
>   		if (i < new_nr_cpages) {
> -			new_cpages[i] = cc->cpages[i];
>   			continue;
>   		}
>   		f2fs_compress_free_page(cc->cpages[i]);
> @@ -710,8 +702,6 @@ static int f2fs_compress_pages(struct compress_ctx *cc)
>   	if (cops->destroy_compress_ctx)
>   		cops->destroy_compress_ctx(cc);
>   
> -	page_array_free(cc->inode, cc->cpages, cc->nr_cpages);
> -	cc->cpages = new_cpages;
>   	cc->nr_cpages = new_nr_cpages;
>   
>   	trace_f2fs_compress_pages_end(cc->inode, cc->cluster_idx,
> @@ -1330,7 +1320,7 @@ static int f2fs_write_compressed_pages(struct compress_ctx *cc,
>   	spin_unlock(&fi->i_size_lock);
>   
>   	f2fs_put_rpages(cc);
> -	page_array_free(cc->inode, cc->cpages, cc->nr_cpages);
> +	page_array_free(cc->inode, cc->cpages, cc->raw_nr_cpages);
>   	cc->cpages = NULL;
>   	f2fs_destroy_compress_ctx(cc, false);
>   	return 0;
> diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
> index 867f2c5d9559..8b1f84d88a65 100644
> --- a/fs/f2fs/f2fs.h
> +++ b/fs/f2fs/f2fs.h
> @@ -1454,6 +1454,7 @@ struct compress_ctx {
>   	unsigned int nr_rpages;		/* total page number in rpages */
>   	struct page **cpages;		/* pages store compressed data in cluster */
>   	unsigned int nr_cpages;		/* total page number in cpages */
> +	unsigned int raw_nr_cpages;	/* max total page number in cpages */
>   	void *rbuf;			/* virtual mapped address on rpages */
>   	struct compress_data *cbuf;	/* virtual mapped address on cpages */
>   	size_t rlen;			/* valid data length in rbuf */
> 


_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [f2fs-dev] [RFC PATCH] f2fs: compress: reduce one page array alloc and free when write compressed page
  2021-07-22 13:53 ` Chao Yu
@ 2021-07-23  3:52   ` Fengnan Chang
  2021-07-23  5:26     ` Chao Yu
  0 siblings, 1 reply; 5+ messages in thread
From: Fengnan Chang @ 2021-07-23  3:52 UTC (permalink / raw)
  To: Chao Yu, jaegeuk, linux-f2fs-devel

Sorry, I didn't get your point, in my opinion, new_nr_cpages should 
always little than nr_cpages, is this right? So we can just use cpages, 
don't need to alloc new one.

Thanks.


On 2021/7/22 21:53, Chao Yu wrote:
> On 2021/7/22 11:47, Fengnan Chang wrote:
>> Don't alloc new page array to replace old, just use old page array, try
>> to reduce one page array alloc and free when write compress page.
> 
> Nope, see whole story in below link:
> 
> https://lore.kernel.org/patchwork/patch/1305096/
> 
> Thanks,
> 
>>
>> Signed-off-by: Fengnan Chang <changfengnan@vivo.com>
>> ---
>>   fs/f2fs/compress.c | 14 ++------------
>>   fs/f2fs/f2fs.h     |  1 +
>>   2 files changed, 3 insertions(+), 12 deletions(-)
>>
>> diff --git a/fs/f2fs/compress.c b/fs/f2fs/compress.c
>> index 455561826c7d..43daafe382e7 100644
>> --- a/fs/f2fs/compress.c
>> +++ b/fs/f2fs/compress.c
>> @@ -618,7 +618,6 @@ static int f2fs_compress_pages(struct compress_ctx 
>> *cc)
>>       const struct f2fs_compress_ops *cops =
>>                   f2fs_cops[fi->i_compress_algorithm];
>>       unsigned int max_len, new_nr_cpages;
>> -    struct page **new_cpages;
>>       u32 chksum = 0;
>>       int i, ret;
>> @@ -633,6 +632,7 @@ static int f2fs_compress_pages(struct compress_ctx 
>> *cc)
>>       max_len = COMPRESS_HEADER_SIZE + cc->clen;
>>       cc->nr_cpages = DIV_ROUND_UP(max_len, PAGE_SIZE);
>> +    cc->raw_nr_cpages = cc->nr_cpages;
>>       cc->cpages = page_array_alloc(cc->inode, cc->nr_cpages);
>>       if (!cc->cpages) {
>> @@ -683,13 +683,6 @@ static int f2fs_compress_pages(struct 
>> compress_ctx *cc)
>>       new_nr_cpages = DIV_ROUND_UP(cc->clen + COMPRESS_HEADER_SIZE, 
>> PAGE_SIZE);
>> -    /* Now we're going to cut unnecessary tail pages */
>> -    new_cpages = page_array_alloc(cc->inode, new_nr_cpages);
>> -    if (!new_cpages) {
>> -        ret = -ENOMEM;
>> -        goto out_vunmap_cbuf;
>> -    }
>> -
>>       /* zero out any unused part of the last page */
>>       memset(&cc->cbuf->cdata[cc->clen], 0,
>>               (new_nr_cpages * PAGE_SIZE) -
>> @@ -700,7 +693,6 @@ static int f2fs_compress_pages(struct compress_ctx 
>> *cc)
>>       for (i = 0; i < cc->nr_cpages; i++) {
>>           if (i < new_nr_cpages) {
>> -            new_cpages[i] = cc->cpages[i];
>>               continue;
>>           }
>>           f2fs_compress_free_page(cc->cpages[i]);
>> @@ -710,8 +702,6 @@ static int f2fs_compress_pages(struct compress_ctx 
>> *cc)
>>       if (cops->destroy_compress_ctx)
>>           cops->destroy_compress_ctx(cc);
>> -    page_array_free(cc->inode, cc->cpages, cc->nr_cpages);
>> -    cc->cpages = new_cpages;
>>       cc->nr_cpages = new_nr_cpages;
>>       trace_f2fs_compress_pages_end(cc->inode, cc->cluster_idx,
>> @@ -1330,7 +1320,7 @@ static int f2fs_write_compressed_pages(struct 
>> compress_ctx *cc,
>>       spin_unlock(&fi->i_size_lock);
>>       f2fs_put_rpages(cc);
>> -    page_array_free(cc->inode, cc->cpages, cc->nr_cpages);
>> +    page_array_free(cc->inode, cc->cpages, cc->raw_nr_cpages);
>>       cc->cpages = NULL;
>>       f2fs_destroy_compress_ctx(cc, false);
>>       return 0;
>> diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
>> index 867f2c5d9559..8b1f84d88a65 100644
>> --- a/fs/f2fs/f2fs.h
>> +++ b/fs/f2fs/f2fs.h
>> @@ -1454,6 +1454,7 @@ struct compress_ctx {
>>       unsigned int nr_rpages;        /* total page number in rpages */
>>       struct page **cpages;        /* pages store compressed data in 
>> cluster */
>>       unsigned int nr_cpages;        /* total page number in cpages */
>> +    unsigned int raw_nr_cpages;    /* max total page number in cpages */
>>       void *rbuf;            /* virtual mapped address on rpages */
>>       struct compress_data *cbuf;    /* virtual mapped address on 
>> cpages */
>>       size_t rlen;            /* valid data length in rbuf */
>>
> 


_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [f2fs-dev] [RFC PATCH] f2fs: compress: reduce one page array alloc and free when write compressed page
  2021-07-23  3:52   ` Fengnan Chang
@ 2021-07-23  5:26     ` Chao Yu
  2021-07-23  8:20       ` Fengnan Chang
  0 siblings, 1 reply; 5+ messages in thread
From: Chao Yu @ 2021-07-23  5:26 UTC (permalink / raw)
  To: Fengnan Chang, jaegeuk, linux-f2fs-devel

On 2021/7/23 11:52, Fengnan Chang wrote:
> Sorry, I didn't get your point, in my opinion, new_nr_cpages should
> always little than nr_cpages, is this right? So we can just use cpages,
> don't need to alloc new one.
> 
> Thanks.
> 
> 
> On 2021/7/22 21:53, Chao Yu wrote:
>> On 2021/7/22 11:47, Fengnan Chang wrote:
>>> Don't alloc new page array to replace old, just use old page array, try
>>> to reduce one page array alloc and free when write compress page.
>>
>> Nope, see whole story in below link:
>>
>> https://lore.kernel.org/patchwork/patch/1305096/
>>
>> Thanks,
>>
>>>
>>> Signed-off-by: Fengnan Chang <changfengnan@vivo.com>
>>> ---
>>>    fs/f2fs/compress.c | 14 ++------------
>>>    fs/f2fs/f2fs.h     |  1 +
>>>    2 files changed, 3 insertions(+), 12 deletions(-)
>>>
>>> diff --git a/fs/f2fs/compress.c b/fs/f2fs/compress.c
>>> index 455561826c7d..43daafe382e7 100644
>>> --- a/fs/f2fs/compress.c
>>> +++ b/fs/f2fs/compress.c
>>> @@ -618,7 +618,6 @@ static int f2fs_compress_pages(struct compress_ctx
>>> *cc)
>>>        const struct f2fs_compress_ops *cops =
>>>                    f2fs_cops[fi->i_compress_algorithm];
>>>        unsigned int max_len, new_nr_cpages;
>>> -    struct page **new_cpages;
>>>        u32 chksum = 0;
>>>        int i, ret;
>>> @@ -633,6 +632,7 @@ static int f2fs_compress_pages(struct compress_ctx
>>> *cc)
>>>        max_len = COMPRESS_HEADER_SIZE + cc->clen;
>>>        cc->nr_cpages = DIV_ROUND_UP(max_len, PAGE_SIZE);
>>> +    cc->raw_nr_cpages = cc->nr_cpages;

If raw_nr_cpags is used to store original nr_cpages, we need to call
page_array_free(, cc->cpages, cc->raw_nr_cpages) in all places, can you
please check whether this are any missed cases?

Thanks,

>>>        cc->cpages = page_array_alloc(cc->inode, cc->nr_cpages);
>>>        if (!cc->cpages) {
>>> @@ -683,13 +683,6 @@ static int f2fs_compress_pages(struct
>>> compress_ctx *cc)
>>>        new_nr_cpages = DIV_ROUND_UP(cc->clen + COMPRESS_HEADER_SIZE,
>>> PAGE_SIZE);
>>> -    /* Now we're going to cut unnecessary tail pages */
>>> -    new_cpages = page_array_alloc(cc->inode, new_nr_cpages);
>>> -    if (!new_cpages) {
>>> -        ret = -ENOMEM;
>>> -        goto out_vunmap_cbuf;
>>> -    }
>>> -
>>>        /* zero out any unused part of the last page */
>>>        memset(&cc->cbuf->cdata[cc->clen], 0,
>>>                (new_nr_cpages * PAGE_SIZE) -
>>> @@ -700,7 +693,6 @@ static int f2fs_compress_pages(struct compress_ctx
>>> *cc)
>>>        for (i = 0; i < cc->nr_cpages; i++) {
>>>            if (i < new_nr_cpages) {
>>> -            new_cpages[i] = cc->cpages[i];
>>>                continue;
>>>            }
>>>            f2fs_compress_free_page(cc->cpages[i]);
>>> @@ -710,8 +702,6 @@ static int f2fs_compress_pages(struct compress_ctx
>>> *cc)
>>>        if (cops->destroy_compress_ctx)
>>>            cops->destroy_compress_ctx(cc);
>>> -    page_array_free(cc->inode, cc->cpages, cc->nr_cpages);
>>> -    cc->cpages = new_cpages;
>>>        cc->nr_cpages = new_nr_cpages;
>>>        trace_f2fs_compress_pages_end(cc->inode, cc->cluster_idx,
>>> @@ -1330,7 +1320,7 @@ static int f2fs_write_compressed_pages(struct
>>> compress_ctx *cc,
>>>        spin_unlock(&fi->i_size_lock);
>>>        f2fs_put_rpages(cc);
>>> -    page_array_free(cc->inode, cc->cpages, cc->nr_cpages);
>>> +    page_array_free(cc->inode, cc->cpages, cc->raw_nr_cpages);
>>>        cc->cpages = NULL;
>>>        f2fs_destroy_compress_ctx(cc, false);
>>>        return 0;
>>> diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
>>> index 867f2c5d9559..8b1f84d88a65 100644
>>> --- a/fs/f2fs/f2fs.h
>>> +++ b/fs/f2fs/f2fs.h
>>> @@ -1454,6 +1454,7 @@ struct compress_ctx {
>>>        unsigned int nr_rpages;        /* total page number in rpages */
>>>        struct page **cpages;        /* pages store compressed data in
>>> cluster */
>>>        unsigned int nr_cpages;        /* total page number in cpages */
>>> +    unsigned int raw_nr_cpages;    /* max total page number in cpages */
>>>        void *rbuf;            /* virtual mapped address on rpages */
>>>        struct compress_data *cbuf;    /* virtual mapped address on
>>> cpages */
>>>        size_t rlen;            /* valid data length in rbuf */
>>>
>>


_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [f2fs-dev] [RFC PATCH] f2fs: compress: reduce one page array alloc and free when write compressed page
  2021-07-23  5:26     ` Chao Yu
@ 2021-07-23  8:20       ` Fengnan Chang
  0 siblings, 0 replies; 5+ messages in thread
From: Fengnan Chang @ 2021-07-23  8:20 UTC (permalink / raw)
  To: Chao Yu, jaegeuk, linux-f2fs-devel

ok, it seems there is one place was missed.

Thanks.


On 2021/7/23 13:26, Chao Yu wrote:
> On 2021/7/23 11:52, Fengnan Chang wrote:
>> Sorry, I didn't get your point, in my opinion, new_nr_cpages should
>> always little than nr_cpages, is this right? So we can just use cpages,
>> don't need to alloc new one.
>>
>> Thanks.
>>
>>
>> On 2021/7/22 21:53, Chao Yu wrote:
>>> On 2021/7/22 11:47, Fengnan Chang wrote:
>>>> Don't alloc new page array to replace old, just use old page array, try
>>>> to reduce one page array alloc and free when write compress page.
>>>
>>> Nope, see whole story in below link:
>>>
>>> https://lore.kernel.org/patchwork/patch/1305096/
>>>
>>> Thanks,
>>>
>>>>
>>>> Signed-off-by: Fengnan Chang <changfengnan@vivo.com>
>>>> ---
>>>>    fs/f2fs/compress.c | 14 ++------------
>>>>    fs/f2fs/f2fs.h     |  1 +
>>>>    2 files changed, 3 insertions(+), 12 deletions(-)
>>>>
>>>> diff --git a/fs/f2fs/compress.c b/fs/f2fs/compress.c
>>>> index 455561826c7d..43daafe382e7 100644
>>>> --- a/fs/f2fs/compress.c
>>>> +++ b/fs/f2fs/compress.c
>>>> @@ -618,7 +618,6 @@ static int f2fs_compress_pages(struct compress_ctx
>>>> *cc)
>>>>        const struct f2fs_compress_ops *cops =
>>>>                    f2fs_cops[fi->i_compress_algorithm];
>>>>        unsigned int max_len, new_nr_cpages;
>>>> -    struct page **new_cpages;
>>>>        u32 chksum = 0;
>>>>        int i, ret;
>>>> @@ -633,6 +632,7 @@ static int f2fs_compress_pages(struct compress_ctx
>>>> *cc)
>>>>        max_len = COMPRESS_HEADER_SIZE + cc->clen;
>>>>        cc->nr_cpages = DIV_ROUND_UP(max_len, PAGE_SIZE);
>>>> +    cc->raw_nr_cpages = cc->nr_cpages;
> 
> If raw_nr_cpags is used to store original nr_cpages, we need to call
> page_array_free(, cc->cpages, cc->raw_nr_cpages) in all places, can you
> please check whether this are any missed cases?
> 
> Thanks,
> 
>>>>        cc->cpages = page_array_alloc(cc->inode, cc->nr_cpages);
>>>>        if (!cc->cpages) {
>>>> @@ -683,13 +683,6 @@ static int f2fs_compress_pages(struct
>>>> compress_ctx *cc)
>>>>        new_nr_cpages = DIV_ROUND_UP(cc->clen + COMPRESS_HEADER_SIZE,
>>>> PAGE_SIZE);
>>>> -    /* Now we're going to cut unnecessary tail pages */
>>>> -    new_cpages = page_array_alloc(cc->inode, new_nr_cpages);
>>>> -    if (!new_cpages) {
>>>> -        ret = -ENOMEM;
>>>> -        goto out_vunmap_cbuf;
>>>> -    }
>>>> -
>>>>        /* zero out any unused part of the last page */
>>>>        memset(&cc->cbuf->cdata[cc->clen], 0,
>>>>                (new_nr_cpages * PAGE_SIZE) -
>>>> @@ -700,7 +693,6 @@ static int f2fs_compress_pages(struct compress_ctx
>>>> *cc)
>>>>        for (i = 0; i < cc->nr_cpages; i++) {
>>>>            if (i < new_nr_cpages) {
>>>> -            new_cpages[i] = cc->cpages[i];
>>>>                continue;
>>>>            }
>>>>            f2fs_compress_free_page(cc->cpages[i]);
>>>> @@ -710,8 +702,6 @@ static int f2fs_compress_pages(struct compress_ctx
>>>> *cc)
>>>>        if (cops->destroy_compress_ctx)
>>>>            cops->destroy_compress_ctx(cc);
>>>> -    page_array_free(cc->inode, cc->cpages, cc->nr_cpages);
>>>> -    cc->cpages = new_cpages;
>>>>        cc->nr_cpages = new_nr_cpages;
>>>>        trace_f2fs_compress_pages_end(cc->inode, cc->cluster_idx,
>>>> @@ -1330,7 +1320,7 @@ static int f2fs_write_compressed_pages(struct
>>>> compress_ctx *cc,
>>>>        spin_unlock(&fi->i_size_lock);
>>>>        f2fs_put_rpages(cc);
>>>> -    page_array_free(cc->inode, cc->cpages, cc->nr_cpages);
>>>> +    page_array_free(cc->inode, cc->cpages, cc->raw_nr_cpages);
>>>>        cc->cpages = NULL;
>>>>        f2fs_destroy_compress_ctx(cc, false);
>>>>        return 0;
>>>> diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
>>>> index 867f2c5d9559..8b1f84d88a65 100644
>>>> --- a/fs/f2fs/f2fs.h
>>>> +++ b/fs/f2fs/f2fs.h
>>>> @@ -1454,6 +1454,7 @@ struct compress_ctx {
>>>>        unsigned int nr_rpages;        /* total page number in rpages */
>>>>        struct page **cpages;        /* pages store compressed data in
>>>> cluster */
>>>>        unsigned int nr_cpages;        /* total page number in cpages */
>>>> +    unsigned int raw_nr_cpages;    /* max total page number in 
>>>> cpages */
>>>>        void *rbuf;            /* virtual mapped address on rpages */
>>>>        struct compress_data *cbuf;    /* virtual mapped address on
>>>> cpages */
>>>>        size_t rlen;            /* valid data length in rbuf */
>>>>
>>>
> 


_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2021-07-23  8:25 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-07-22  3:47 [f2fs-dev] [RFC PATCH] f2fs: compress: reduce one page array alloc and free when write compressed page Fengnan Chang
2021-07-22 13:53 ` Chao Yu
2021-07-23  3:52   ` Fengnan Chang
2021-07-23  5:26     ` Chao Yu
2021-07-23  8:20       ` Fengnan Chang

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.