5050#include <linux/sizes.h>
5151#include <linux/dma-map-ops.h>
5252#include <linux/cma.h>
53+ #include <linux/nospec.h>
5354
5455#ifdef CONFIG_CMA_SIZE_MBYTES
5556#define CMA_SIZE_MBYTES CONFIG_CMA_SIZE_MBYTES
@@ -96,11 +97,44 @@ static int __init early_cma(char *p)
9697}
9798early_param ("cma" , early_cma );
9899
99- #ifdef CONFIG_DMA_PERNUMA_CMA
100+ #ifdef CONFIG_DMA_NUMA_CMA
100101
102+ static struct cma * dma_contiguous_numa_area [MAX_NUMNODES ];
103+ static phys_addr_t numa_cma_size [MAX_NUMNODES ] __initdata ;
101104static struct cma * dma_contiguous_pernuma_area [MAX_NUMNODES ];
102105static phys_addr_t pernuma_size_bytes __initdata ;
103106
107+ static int __init early_numa_cma (char * p )
108+ {
109+ int nid , count = 0 ;
110+ unsigned long tmp ;
111+ char * s = p ;
112+
113+ while (* s ) {
114+ if (sscanf (s , "%lu%n" , & tmp , & count ) != 1 )
115+ break ;
116+
117+ if (s [count ] == ':' ) {
118+ if (tmp >= MAX_NUMNODES )
119+ break ;
120+ nid = array_index_nospec (tmp , MAX_NUMNODES );
121+
122+ s += count + 1 ;
123+ tmp = memparse (s , & s );
124+ numa_cma_size [nid ] = tmp ;
125+
126+ if (* s == ',' )
127+ s ++ ;
128+ else
129+ break ;
130+ } else
131+ break ;
132+ }
133+
134+ return 0 ;
135+ }
136+ early_param ("numa_cma" , early_numa_cma );
137+
104138static int __init early_cma_pernuma (char * p )
105139{
106140 pernuma_size_bytes = memparse (p , & p );
@@ -127,34 +161,47 @@ static inline __maybe_unused phys_addr_t cma_early_percent_memory(void)
127161
128162#endif
129163
130- #ifdef CONFIG_DMA_PERNUMA_CMA
131- static void __init dma_pernuma_cma_reserve (void )
164+ #ifdef CONFIG_DMA_NUMA_CMA
165+ static void __init dma_numa_cma_reserve (void )
132166{
133167 int nid ;
134168
135- if (!pernuma_size_bytes )
136- return ;
137-
138- for_each_online_node (nid ) {
169+ for_each_node (nid ) {
139170 int ret ;
140171 char name [CMA_MAX_NAME ];
141- struct cma * * cma = & dma_contiguous_pernuma_area [nid ];
142-
143- snprintf (name , sizeof (name ), "pernuma%d" , nid );
144- ret = cma_declare_contiguous_nid (0 , pernuma_size_bytes , 0 , 0 ,
145- 0 , false, name , cma , nid );
146- if (ret ) {
147- pr_warn ("%s: reservation failed: err %d, node %d" , __func__ ,
148- ret , nid );
172+ struct cma * * cma ;
173+
174+ if (!node_online (nid )) {
175+ if (pernuma_size_bytes || numa_cma_size [nid ])
176+ pr_warn ("invalid node %d specified\n" , nid );
149177 continue ;
150178 }
151179
152- pr_debug ("%s: reserved %llu MiB on node %d\n" , __func__ ,
153- (unsigned long long )pernuma_size_bytes / SZ_1M , nid );
180+ if (pernuma_size_bytes ) {
181+
182+ cma = & dma_contiguous_pernuma_area [nid ];
183+ snprintf (name , sizeof (name ), "pernuma%d" , nid );
184+ ret = cma_declare_contiguous_nid (0 , pernuma_size_bytes , 0 , 0 ,
185+ 0 , false, name , cma , nid );
186+ if (ret )
187+ pr_warn ("%s: reservation failed: err %d, node %d" , __func__ ,
188+ ret , nid );
189+ }
190+
191+ if (numa_cma_size [nid ]) {
192+
193+ cma = & dma_contiguous_numa_area [nid ];
194+ snprintf (name , sizeof (name ), "numa%d" , nid );
195+ ret = cma_declare_contiguous_nid (0 , numa_cma_size [nid ], 0 , 0 , 0 , false,
196+ name , cma , nid );
197+ if (ret )
198+ pr_warn ("%s: reservation failed: err %d, node %d" , __func__ ,
199+ ret , nid );
200+ }
154201 }
155202}
156203#else
157- static inline void __init dma_pernuma_cma_reserve (void )
204+ static inline void __init dma_numa_cma_reserve (void )
158205{
159206}
160207#endif
@@ -175,7 +222,7 @@ void __init dma_contiguous_reserve(phys_addr_t limit)
175222 phys_addr_t selected_limit = limit ;
176223 bool fixed = false;
177224
178- dma_pernuma_cma_reserve ();
225+ dma_numa_cma_reserve ();
179226
180227 pr_debug ("%s(limit %08lx)\n" , __func__ , (unsigned long )limit );
181228
@@ -309,7 +356,7 @@ static struct page *cma_alloc_aligned(struct cma *cma, size_t size, gfp_t gfp)
309356 */
310357struct page * dma_alloc_contiguous (struct device * dev , size_t size , gfp_t gfp )
311358{
312- #ifdef CONFIG_DMA_PERNUMA_CMA
359+ #ifdef CONFIG_DMA_NUMA_CMA
313360 int nid = dev_to_node (dev );
314361#endif
315362
@@ -321,7 +368,7 @@ struct page *dma_alloc_contiguous(struct device *dev, size_t size, gfp_t gfp)
321368 if (size <= PAGE_SIZE )
322369 return NULL ;
323370
324- #ifdef CONFIG_DMA_PERNUMA_CMA
371+ #ifdef CONFIG_DMA_NUMA_CMA
325372 if (nid != NUMA_NO_NODE && !(gfp & (GFP_DMA | GFP_DMA32 ))) {
326373 struct cma * cma = dma_contiguous_pernuma_area [nid ];
327374 struct page * page ;
@@ -331,6 +378,13 @@ struct page *dma_alloc_contiguous(struct device *dev, size_t size, gfp_t gfp)
331378 if (page )
332379 return page ;
333380 }
381+
382+ cma = dma_contiguous_numa_area [nid ];
383+ if (cma ) {
384+ page = cma_alloc_aligned (cma , size , gfp );
385+ if (page )
386+ return page ;
387+ }
334388 }
335389#endif
336390 if (!dma_contiguous_default_area )
@@ -362,10 +416,13 @@ void dma_free_contiguous(struct device *dev, struct page *page, size_t size)
362416 /*
363417 * otherwise, page is from either per-numa cma or default cma
364418 */
365- #ifdef CONFIG_DMA_PERNUMA_CMA
419+ #ifdef CONFIG_DMA_NUMA_CMA
366420 if (cma_release (dma_contiguous_pernuma_area [page_to_nid (page )],
367421 page , count ))
368422 return ;
423+ if (cma_release (dma_contiguous_numa_area [page_to_nid (page )],
424+ page , count ))
425+ return ;
369426#endif
370427 if (cma_release (dma_contiguous_default_area , page , count ))
371428 return ;
0 commit comments