From: Peter Zijlstra <peterz@infradead.org>
To: Changli Gao <xiaosuo@gmail.com>
Cc: akpm@linux-foundation.org, Hoang-Nam Nguyen <hnguyen@de.ibm.com>,
Christoph Raisch <raisch@de.ibm.com>,
Roland Dreier <rolandd@cisco.com>,
Sean Hefty <sean.hefty@intel.com>,
Hal Rosenstock <hal.rosenstock@gmail.com>,
Divy Le Ray <divy@chelsio.com>,
"James E.J. Bottomley" <James.Bottomley@suse.de>,
Theodore Ts'o <tytso@mit.edu>, Andreas Dilger <adilger@sun.com>,
Alexander Viro <viro@zeniv.linux.org.uk>,
Paul Menage <menage@google.com>, Li Zefan <lizf@cn.fujitsu.com>,
linux-rdma@vger.kernel.org, linux-kernel@vger.kernel.org,
netdev@vger.kernel.org, linux-scsi@vger.kernel.org,
linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org,
linux-mm@kvack.org, containers@lists.linux-foundation.org,
Eric Dumazet <eric.dumazet@gmail.com>,
Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
Subject: Re: [PATCH 1/9] mm: add generic adaptive large memory allocation APIs
Date: Thu, 13 May 2010 15:20:16 +0200 [thread overview]
Message-ID: <1273756816.5605.3547.camel@twins> (raw)
In-Reply-To: <1273744285-8128-1-git-send-email-xiaosuo@gmail.com>
On Thu, 2010-05-13 at 17:51 +0800, Changli Gao wrote:
> +void *__kvmalloc(size_t size, gfp_t flags)
> +{
> + void *ptr;
> +
> + if (size < PAGE_SIZE)
> + return kmalloc(size, GFP_KERNEL | flags);
> + size = PAGE_ALIGN(size);
> + if (is_power_of_2(size))
> + ptr = (void *)__get_free_pages(GFP_KERNEL | flags |
> + __GFP_NOWARN, get_order(size));
> + else
> + ptr = alloc_pages_exact(size, GFP_KERNEL | flags |
> + __GFP_NOWARN);
> + if (ptr != NULL) {
> + virt_to_head_page(ptr)->private = size;
> + return ptr;
> + }
> +
> + ptr = vmalloc(size);
> + if (ptr != NULL && (flags & __GFP_ZERO))
> + memset(ptr, 0, size);
> +
> + return ptr;
> +}
> +EXPORT_SYMBOL(__kvmalloc);
So if I do kvmalloc(size, GFP_ATOMIC) I get GFP_KERNEL|GFP_ATOMIC, which
is not a recommended variation because one should not mix __GFP_WAIT and
__GFP_HIGH.
So I would simply drop the gfp argument to avoid confusion.
> +void __kvfree(void *ptr, bool inatomic)
> +{
> + if (unlikely(ZERO_OR_NULL_PTR(ptr)))
> + return;
> + if (is_vmalloc_addr(ptr)) {
> + if (inatomic) {
> + struct work_struct *work;
> +
> + work = ptr;
> + BUILD_BUG_ON(sizeof(struct work_struct) > PAGE_SIZE);
> + INIT_WORK(work, kvfree_work);
> + schedule_work(work);
> + } else {
> + vfree(ptr);
> + }
> + } else {
> + struct page *page;
> +
> + page = virt_to_head_page(ptr);
> + if (PageSlab(page) || PageCompound(page))
> + kfree(ptr);
> + else if (is_power_of_2(page->private))
> + free_pages((unsigned long)ptr,
> + get_order(page->private));
> + else
> + free_pages_exact(ptr, page->private);
> + }
> +}
> +EXPORT_SYMBOL(__kvfree);
NAK, I really utterly dislike that inatomic argument. The alloc side
doesn't function in atomic context either. Please keep the thing
symmetric in that regards.
--
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: Peter Zijlstra <peterz@infradead.org>
To: Changli Gao <xiaosuo@gmail.com>
Cc: akpm@linux-foundation.org, Hoang-Nam Nguyen <hnguyen@de.ibm.com>,
Christoph Raisch <raisch@de.ibm.com>,
Roland Dreier <rolandd@cisco.com>,
Sean Hefty <sean.hefty@intel.com>,
Hal Rosenstock <hal.rosenstock@gmail.com>,
Divy Le Ray <divy@chelsio.com>,
"James E.J. Bottomley" <James.Bottomley@suse.de>,
"Theodore Ts'o" <tytso@mit.edu>, Andreas Dilger <adilger@sun.com>,
Alexander Viro <viro@zeniv.linux.org.uk>,
Paul Menage <menage@google.com>, Li Zefan <lizf@cn.fujitsu.com>,
linux-rdma@vger.kernel.org, linux-kernel@vger.kernel.org,
netdev@vger.kernel.org, linux-scsi@vger.kernel.org,
linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org,
linux-mm@kvack.org, containers@lists.linux-foundation.org,
Eric Dumazet <eric.dumazet@gmail.com>,
Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
Subject: Re: [PATCH 1/9] mm: add generic adaptive large memory allocation APIs
Date: Thu, 13 May 2010 15:20:16 +0200 [thread overview]
Message-ID: <1273756816.5605.3547.camel@twins> (raw)
In-Reply-To: <1273744285-8128-1-git-send-email-xiaosuo@gmail.com>
On Thu, 2010-05-13 at 17:51 +0800, Changli Gao wrote:
> +void *__kvmalloc(size_t size, gfp_t flags)
> +{
> + void *ptr;
> +
> + if (size < PAGE_SIZE)
> + return kmalloc(size, GFP_KERNEL | flags);
> + size = PAGE_ALIGN(size);
> + if (is_power_of_2(size))
> + ptr = (void *)__get_free_pages(GFP_KERNEL | flags |
> + __GFP_NOWARN, get_order(size));
> + else
> + ptr = alloc_pages_exact(size, GFP_KERNEL | flags |
> + __GFP_NOWARN);
> + if (ptr != NULL) {
> + virt_to_head_page(ptr)->private = size;
> + return ptr;
> + }
> +
> + ptr = vmalloc(size);
> + if (ptr != NULL && (flags & __GFP_ZERO))
> + memset(ptr, 0, size);
> +
> + return ptr;
> +}
> +EXPORT_SYMBOL(__kvmalloc);
So if I do kvmalloc(size, GFP_ATOMIC) I get GFP_KERNEL|GFP_ATOMIC, which
is not a recommended variation because one should not mix __GFP_WAIT and
__GFP_HIGH.
So I would simply drop the gfp argument to avoid confusion.
> +void __kvfree(void *ptr, bool inatomic)
> +{
> + if (unlikely(ZERO_OR_NULL_PTR(ptr)))
> + return;
> + if (is_vmalloc_addr(ptr)) {
> + if (inatomic) {
> + struct work_struct *work;
> +
> + work = ptr;
> + BUILD_BUG_ON(sizeof(struct work_struct) > PAGE_SIZE);
> + INIT_WORK(work, kvfree_work);
> + schedule_work(work);
> + } else {
> + vfree(ptr);
> + }
> + } else {
> + struct page *page;
> +
> + page = virt_to_head_page(ptr);
> + if (PageSlab(page) || PageCompound(page))
> + kfree(ptr);
> + else if (is_power_of_2(page->private))
> + free_pages((unsigned long)ptr,
> + get_order(page->private));
> + else
> + free_pages_exact(ptr, page->private);
> + }
> +}
> +EXPORT_SYMBOL(__kvfree);
NAK, I really utterly dislike that inatomic argument. The alloc side
doesn't function in atomic context either. Please keep the thing
symmetric in that regards.
next prev parent reply other threads:[~2010-05-13 13:20 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-05-13 9:51 [PATCH 1/9] mm: add generic adaptive large memory allocation APIs Changli Gao
2010-05-13 9:51 ` Changli Gao
2010-05-13 9:51 ` Changli Gao
2010-05-13 9:51 ` Changli Gao
2010-05-13 13:20 ` Peter Zijlstra [this message]
2010-05-13 13:20 ` Peter Zijlstra
2010-05-13 13:36 ` [PATCH 1/9] mm: add generic adaptive large memory allocationAPIs Tetsuo Handa
2010-05-13 13:36 ` Tetsuo Handa
2010-05-13 13:36 ` Tetsuo Handa
2010-05-17 1:34 ` KOSAKI Motohiro
2010-05-17 1:34 ` KOSAKI Motohiro
[not found] ` <201005132236.ADJ57893.FLFFMtOVJHOOSQ-JPay3/Yim36HaxMnTkn67Xf5DAMn2ifp@public.gmane.org>
2010-05-17 1:34 ` KOSAKI Motohiro
2010-05-13 14:08 ` [PATCH 1/9] mm: add generic adaptive large memory allocation APIs Changli Gao
2010-05-13 14:08 ` Changli Gao
2010-05-14 8:03 ` Peter Zijlstra
2010-05-14 8:03 ` Peter Zijlstra
2010-05-14 8:12 ` Changli Gao
2010-05-14 8:12 ` Changli Gao
2010-05-14 8:12 ` Changli Gao
[not found] ` <AANLkTinLT5g5SKjqmQlS2kxvvMq1gsi1jPDgOKTnrT-q-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-05-14 8:03 ` Peter Zijlstra
2010-05-13 14:08 ` Changli Gao
[not found] ` <1273744285-8128-1-git-send-email-xiaosuo-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2010-05-13 13:20 ` Peter Zijlstra
2010-05-13 14:39 ` Milton Miller
2010-05-13 14:39 ` Milton Miller
2010-05-13 14:39 ` Milton Miller
2010-05-13 14:39 ` Milton Miller
2010-05-13 14:39 ` Milton Miller
[not found] ` <1273761576_4060-qolCYAvwHvWlVDA81TZ6el6hYfS7NtTn@public.gmane.org>
2010-05-13 14:49 ` Changli Gao
2010-05-13 14:49 ` Changli Gao
2010-05-13 14:49 ` Changli Gao
2010-05-13 14:49 ` Changli Gao
-- strict thread matches above, loose matches on Subject: below --
2010-05-13 9:51 Changli Gao
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=1273756816.5605.3547.camel@twins \
--to=peterz@infradead.org \
--cc=James.Bottomley@suse.de \
--cc=adilger@sun.com \
--cc=akpm@linux-foundation.org \
--cc=containers@lists.linux-foundation.org \
--cc=divy@chelsio.com \
--cc=eric.dumazet@gmail.com \
--cc=hal.rosenstock@gmail.com \
--cc=hnguyen@de.ibm.com \
--cc=linux-ext4@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-rdma@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=lizf@cn.fujitsu.com \
--cc=menage@google.com \
--cc=netdev@vger.kernel.org \
--cc=penguin-kernel@i-love.sakura.ne.jp \
--cc=raisch@de.ibm.com \
--cc=rolandd@cisco.com \
--cc=sean.hefty@intel.com \
--cc=tytso@mit.edu \
--cc=viro@zeniv.linux.org.uk \
--cc=xiaosuo@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.