From: Jes Sorensen <jes@sgi.com>
To: linux-ia64@vger.kernel.org
Subject: Re: [PATCH] allocate multiple contiguous pages via uncached allocator
Date: Tue, 22 Apr 2008 07:21:48 +0000 [thread overview]
Message-ID: <480D920C.4070808@sgi.com> (raw)
In-Reply-To: <20080422005004.0F97711C419@aqua.americas.sgi.com>
Dean Nelson wrote:
> Enable the uncached allocator to allocate multiple pages of contiguous
> uncached memory.
>
> Signed-off-by: Dean Nelson <dcn@sgi.com>
Acked-by: Jes Sorensen <jes@sgi.com>
> ---
>
> arch/ia64/kernel/uncached.c | 21 ++++++++++++---------
> drivers/char/mspec.c | 12 ++++++------
> include/asm-ia64/uncached.h | 4 ++--
> 3 files changed, 20 insertions(+), 17 deletions(-)
>
> Index: linux-2.6/arch/ia64/kernel/uncached.c
> =================================> --- linux-2.6.orig/arch/ia64/kernel/uncached.c 2007-10-04 06:52:20.000000000 -0500
> +++ linux-2.6/arch/ia64/kernel/uncached.c 2007-11-08 12:14:31.408258515 -0600
> @@ -177,12 +177,13 @@
> * uncached_alloc_page
> *
> * @starting_nid: node id of node to start with, or -1
> + * @n_pages: number of contiguous pages to allocate
> *
> - * Allocate 1 uncached page. Allocates on the requested node. If no
> - * uncached pages are available on the requested node, roundrobin starting
> - * with the next higher node.
> + * Allocate the specified number of contiguous uncached pages on the
> + * the requested node. If not enough contiguous uncached pages are available
> + * on the requested node, roundrobin starting with the next higher node.
> */
> -unsigned long uncached_alloc_page(int starting_nid)
> +unsigned long uncached_alloc_page(int starting_nid, int n_pages)
> {
> unsigned long uc_addr;
> struct uncached_pool *uc_pool;
> @@ -202,7 +203,8 @@
> if (uc_pool->pool = NULL)
> continue;
> do {
> - uc_addr = gen_pool_alloc(uc_pool->pool, PAGE_SIZE);
> + uc_addr = gen_pool_alloc(uc_pool->pool,
> + n_pages * PAGE_SIZE);
> if (uc_addr != 0)
> return uc_addr;
> } while (uncached_add_chunk(uc_pool, nid) = 0);
> @@ -217,11 +219,12 @@
> /*
> * uncached_free_page
> *
> - * @uc_addr: uncached address of page to free
> + * @uc_addr: uncached address of first page to free
> + * @n_pages: number of contiguous pages to free
> *
> - * Free a single uncached page.
> + * Free the specified number of uncached pages.
> */
> -void uncached_free_page(unsigned long uc_addr)
> +void uncached_free_page(unsigned long uc_addr, int n_pages)
> {
> int nid = paddr_to_nid(uc_addr - __IA64_UNCACHED_OFFSET);
> struct gen_pool *pool = uncached_pools[nid].pool;
> @@ -232,7 +235,7 @@
> if ((uc_addr & (0XFUL << 60)) != __IA64_UNCACHED_OFFSET)
> panic("uncached_free_page invalid address %lx\n", uc_addr);
>
> - gen_pool_free(pool, uc_addr, PAGE_SIZE);
> + gen_pool_free(pool, uc_addr, n_pages * PAGE_SIZE);
> }
> EXPORT_SYMBOL(uncached_free_page);
>
> Index: linux-2.6/drivers/char/mspec.c
> =================================> --- linux-2.6.orig/drivers/char/mspec.c 2007-10-04 06:52:21.000000000 -0500
> +++ linux-2.6/drivers/char/mspec.c 2007-11-08 12:07:17.458415225 -0600
> @@ -180,7 +180,7 @@
> my_page = vdata->maddr[index];
> vdata->maddr[index] = 0;
> if (!mspec_zero_block(my_page, PAGE_SIZE))
> - uncached_free_page(my_page);
> + uncached_free_page(my_page, 1);
> else
> printk(KERN_WARNING "mspec_close(): "
> "failed to zero page %ld\n", my_page);
> @@ -209,7 +209,7 @@
> index = (address - vdata->vm_start) >> PAGE_SHIFT;
> maddr = (volatile unsigned long) vdata->maddr[index];
> if (maddr = 0) {
> - maddr = uncached_alloc_page(numa_node_id());
> + maddr = uncached_alloc_page(numa_node_id(), 1);
> if (maddr = 0)
> return NOPFN_OOM;
>
> @@ -218,7 +218,7 @@
> vdata->count++;
> vdata->maddr[index] = maddr;
> } else {
> - uncached_free_page(maddr);
> + uncached_free_page(maddr, 1);
> maddr = vdata->maddr[index];
> }
> spin_unlock(&vdata->lock);
> @@ -367,7 +367,7 @@
> int nasid;
> unsigned long phys;
>
> - scratch_page[nid] = uncached_alloc_page(nid);
> + scratch_page[nid] = uncached_alloc_page(nid, 1);
> if (scratch_page[nid] = 0)
> goto free_scratch_pages;
> phys = __pa(scratch_page[nid]);
> @@ -414,7 +414,7 @@
> free_scratch_pages:
> for_each_node(nid) {
> if (scratch_page[nid] != 0)
> - uncached_free_page(scratch_page[nid]);
> + uncached_free_page(scratch_page[nid], 1);
> }
> return ret;
> }
> @@ -431,7 +431,7 @@
>
> for_each_node(nid) {
> if (scratch_page[nid] != 0)
> - uncached_free_page(scratch_page[nid]);
> + uncached_free_page(scratch_page[nid], 1);
> }
> }
> }
> Index: linux-2.6/include/asm-ia64/uncached.h
> =================================> --- linux-2.6.orig/include/asm-ia64/uncached.h 2007-10-04 06:52:25.000000000 -0500
> +++ linux-2.6/include/asm-ia64/uncached.h 2007-11-08 12:05:00.633469891 -0600
> @@ -8,5 +8,5 @@
> * Prototypes for the uncached page allocator
> */
>
> -extern unsigned long uncached_alloc_page(int nid);
> -extern void uncached_free_page(unsigned long);
> +extern unsigned long uncached_alloc_page(int, int);
> +extern void uncached_free_page(unsigned long, int);
next prev parent reply other threads:[~2008-04-22 7:21 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-04-22 0:50 [PATCH] allocate multiple contiguous pages via uncached allocator Dean Nelson
2008-04-22 7:21 ` Jes Sorensen [this message]
2008-04-25 18:46 ` [PATCH] allocate multiple contiguous pages via uncached allocator -v2 Dean Nelson
2008-04-25 18:50 ` Matthew Wilcox
2008-04-25 20:22 ` [PATCH] allocate multiple contiguous pages via uncached allocator -v3 Dean Nelson
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=480D920C.4070808@sgi.com \
--to=jes@sgi.com \
--cc=linux-ia64@vger.kernel.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox