* Re: [PATCH v2] erofs: do not use pagepool in z_erofs_gbuf_growsize()
2024-04-02 9:27 [PATCH v2] erofs: do not use pagepool in z_erofs_gbuf_growsize() Chunhai Guo via Linux-erofs
@ 2024-04-02 9:22 ` Gao Xiang
2024-04-02 9:25 ` Chunhai Guo via Linux-erofs
0 siblings, 1 reply; 3+ messages in thread
From: Gao Xiang @ 2024-04-02 9:22 UTC (permalink / raw)
To: Chunhai Guo, xiang; +Cc: linux-erofs, huyue2
On 2024/4/2 17:27, Chunhai Guo wrote:
> Let's use alloc_pages_bulk_array() for simplicity and get rid of
> unnecessary pagepool.
>
> Signed-off-by: Chunhai Guo <guochunhai@vivo.com>
> ---
Would you mind adding a changelog here next time? no
matter how short the text is.
Reviewed-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Thanks,
Gao Xiang
> fs/erofs/zutil.c | 67 ++++++++++++++++++++++--------------------------
> 1 file changed, 31 insertions(+), 36 deletions(-)
>
> diff --git a/fs/erofs/zutil.c b/fs/erofs/zutil.c
> index e13806681763..9687cad8be96 100644
> --- a/fs/erofs/zutil.c
> +++ b/fs/erofs/zutil.c
> @@ -60,63 +60,58 @@ void z_erofs_put_gbuf(void *ptr) __releases(gbuf->lock)
> int z_erofs_gbuf_growsize(unsigned int nrpages)
> {
> static DEFINE_MUTEX(gbuf_resize_mutex);
> - struct page *pagepool = NULL;
> - int delta, ret, i, j;
> + struct page **tmp_pages = NULL;
> + struct z_erofs_gbuf *gbuf;
> + void *ptr, *old_ptr;
> + int last, i, j;
>
> mutex_lock(&gbuf_resize_mutex);
> - delta = nrpages - z_erofs_gbuf_nrpages;
> - ret = 0;
> /* avoid shrinking gbufs, since no idea how many fses rely on */
> - if (delta <= 0)
> - goto out;
> + if (nrpages <= z_erofs_gbuf_nrpages) {
> + mutex_unlock(&gbuf_resize_mutex);
> + return 0;
> + }
>
> for (i = 0; i < z_erofs_gbuf_count; ++i) {
> - struct z_erofs_gbuf *gbuf = &z_erofs_gbufpool[i];
> - struct page **pages, **tmp_pages;
> - void *ptr, *old_ptr = NULL;
> -
> - ret = -ENOMEM;
> + gbuf = &z_erofs_gbufpool[i];
> tmp_pages = kcalloc(nrpages, sizeof(*tmp_pages), GFP_KERNEL);
> if (!tmp_pages)
> - break;
> - for (j = 0; j < nrpages; ++j) {
> - tmp_pages[j] = erofs_allocpage(&pagepool, GFP_KERNEL);
> - if (!tmp_pages[j])
> - goto free_pagearray;
> - }
> + goto out;
> +
> + for (j = 0; j < gbuf->nrpages; ++j)
> + tmp_pages[j] = gbuf->pages[j];
> + do {
> + last = j;
> + j = alloc_pages_bulk_array(GFP_KERNEL, nrpages,
> + tmp_pages);
> + if (last == j)
> + goto out;
> + } while (j != nrpages);
> +
> ptr = vmap(tmp_pages, nrpages, VM_MAP, PAGE_KERNEL);
> if (!ptr)
> - goto free_pagearray;
> + goto out;
>
> - pages = tmp_pages;
> spin_lock(&gbuf->lock);
> + kfree(gbuf->pages);
> + gbuf->pages = tmp_pages;
> old_ptr = gbuf->ptr;
> gbuf->ptr = ptr;
> - tmp_pages = gbuf->pages;
> - gbuf->pages = pages;
> - j = gbuf->nrpages;
> gbuf->nrpages = nrpages;
> spin_unlock(&gbuf->lock);
> - ret = 0;
> - if (!tmp_pages) {
> - DBG_BUGON(old_ptr);
> - continue;
> - }
> -
> if (old_ptr)
> vunmap(old_ptr);
> -free_pagearray:
> - while (j)
> - erofs_pagepool_add(&pagepool, tmp_pages[--j]);
> - kfree(tmp_pages);
> - if (ret)
> - break;
> }
> z_erofs_gbuf_nrpages = nrpages;
> - erofs_release_pages(&pagepool);
> out:
> + if (i < z_erofs_gbuf_count && tmp_pages) {
> + for (j = 0; j < nrpages; ++j)
> + if (tmp_pages[j] && tmp_pages[j] != gbuf->pages[j])
> + __free_page(tmp_pages[j]);
> + kfree(tmp_pages);
> + }
> mutex_unlock(&gbuf_resize_mutex);
> - return ret;
> + return i < z_erofs_gbuf_count ? -ENOMEM : 0;
> }
>
> int __init z_erofs_gbuf_init(void)
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH v2] erofs: do not use pagepool in z_erofs_gbuf_growsize()
2024-04-02 9:22 ` Gao Xiang
@ 2024-04-02 9:25 ` Chunhai Guo via Linux-erofs
0 siblings, 0 replies; 3+ messages in thread
From: Chunhai Guo via Linux-erofs @ 2024-04-02 9:25 UTC (permalink / raw)
To: Gao Xiang, Chunhai Guo, xiang; +Cc: linux-erofs, huyue2
在 2024/4/2 17:22, Gao Xiang 写道:
>
> On 2024/4/2 17:27, Chunhai Guo wrote:
>> Let's use alloc_pages_bulk_array() for simplicity and get rid of
>> unnecessary pagepool.
>>
>> Signed-off-by: Chunhai Guo <guochunhai@vivo.com>
>> ---
> Would you mind adding a changelog here next time? no
> matter how short the text is.
>
> Reviewed-by: Gao Xiang <hsiangkao@linux.alibaba.com>
>
> Thanks,
> Gao Xiang
Got it. Thanks for your suggestion.
>> fs/erofs/zutil.c | 67 ++++++++++++++++++++++--------------------------
>> 1 file changed, 31 insertions(+), 36 deletions(-)
>>
>> diff --git a/fs/erofs/zutil.c b/fs/erofs/zutil.c
>> index e13806681763..9687cad8be96 100644
>> --- a/fs/erofs/zutil.c
>> +++ b/fs/erofs/zutil.c
>> @@ -60,63 +60,58 @@ void z_erofs_put_gbuf(void *ptr) __releases(gbuf->lock)
>> int z_erofs_gbuf_growsize(unsigned int nrpages)
>> {
>> static DEFINE_MUTEX(gbuf_resize_mutex);
>> - struct page *pagepool = NULL;
>> - int delta, ret, i, j;
>> + struct page **tmp_pages = NULL;
>> + struct z_erofs_gbuf *gbuf;
>> + void *ptr, *old_ptr;
>> + int last, i, j;
>>
>> mutex_lock(&gbuf_resize_mutex);
>> - delta = nrpages - z_erofs_gbuf_nrpages;
>> - ret = 0;
>> /* avoid shrinking gbufs, since no idea how many fses rely on */
>> - if (delta <= 0)
>> - goto out;
>> + if (nrpages <= z_erofs_gbuf_nrpages) {
>> + mutex_unlock(&gbuf_resize_mutex);
>> + return 0;
>> + }
>>
>> for (i = 0; i < z_erofs_gbuf_count; ++i) {
>> - struct z_erofs_gbuf *gbuf = &z_erofs_gbufpool[i];
>> - struct page **pages, **tmp_pages;
>> - void *ptr, *old_ptr = NULL;
>> -
>> - ret = -ENOMEM;
>> + gbuf = &z_erofs_gbufpool[i];
>> tmp_pages = kcalloc(nrpages, sizeof(*tmp_pages), GFP_KERNEL);
>> if (!tmp_pages)
>> - break;
>> - for (j = 0; j < nrpages; ++j) {
>> - tmp_pages[j] = erofs_allocpage(&pagepool, GFP_KERNEL);
>> - if (!tmp_pages[j])
>> - goto free_pagearray;
>> - }
>> + goto out;
>> +
>> + for (j = 0; j < gbuf->nrpages; ++j)
>> + tmp_pages[j] = gbuf->pages[j];
>> + do {
>> + last = j;
>> + j = alloc_pages_bulk_array(GFP_KERNEL, nrpages,
>> + tmp_pages);
>> + if (last == j)
>> + goto out;
>> + } while (j != nrpages);
>> +
>> ptr = vmap(tmp_pages, nrpages, VM_MAP, PAGE_KERNEL);
>> if (!ptr)
>> - goto free_pagearray;
>> + goto out;
>>
>> - pages = tmp_pages;
>> spin_lock(&gbuf->lock);
>> + kfree(gbuf->pages);
>> + gbuf->pages = tmp_pages;
>> old_ptr = gbuf->ptr;
>> gbuf->ptr = ptr;
>> - tmp_pages = gbuf->pages;
>> - gbuf->pages = pages;
>> - j = gbuf->nrpages;
>> gbuf->nrpages = nrpages;
>> spin_unlock(&gbuf->lock);
>> - ret = 0;
>> - if (!tmp_pages) {
>> - DBG_BUGON(old_ptr);
>> - continue;
>> - }
>> -
>> if (old_ptr)
>> vunmap(old_ptr);
>> -free_pagearray:
>> - while (j)
>> - erofs_pagepool_add(&pagepool, tmp_pages[--j]);
>> - kfree(tmp_pages);
>> - if (ret)
>> - break;
>> }
>> z_erofs_gbuf_nrpages = nrpages;
>> - erofs_release_pages(&pagepool);
>> out:
>> + if (i < z_erofs_gbuf_count && tmp_pages) {
>> + for (j = 0; j < nrpages; ++j)
>> + if (tmp_pages[j] && tmp_pages[j] != gbuf->pages[j])
>> + __free_page(tmp_pages[j]);
>> + kfree(tmp_pages);
>> + }
>> mutex_unlock(&gbuf_resize_mutex);
>> - return ret;
>> + return i < z_erofs_gbuf_count ? -ENOMEM : 0;
>> }
>>
>> int __init z_erofs_gbuf_init(void)
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH v2] erofs: do not use pagepool in z_erofs_gbuf_growsize()
@ 2024-04-02 9:27 Chunhai Guo via Linux-erofs
2024-04-02 9:22 ` Gao Xiang
0 siblings, 1 reply; 3+ messages in thread
From: Chunhai Guo via Linux-erofs @ 2024-04-02 9:27 UTC (permalink / raw)
To: xiang; +Cc: huyue2, Chunhai Guo, linux-erofs
Let's use alloc_pages_bulk_array() for simplicity and get rid of
unnecessary pagepool.
Signed-off-by: Chunhai Guo <guochunhai@vivo.com>
---
fs/erofs/zutil.c | 67 ++++++++++++++++++++++--------------------------
1 file changed, 31 insertions(+), 36 deletions(-)
diff --git a/fs/erofs/zutil.c b/fs/erofs/zutil.c
index e13806681763..9687cad8be96 100644
--- a/fs/erofs/zutil.c
+++ b/fs/erofs/zutil.c
@@ -60,63 +60,58 @@ void z_erofs_put_gbuf(void *ptr) __releases(gbuf->lock)
int z_erofs_gbuf_growsize(unsigned int nrpages)
{
static DEFINE_MUTEX(gbuf_resize_mutex);
- struct page *pagepool = NULL;
- int delta, ret, i, j;
+ struct page **tmp_pages = NULL;
+ struct z_erofs_gbuf *gbuf;
+ void *ptr, *old_ptr;
+ int last, i, j;
mutex_lock(&gbuf_resize_mutex);
- delta = nrpages - z_erofs_gbuf_nrpages;
- ret = 0;
/* avoid shrinking gbufs, since no idea how many fses rely on */
- if (delta <= 0)
- goto out;
+ if (nrpages <= z_erofs_gbuf_nrpages) {
+ mutex_unlock(&gbuf_resize_mutex);
+ return 0;
+ }
for (i = 0; i < z_erofs_gbuf_count; ++i) {
- struct z_erofs_gbuf *gbuf = &z_erofs_gbufpool[i];
- struct page **pages, **tmp_pages;
- void *ptr, *old_ptr = NULL;
-
- ret = -ENOMEM;
+ gbuf = &z_erofs_gbufpool[i];
tmp_pages = kcalloc(nrpages, sizeof(*tmp_pages), GFP_KERNEL);
if (!tmp_pages)
- break;
- for (j = 0; j < nrpages; ++j) {
- tmp_pages[j] = erofs_allocpage(&pagepool, GFP_KERNEL);
- if (!tmp_pages[j])
- goto free_pagearray;
- }
+ goto out;
+
+ for (j = 0; j < gbuf->nrpages; ++j)
+ tmp_pages[j] = gbuf->pages[j];
+ do {
+ last = j;
+ j = alloc_pages_bulk_array(GFP_KERNEL, nrpages,
+ tmp_pages);
+ if (last == j)
+ goto out;
+ } while (j != nrpages);
+
ptr = vmap(tmp_pages, nrpages, VM_MAP, PAGE_KERNEL);
if (!ptr)
- goto free_pagearray;
+ goto out;
- pages = tmp_pages;
spin_lock(&gbuf->lock);
+ kfree(gbuf->pages);
+ gbuf->pages = tmp_pages;
old_ptr = gbuf->ptr;
gbuf->ptr = ptr;
- tmp_pages = gbuf->pages;
- gbuf->pages = pages;
- j = gbuf->nrpages;
gbuf->nrpages = nrpages;
spin_unlock(&gbuf->lock);
- ret = 0;
- if (!tmp_pages) {
- DBG_BUGON(old_ptr);
- continue;
- }
-
if (old_ptr)
vunmap(old_ptr);
-free_pagearray:
- while (j)
- erofs_pagepool_add(&pagepool, tmp_pages[--j]);
- kfree(tmp_pages);
- if (ret)
- break;
}
z_erofs_gbuf_nrpages = nrpages;
- erofs_release_pages(&pagepool);
out:
+ if (i < z_erofs_gbuf_count && tmp_pages) {
+ for (j = 0; j < nrpages; ++j)
+ if (tmp_pages[j] && tmp_pages[j] != gbuf->pages[j])
+ __free_page(tmp_pages[j]);
+ kfree(tmp_pages);
+ }
mutex_unlock(&gbuf_resize_mutex);
- return ret;
+ return i < z_erofs_gbuf_count ? -ENOMEM : 0;
}
int __init z_erofs_gbuf_init(void)
--
2.25.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2024-04-02 9:26 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-04-02 9:27 [PATCH v2] erofs: do not use pagepool in z_erofs_gbuf_growsize() Chunhai Guo via Linux-erofs
2024-04-02 9:22 ` Gao Xiang
2024-04-02 9:25 ` Chunhai Guo via Linux-erofs
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).