From: Minchan Kim <minchan@kernel.org>
To: Seth Jennings <sjenning@linux.vnet.ibm.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Andrew Morton <akpm@linux-foundation.org>,
Dan Magenheimer <dan.magenheimer@oracle.com>,
Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
Nitin Gupta <ngupta@vflare.org>,
Robert Jennings <rcj@linux.vnet.ibm.com>,
linux-mm@kvack.org, devel@driverdev.osuosl.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH 1/4] staging: zsmalloc: add gfp flags to zs_create_pool
Date: Mon, 28 Jan 2013 12:39:44 +0900 [thread overview]
Message-ID: <20130128033944.GB3321@blaptop> (raw)
In-Reply-To: <1359135978-15119-2-git-send-email-sjenning@linux.vnet.ibm.com>
Hi Seth,
On Fri, Jan 25, 2013 at 11:46:15AM -0600, Seth Jennings wrote:
> zs_create_pool() currently takes a gfp flags argument
> that is used when growing the memory pool. However
> it is not used in allocating the metadata for the pool
> itself. That is currently hardcoded to GFP_KERNEL.
>
> zswap calls zs_create_pool() at swapon time which is done
> in atomic context, resulting in a "might sleep" warning.
>
> This patch changes the meaning of the flags argument in
> zs_create_pool() to mean the flags for the metadata allocation,
> and adds a flags argument to zs_malloc that will be used for
> memory pool growth if required.
As I mentioned, I'm not strongly against with this patch but it
should be last resort in case of not being able to address
frontswap's init routine's dependency with swap_lock.
I sent a patch and am waiting reply of Konrand or Dan.
If we can fix frontswap, it would be better rather than
changing zsmalloc.
>
> Acked-by: Nitin Gupta <ngupta@vflare.org>
> Signed-off-by: Seth Jennings <sjenning@linux.vnet.ibm.com>
> ---
> drivers/staging/zram/zram_drv.c | 4 ++--
> drivers/staging/zsmalloc/zsmalloc-main.c | 9 +++------
> drivers/staging/zsmalloc/zsmalloc.h | 2 +-
> 3 files changed, 6 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/staging/zram/zram_drv.c b/drivers/staging/zram/zram_drv.c
> index 6762b99..836dccf 100644
> --- a/drivers/staging/zram/zram_drv.c
> +++ b/drivers/staging/zram/zram_drv.c
> @@ -325,7 +325,7 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index,
> clen = PAGE_SIZE;
> }
>
> - handle = zs_malloc(zram->mem_pool, clen);
> + handle = zs_malloc(zram->mem_pool, clen, GFP_NOIO | __GFP_HIGHMEM);
> if (!handle) {
> pr_info("Error allocating memory for compressed "
> "page: %u, size=%zu\n", index, clen);
> @@ -565,7 +565,7 @@ int zram_init_device(struct zram *zram)
> /* zram devices sort of resembles non-rotational disks */
> queue_flag_set_unlocked(QUEUE_FLAG_NONROT, zram->disk->queue);
>
> - zram->mem_pool = zs_create_pool("zram", GFP_NOIO | __GFP_HIGHMEM);
> + zram->mem_pool = zs_create_pool("zram", GFP_KERNEL);
> if (!zram->mem_pool) {
> pr_err("Error creating memory pool\n");
> ret = -ENOMEM;
> diff --git a/drivers/staging/zsmalloc/zsmalloc-main.c b/drivers/staging/zsmalloc/zsmalloc-main.c
> index eb00772..f29f170 100644
> --- a/drivers/staging/zsmalloc/zsmalloc-main.c
> +++ b/drivers/staging/zsmalloc/zsmalloc-main.c
> @@ -205,8 +205,6 @@ struct link_free {
>
> struct zs_pool {
> struct size_class size_class[ZS_SIZE_CLASSES];
> -
> - gfp_t flags; /* allocation flags used when growing pool */
> const char *name;
> };
>
> @@ -818,7 +816,7 @@ struct zs_pool *zs_create_pool(const char *name, gfp_t flags)
> return NULL;
>
> ovhd_size = roundup(sizeof(*pool), PAGE_SIZE);
> - pool = kzalloc(ovhd_size, GFP_KERNEL);
> + pool = kzalloc(ovhd_size, flags);
> if (!pool)
> return NULL;
>
> @@ -838,7 +836,6 @@ struct zs_pool *zs_create_pool(const char *name, gfp_t flags)
>
> }
>
> - pool->flags = flags;
> pool->name = name;
>
> return pool;
> @@ -874,7 +871,7 @@ EXPORT_SYMBOL_GPL(zs_destroy_pool);
> * otherwise 0.
> * Allocation requests with size > ZS_MAX_ALLOC_SIZE will fail.
> */
> -unsigned long zs_malloc(struct zs_pool *pool, size_t size)
> +unsigned long zs_malloc(struct zs_pool *pool, size_t size, gfp_t flags)
> {
> unsigned long obj;
> struct link_free *link;
> @@ -896,7 +893,7 @@ unsigned long zs_malloc(struct zs_pool *pool, size_t size)
>
> if (!first_page) {
> spin_unlock(&class->lock);
> - first_page = alloc_zspage(class, pool->flags);
> + first_page = alloc_zspage(class, flags);
> if (unlikely(!first_page))
> return 0;
>
> diff --git a/drivers/staging/zsmalloc/zsmalloc.h b/drivers/staging/zsmalloc/zsmalloc.h
> index de2e8bf..907ff03 100644
> --- a/drivers/staging/zsmalloc/zsmalloc.h
> +++ b/drivers/staging/zsmalloc/zsmalloc.h
> @@ -31,7 +31,7 @@ struct zs_pool;
> struct zs_pool *zs_create_pool(const char *name, gfp_t flags);
> void zs_destroy_pool(struct zs_pool *pool);
>
> -unsigned long zs_malloc(struct zs_pool *pool, size_t size);
> +unsigned long zs_malloc(struct zs_pool *pool, size_t size, gfp_t flags);
> void zs_free(struct zs_pool *pool, unsigned long obj);
>
> void *zs_map_object(struct zs_pool *pool, unsigned long handle,
> --
> 1.7.9.5
>
> --
> To unsubscribe, send a message with 'unsubscribe linux-mm' in
> the body to majordomo@kvack.org. For more info on Linux MM,
> see: http://www.linux-mm.org/ .
> Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
--
Kind regards,
Minchan Kim
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
WARNING: multiple messages have this Message-ID (diff)
From: Minchan Kim <minchan@kernel.org>
To: Seth Jennings <sjenning@linux.vnet.ibm.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Andrew Morton <akpm@linux-foundation.org>,
Dan Magenheimer <dan.magenheimer@oracle.com>,
Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
Nitin Gupta <ngupta@vflare.org>,
Robert Jennings <rcj@linux.vnet.ibm.com>,
linux-mm@kvack.org, devel@driverdev.osuosl.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH 1/4] staging: zsmalloc: add gfp flags to zs_create_pool
Date: Mon, 28 Jan 2013 12:39:44 +0900 [thread overview]
Message-ID: <20130128033944.GB3321@blaptop> (raw)
In-Reply-To: <1359135978-15119-2-git-send-email-sjenning@linux.vnet.ibm.com>
Hi Seth,
On Fri, Jan 25, 2013 at 11:46:15AM -0600, Seth Jennings wrote:
> zs_create_pool() currently takes a gfp flags argument
> that is used when growing the memory pool. However
> it is not used in allocating the metadata for the pool
> itself. That is currently hardcoded to GFP_KERNEL.
>
> zswap calls zs_create_pool() at swapon time which is done
> in atomic context, resulting in a "might sleep" warning.
>
> This patch changes the meaning of the flags argument in
> zs_create_pool() to mean the flags for the metadata allocation,
> and adds a flags argument to zs_malloc that will be used for
> memory pool growth if required.
As I mentioned, I'm not strongly against with this patch but it
should be last resort in case of not being able to address
frontswap's init routine's dependency with swap_lock.
I sent a patch and am waiting reply of Konrand or Dan.
If we can fix frontswap, it would be better rather than
changing zsmalloc.
>
> Acked-by: Nitin Gupta <ngupta@vflare.org>
> Signed-off-by: Seth Jennings <sjenning@linux.vnet.ibm.com>
> ---
> drivers/staging/zram/zram_drv.c | 4 ++--
> drivers/staging/zsmalloc/zsmalloc-main.c | 9 +++------
> drivers/staging/zsmalloc/zsmalloc.h | 2 +-
> 3 files changed, 6 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/staging/zram/zram_drv.c b/drivers/staging/zram/zram_drv.c
> index 6762b99..836dccf 100644
> --- a/drivers/staging/zram/zram_drv.c
> +++ b/drivers/staging/zram/zram_drv.c
> @@ -325,7 +325,7 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index,
> clen = PAGE_SIZE;
> }
>
> - handle = zs_malloc(zram->mem_pool, clen);
> + handle = zs_malloc(zram->mem_pool, clen, GFP_NOIO | __GFP_HIGHMEM);
> if (!handle) {
> pr_info("Error allocating memory for compressed "
> "page: %u, size=%zu\n", index, clen);
> @@ -565,7 +565,7 @@ int zram_init_device(struct zram *zram)
> /* zram devices sort of resembles non-rotational disks */
> queue_flag_set_unlocked(QUEUE_FLAG_NONROT, zram->disk->queue);
>
> - zram->mem_pool = zs_create_pool("zram", GFP_NOIO | __GFP_HIGHMEM);
> + zram->mem_pool = zs_create_pool("zram", GFP_KERNEL);
> if (!zram->mem_pool) {
> pr_err("Error creating memory pool\n");
> ret = -ENOMEM;
> diff --git a/drivers/staging/zsmalloc/zsmalloc-main.c b/drivers/staging/zsmalloc/zsmalloc-main.c
> index eb00772..f29f170 100644
> --- a/drivers/staging/zsmalloc/zsmalloc-main.c
> +++ b/drivers/staging/zsmalloc/zsmalloc-main.c
> @@ -205,8 +205,6 @@ struct link_free {
>
> struct zs_pool {
> struct size_class size_class[ZS_SIZE_CLASSES];
> -
> - gfp_t flags; /* allocation flags used when growing pool */
> const char *name;
> };
>
> @@ -818,7 +816,7 @@ struct zs_pool *zs_create_pool(const char *name, gfp_t flags)
> return NULL;
>
> ovhd_size = roundup(sizeof(*pool), PAGE_SIZE);
> - pool = kzalloc(ovhd_size, GFP_KERNEL);
> + pool = kzalloc(ovhd_size, flags);
> if (!pool)
> return NULL;
>
> @@ -838,7 +836,6 @@ struct zs_pool *zs_create_pool(const char *name, gfp_t flags)
>
> }
>
> - pool->flags = flags;
> pool->name = name;
>
> return pool;
> @@ -874,7 +871,7 @@ EXPORT_SYMBOL_GPL(zs_destroy_pool);
> * otherwise 0.
> * Allocation requests with size > ZS_MAX_ALLOC_SIZE will fail.
> */
> -unsigned long zs_malloc(struct zs_pool *pool, size_t size)
> +unsigned long zs_malloc(struct zs_pool *pool, size_t size, gfp_t flags)
> {
> unsigned long obj;
> struct link_free *link;
> @@ -896,7 +893,7 @@ unsigned long zs_malloc(struct zs_pool *pool, size_t size)
>
> if (!first_page) {
> spin_unlock(&class->lock);
> - first_page = alloc_zspage(class, pool->flags);
> + first_page = alloc_zspage(class, flags);
> if (unlikely(!first_page))
> return 0;
>
> diff --git a/drivers/staging/zsmalloc/zsmalloc.h b/drivers/staging/zsmalloc/zsmalloc.h
> index de2e8bf..907ff03 100644
> --- a/drivers/staging/zsmalloc/zsmalloc.h
> +++ b/drivers/staging/zsmalloc/zsmalloc.h
> @@ -31,7 +31,7 @@ struct zs_pool;
> struct zs_pool *zs_create_pool(const char *name, gfp_t flags);
> void zs_destroy_pool(struct zs_pool *pool);
>
> -unsigned long zs_malloc(struct zs_pool *pool, size_t size);
> +unsigned long zs_malloc(struct zs_pool *pool, size_t size, gfp_t flags);
> void zs_free(struct zs_pool *pool, unsigned long obj);
>
> void *zs_map_object(struct zs_pool *pool, unsigned long handle,
> --
> 1.7.9.5
>
> --
> To unsubscribe, send a message with 'unsubscribe linux-mm' in
> the body to majordomo@kvack.org. For more info on Linux MM,
> see: http://www.linux-mm.org/ .
> Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
--
Kind regards,
Minchan Kim
next prev parent reply other threads:[~2013-01-28 3:39 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-01-25 17:46 [PATCH 0/4] staging: zsmalloc: various cleanups/improvments Seth Jennings
2013-01-25 17:46 ` Seth Jennings
2013-01-25 17:46 ` [PATCH 1/4] staging: zsmalloc: add gfp flags to zs_create_pool Seth Jennings
2013-01-25 17:46 ` Seth Jennings
2013-01-28 3:39 ` Minchan Kim [this message]
2013-01-28 3:39 ` Minchan Kim
2013-01-28 15:16 ` Konrad Rzeszutek Wilk
2013-01-28 15:16 ` Konrad Rzeszutek Wilk
2013-01-28 23:33 ` Minchan Kim
2013-01-28 23:33 ` Minchan Kim
2013-01-28 17:01 ` Seth Jennings
2013-01-28 17:01 ` Seth Jennings
2013-01-28 23:38 ` Minchan Kim
2013-01-28 23:38 ` Minchan Kim
2013-01-25 17:46 ` [PATCH 2/4] staging: zsmalloc: remove unused pool name Seth Jennings
2013-01-25 17:46 ` Seth Jennings
2013-01-28 3:40 ` Minchan Kim
2013-01-28 3:40 ` Minchan Kim
2013-01-30 4:16 ` Greg Kroah-Hartman
2013-01-30 4:16 ` Greg Kroah-Hartman
2013-01-30 15:36 ` [PATCH] " Seth Jennings
2013-01-30 15:36 ` Seth Jennings
2013-01-30 15:41 ` Seth Jennings
2013-01-30 15:41 ` Seth Jennings
2013-01-30 17:21 ` Greg Kroah-Hartman
2013-01-30 17:21 ` Greg Kroah-Hartman
2013-01-30 17:29 ` Konrad Rzeszutek Wilk
2013-01-30 17:29 ` Konrad Rzeszutek Wilk
2013-01-31 5:32 ` Greg Kroah-Hartman
2013-01-31 5:32 ` Greg Kroah-Hartman
2013-02-01 2:11 ` Konrad Rzeszutek Wilk
2013-02-01 2:11 ` Konrad Rzeszutek Wilk
2013-01-30 17:33 ` Seth Jennings
2013-01-30 17:33 ` Seth Jennings
2013-01-25 17:46 ` [PATCH 3/4] staging: zsmalloc: add page alloc/free callbacks Seth Jennings
2013-01-25 17:46 ` Seth Jennings
2013-01-28 3:42 ` Minchan Kim
2013-01-28 3:42 ` Minchan Kim
2013-01-25 17:46 ` [PATCH 4/4] staging: zsmalloc: make CLASS_DELTA relative to PAGE_SIZE Seth Jennings
2013-01-25 17:46 ` Seth Jennings
2013-01-28 3:44 ` Minchan Kim
2013-01-28 3:44 ` Minchan Kim
2013-01-28 3:47 ` [PATCH 0/4] staging: zsmalloc: various cleanups/improvments Minchan Kim
2013-01-28 3:47 ` Minchan Kim
2013-01-28 17:07 ` Seth Jennings
2013-01-28 17:07 ` Seth Jennings
2013-01-28 23:44 ` Minchan Kim
2013-01-28 23:44 ` Minchan Kim
2013-01-30 4:17 ` Greg Kroah-Hartman
2013-01-30 4:17 ` Greg Kroah-Hartman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20130128033944.GB3321@blaptop \
--to=minchan@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=dan.magenheimer@oracle.com \
--cc=devel@driverdev.osuosl.org \
--cc=gregkh@linuxfoundation.org \
--cc=konrad.wilk@oracle.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=ngupta@vflare.org \
--cc=rcj@linux.vnet.ibm.com \
--cc=sjenning@linux.vnet.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.