From: Minchan Kim <minchan@kernel.org>
To: Sergey Senozhatsky <sergey.senozhatsky.work@gmail.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
linux-kernel@vger.kernel.org,
Kyeongdon Kim <kyeongdon.kim@lge.com>,
Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Subject: Re: [PATCH 2/3] zram: try vmalloc() after kmalloc()
Date: Tue, 24 Nov 2015 16:08:14 +0900 [thread overview]
Message-ID: <20151124070814.GC7708@blaptop> (raw)
In-Reply-To: <20151124064249.GK705@swordfish>
On Tue, Nov 24, 2015 at 03:42:49PM +0900, Sergey Senozhatsky wrote:
> On (11/24/15 15:12), Sergey Senozhatsky wrote:
> > [..]
> > > static void *zcomp_lz4_create(void)
> > > {
> > > - return kzalloc(LZ4_MEM_COMPRESS, GFP_KERNEL);
> > > + void *ret;
> > > +
> > > + /*
> > > + * This function could be called in swapout/fs write path
> > > + * so we couldn't use GFP_FS|IO. And it assumes we already
> > > + * have at least one stream in zram initialization so we
> > > + * don't do best effort to allocate more stream in here.
> > > + * A default stream will work well without further multiple
> > > + * stream. That's why we use __GFP_NORETRY|NOWARN|NOMEMALLOC.
> > > + */
> > > + ret = kzalloc(LZ4_MEM_COMPRESS,
> > > + __GFP_NORETRY|__GFP_NOWARN|__GFP_NOMEMALLOC);
> > > + if (!ret)
> > > + ret = __vmalloc(LZ4_MEM_COMPRESS,
> > > + __GFP_NORETRY|__GFP_NOWARN|
> > > + __GFP_NOMEMALLOC|__GFP_ZERO,
> > > + PAGE_KERNEL);
> > > + return ret;
> > > }
> > [..]
> >
> > so this change is still questionable. is there a real value in having
> > a vmalloc() fallback in the middle of allocations sequence:
> >
> > zstrm = kmalloc(sizeof(*zstrm), GFP_NOIO);
> > ^^^ ok, can fail here
> >
>
> oh, and by the way, we still can get a warning from this guy. so NOWARN in
> ->create() only is not enough, should be propogated to zstrm alloc too.
> so is __get_free_pages() (that was not in the original patch).
>
> so pass nowarn everywhere.
>
> perhaps something like (__GFP_NORETRY... hm...):
Yep. zcomp_strm_alloc has several allocation side and they have used
different flags so in our discussion, there are a few time mistakes to
miss so I want to pass gfp_t from client to zcomp_strm_alloc and
all of allocation sites in zcomp_strm_alloc use the flag consistenly
like my [3/3].
Thanks.
>
> ---
>
> drivers/block/zram/zcomp.c | 6 ++++--
> drivers/block/zram/zcomp_lz4.c | 3 ++-
> drivers/block/zram/zcomp_lzo.c | 3 ++-
> 3 files changed, 8 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c
> index c536177..c0d02d5 100644
> --- a/drivers/block/zram/zcomp.c
> +++ b/drivers/block/zram/zcomp.c
> @@ -76,7 +76,8 @@ static void zcomp_strm_free(struct zcomp *comp, struct zcomp_strm *zstrm)
> */
> static struct zcomp_strm *zcomp_strm_alloc(struct zcomp *comp)
> {
> - struct zcomp_strm *zstrm = kmalloc(sizeof(*zstrm), GFP_NOIO);
> + struct zcomp_strm *zstrm = kmalloc(sizeof(*zstrm), GFP_NOIO |
> + __GFP_NORETRY | __GFP_NOWARN | __GFP_NOMEMALLOC);
> if (!zstrm)
> return NULL;
>
> @@ -85,7 +86,8 @@ static struct zcomp_strm *zcomp_strm_alloc(struct zcomp *comp)
> * allocate 2 pages. 1 for compressed data, plus 1 extra for the
> * case when compressed size is larger than the original one
> */
> - zstrm->buffer = (void *)__get_free_pages(GFP_NOIO | __GFP_ZERO, 1);
> + zstrm->buffer = (void *)__get_free_pages(GFP_NOIO | __GFP_NOWARN |
> + __GFP_ZERO, 1);
> if (!zstrm->private || !zstrm->buffer) {
> zcomp_strm_free(comp, zstrm);
> zstrm = NULL;
> diff --git a/drivers/block/zram/zcomp_lz4.c b/drivers/block/zram/zcomp_lz4.c
> index ee44b51..dbeee93 100644
> --- a/drivers/block/zram/zcomp_lz4.c
> +++ b/drivers/block/zram/zcomp_lz4.c
> @@ -15,7 +15,8 @@
>
> static void *zcomp_lz4_create(void)
> {
> - return kzalloc(LZ4_MEM_COMPRESS, GFP_NOIO);
> + return kzalloc(LZ4_MEM_COMPRESS, GFP_NOIO | __GFP_NORETRY |
> + __GFP_NOWARN | __GFP_NOMEMALLOC);
> }
>
> static void zcomp_lz4_destroy(void *private)
> diff --git a/drivers/block/zram/zcomp_lzo.c b/drivers/block/zram/zcomp_lzo.c
> index 683ce04..19c0857 100644
> --- a/drivers/block/zram/zcomp_lzo.c
> +++ b/drivers/block/zram/zcomp_lzo.c
> @@ -15,7 +15,8 @@
>
> static void *lzo_create(void)
> {
> - return kzalloc(LZO1X_MEM_COMPRESS, GFP_NOIO);
> + return kzalloc(LZO1X_MEM_COMPRESS, GFP_NOIO | __GFP_NORETRY |
> + __GFP_NOWARN | __GFP_NOMEMALLOC);
> }
>
> static void lzo_destroy(void *private)
--
Kind regards,
Minchan Kim
next prev parent reply other threads:[~2015-11-24 7:08 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-11-24 4:01 [PATCH 1/3] zram/zcomp: use GFP_NOIO to allocate streams Minchan Kim
2015-11-24 4:01 ` [PATCH 2/3] zram: try vmalloc() after kmalloc() Minchan Kim
2015-11-24 4:01 ` [RFC 3/3] zram: pass gfp from zcomp frontend to backend Minchan Kim
2015-11-24 6:00 ` [PATCH 1/3] zram/zcomp: use GFP_NOIO to allocate streams Sergey Senozhatsky
2015-11-24 7:10 ` Minchan Kim
2015-11-24 6:12 ` [PATCH 2/3] zram: try vmalloc() after kmalloc() Sergey Senozhatsky
2015-11-24 6:42 ` Sergey Senozhatsky
2015-11-24 7:08 ` Minchan Kim [this message]
2015-11-24 7:03 ` Minchan Kim
2015-11-24 7:36 ` Sergey Senozhatsky
2015-11-24 7:57 ` Minchan Kim
2015-11-24 8:07 ` Sergey Senozhatsky
2015-11-24 8:14 ` Minchan Kim
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=20151124070814.GC7708@blaptop \
--to=minchan@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=kyeongdon.kim@lge.com \
--cc=linux-kernel@vger.kernel.org \
--cc=sergey.senozhatsky.work@gmail.com \
--cc=sergey.senozhatsky@gmail.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.