[PATCH v2 4/5] memblock: introduce memblock_alloc_range()

2014-01-14 Thread Akinobu Mita
This introduces memblock_alloc_range() which allocates memblock from
the specified range of physical address.  I would like to use this
function to specify the location of CMA.

Cc: Marek Szyprowski 
Cc: Konrad Rzeszutek Wilk 
Cc: David Woodhouse 
Cc: Don Dutile 
Cc: Thomas Gleixner 
Cc: Ingo Molnar 
Cc: "H. Peter Anvin" 
Cc: Andi Kleen 
Cc: x...@kernel.org
Cc: io...@lists.linux-foundation.org
Signed-off-by: Akinobu Mita 
---
New patch from this version

 include/linux/memblock.h |  2 ++
 mm/memblock.c| 27 ---
 2 files changed, 22 insertions(+), 7 deletions(-)

diff --git a/include/linux/memblock.h b/include/linux/memblock.h
index 77c60e5..95e0cfa 100644
--- a/include/linux/memblock.h
+++ b/include/linux/memblock.h
@@ -176,6 +176,8 @@ static inline bool memblock_bottom_up(void) { return false; 
}
 #define MEMBLOCK_ALLOC_ANYWHERE(~(phys_addr_t)0)
 #define MEMBLOCK_ALLOC_ACCESSIBLE  0
 
+phys_addr_t __init memblock_alloc_range(phys_addr_t size, phys_addr_t align,
+   phys_addr_t start, phys_addr_t end);
 phys_addr_t memblock_alloc_base(phys_addr_t size, phys_addr_t align,
phys_addr_t max_addr);
 phys_addr_t __memblock_alloc_base(phys_addr_t size, phys_addr_t align,
diff --git a/mm/memblock.c b/mm/memblock.c
index 53e477b..83b0542 100644
--- a/mm/memblock.c
+++ b/mm/memblock.c
@@ -864,25 +864,38 @@ int __init_memblock memblock_set_node(phys_addr_t base, 
phys_addr_t size,
 }
 #endif /* CONFIG_HAVE_MEMBLOCK_NODE_MAP */
 
-static phys_addr_t __init memblock_alloc_base_nid(phys_addr_t size,
-   phys_addr_t align, phys_addr_t max_addr,
-   int nid)
+static phys_addr_t __init memblock_alloc_range_nid(phys_addr_t size,
+   phys_addr_t align, phys_addr_t start,
+   phys_addr_t end, int nid)
 {
phys_addr_t found;
 
if (WARN_ON(!align))
align = __alignof__(long long);
 
-   /* align @size to avoid excessive fragmentation on reserved array */
-   size = round_up(size, align);
-
-   found = memblock_find_in_range_node(0, max_addr, size, align, nid);
+   found = memblock_find_in_range_node(start, end, size, align, nid);
if (found && !memblock_reserve(found, size))
return found;
 
return 0;
 }
 
+phys_addr_t __init memblock_alloc_range(phys_addr_t size, phys_addr_t align,
+   phys_addr_t start, phys_addr_t end)
+{
+   return memblock_alloc_range_nid(size, align, start, end, MAX_NUMNODES);
+}
+
+static phys_addr_t __init memblock_alloc_base_nid(phys_addr_t size,
+   phys_addr_t align, phys_addr_t max_addr,
+   int nid)
+{
+   /* align @size to avoid excessive fragmentation on reserved array */
+   size = round_up(size, align);
+
+   return memblock_alloc_range_nid(size, align, 0, max_addr, nid);
+}
+
 phys_addr_t __init memblock_alloc_nid(phys_addr_t size, phys_addr_t align, int 
nid)
 {
return memblock_alloc_base_nid(size, align, MEMBLOCK_ALLOC_ACCESSIBLE, 
nid);
-- 
1.8.3.2

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH v2 4/5] memblock: introduce memblock_alloc_range()

2014-01-14 Thread Akinobu Mita
This introduces memblock_alloc_range() which allocates memblock from
the specified range of physical address.  I would like to use this
function to specify the location of CMA.

Cc: Marek Szyprowski m.szyprow...@samsung.com
Cc: Konrad Rzeszutek Wilk konrad.w...@oracle.com
Cc: David Woodhouse dw...@infradead.org
Cc: Don Dutile ddut...@redhat.com
Cc: Thomas Gleixner t...@linutronix.de
Cc: Ingo Molnar mi...@redhat.com
Cc: H. Peter Anvin h...@zytor.com
Cc: Andi Kleen a...@firstfloor.org
Cc: x...@kernel.org
Cc: io...@lists.linux-foundation.org
Signed-off-by: Akinobu Mita akinobu.m...@gmail.com
---
New patch from this version

 include/linux/memblock.h |  2 ++
 mm/memblock.c| 27 ---
 2 files changed, 22 insertions(+), 7 deletions(-)

diff --git a/include/linux/memblock.h b/include/linux/memblock.h
index 77c60e5..95e0cfa 100644
--- a/include/linux/memblock.h
+++ b/include/linux/memblock.h
@@ -176,6 +176,8 @@ static inline bool memblock_bottom_up(void) { return false; 
}
 #define MEMBLOCK_ALLOC_ANYWHERE(~(phys_addr_t)0)
 #define MEMBLOCK_ALLOC_ACCESSIBLE  0
 
+phys_addr_t __init memblock_alloc_range(phys_addr_t size, phys_addr_t align,
+   phys_addr_t start, phys_addr_t end);
 phys_addr_t memblock_alloc_base(phys_addr_t size, phys_addr_t align,
phys_addr_t max_addr);
 phys_addr_t __memblock_alloc_base(phys_addr_t size, phys_addr_t align,
diff --git a/mm/memblock.c b/mm/memblock.c
index 53e477b..83b0542 100644
--- a/mm/memblock.c
+++ b/mm/memblock.c
@@ -864,25 +864,38 @@ int __init_memblock memblock_set_node(phys_addr_t base, 
phys_addr_t size,
 }
 #endif /* CONFIG_HAVE_MEMBLOCK_NODE_MAP */
 
-static phys_addr_t __init memblock_alloc_base_nid(phys_addr_t size,
-   phys_addr_t align, phys_addr_t max_addr,
-   int nid)
+static phys_addr_t __init memblock_alloc_range_nid(phys_addr_t size,
+   phys_addr_t align, phys_addr_t start,
+   phys_addr_t end, int nid)
 {
phys_addr_t found;
 
if (WARN_ON(!align))
align = __alignof__(long long);
 
-   /* align @size to avoid excessive fragmentation on reserved array */
-   size = round_up(size, align);
-
-   found = memblock_find_in_range_node(0, max_addr, size, align, nid);
+   found = memblock_find_in_range_node(start, end, size, align, nid);
if (found  !memblock_reserve(found, size))
return found;
 
return 0;
 }
 
+phys_addr_t __init memblock_alloc_range(phys_addr_t size, phys_addr_t align,
+   phys_addr_t start, phys_addr_t end)
+{
+   return memblock_alloc_range_nid(size, align, start, end, MAX_NUMNODES);
+}
+
+static phys_addr_t __init memblock_alloc_base_nid(phys_addr_t size,
+   phys_addr_t align, phys_addr_t max_addr,
+   int nid)
+{
+   /* align @size to avoid excessive fragmentation on reserved array */
+   size = round_up(size, align);
+
+   return memblock_alloc_range_nid(size, align, 0, max_addr, nid);
+}
+
 phys_addr_t __init memblock_alloc_nid(phys_addr_t size, phys_addr_t align, int 
nid)
 {
return memblock_alloc_base_nid(size, align, MEMBLOCK_ALLOC_ACCESSIBLE, 
nid);
-- 
1.8.3.2

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/