diff mbox series

mm/cma.c: find a named CMA area by name

Message ID 20200114075147.30672-1-buddy.zhang@aliyun.com
State New
Headers show
Series mm/cma.c: find a named CMA area by name | expand

Commit Message

buddy.zhang@aliyun.com Jan. 14, 2020, 7:51 a.m. UTC
From: BuddyZhang <buddy.zhang@aliyun.com>

This function could help developer who want to find a special
named CMA area.

The CMA supports multiple named CMA areas, and the device could
use or exclusive a special CAM arae via "cma_area" on "struct
device". When probing, the device can setup special CMA area which
find by "cma_find_by_name()".

If device can't find named CMA area, "cma_find_by_name()" will
return NULL, and device will used default CMA area.

Signed-off-by: BuddyZhang <buddy.zhang@aliyun.com>
---
 mm/cma.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

Comments

David Hildenbrand Jan. 14, 2020, 9:02 a.m. UTC | #1
On 14.01.20 08:51, buddy.zhang@aliyun.com wrote:
> From: BuddyZhang <buddy.zhang@aliyun.com>
> 
> This function could help developer who want to find a special
> named CMA area.

*could help* - if there is no user, why do we need it? Or do you have a
user?

> 
> The CMA supports multiple named CMA areas, and the device could
> use or exclusive a special CAM arae via "cma_area" on "struct
> device". When probing, the device can setup special CMA area which
> find by "cma_find_by_name()".
> 
> If device can't find named CMA area, "cma_find_by_name()" will
> return NULL, and device will used default CMA area.
> 
> Signed-off-by: BuddyZhang <buddy.zhang@aliyun.com>
> ---
>  mm/cma.c | 12 ++++++++++++
>  1 file changed, 12 insertions(+)
> 
> diff --git a/mm/cma.c b/mm/cma.c
> index be55d1988c67..b562557572c4 100644
> --- a/mm/cma.c
> +++ b/mm/cma.c
> @@ -40,6 +40,18 @@ struct cma cma_areas[MAX_CMA_AREAS];
>  unsigned cma_area_count;
>  static DEFINE_MUTEX(cma_mutex);
>  
> +struct cma *cma_find_by_name(const char *name)
> +{
> +	int idx;
> +
> +	for (idx = 0; idx < MAX_CMA_AREAS; idx++) {
> +		if (cma_areas[idx].name && !strcmp(name, cma_areas[idx].name))
> +			return &cma_areas[idx];
> +	}
> +	return NULL;
> +}
> +EXPORT_SYMBOL(cma_find_by_name)
> +
>  phys_addr_t cma_get_base(const struct cma *cma)
>  {
>  	return PFN_PHYS(cma->base_pfn);
>
kernel test robot Jan. 16, 2020, 4:21 a.m. UTC | #2
Hi,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on mmotm/master]
[also build test ERROR on linus/master v5.5-rc6 next-20200110]
[if your patch is applied to the wrong git tree, please drop us a note to help
improve the system. BTW, we also suggest to use '--base' option to specify the
base tree in git format-patch, please see https://stackoverflow.com/a/37406982]

url:    https://github.com/0day-ci/linux/commits/buddy-zhang-aliyun-com/mm-cma-c-find-a-named-CMA-area-by-name/20200114-155334
base:   git://git.cmpxchg.org/linux-mmotm.git master
config: i386-randconfig-a002-20200115 (attached as .config)
compiler: gcc-7 (Debian 7.5.0-3) 7.5.0
reproduce:
        # save the attached .config to linux build tree
        make ARCH=i386 

If you fix the issue, kindly add following tag
Reported-by: kbuild test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   mm/cma.c:55:1: error: expected ';' before 'phys_addr_t'
    phys_addr_t cma_get_base(const struct cma *cma)
    ^~~~~~~~~~~
   mm/cma.c: In function 'cma_alloc':
   mm/cma.c:449:9: error: implicit declaration of function 'cma_bitmap_aligned_mask'; did you mean 'cma_bitmap_maxno'? [-Werror=implicit-function-declaration]
     mask = cma_bitmap_aligned_mask(cma, align);
            ^~~~~~~~~~~~~~~~~~~~~~~
            cma_bitmap_maxno
   mm/cma.c:450:11: error: implicit declaration of function 'cma_bitmap_aligned_offset'; did you mean 'cma_bitmap_maxno'? [-Werror=implicit-function-declaration]
     offset = cma_bitmap_aligned_offset(cma, align);
              ^~~~~~~~~~~~~~~~~~~~~~~~~
              cma_bitmap_maxno
   mm/cma.c:452:17: error: implicit declaration of function 'cma_bitmap_pages_to_bits'; did you mean 'cma_bitmap_maxno'? [-Werror=implicit-function-declaration]
     bitmap_count = cma_bitmap_pages_to_bits(cma, count);
                    ^~~~~~~~~~~~~~~~~~~~~~~~
                    cma_bitmap_maxno
>> mm/cma.c:484:3: error: implicit declaration of function 'cma_clear_bitmap'; did you mean 'cr4_clear_bits'? [-Werror=implicit-function-declaration]
      cma_clear_bitmap(cma, pfn, count);
      ^~~~~~~~~~~~~~~~
      cr4_clear_bits
   cc1: some warnings being treated as errors

vim +484 mm/cma.c

dbe43d4d2837da Jaewon Kim       2017-02-24  418  
a254129e8686bf Joonsoo Kim      2014-08-06  419  /**
a254129e8686bf Joonsoo Kim      2014-08-06  420   * cma_alloc() - allocate pages from contiguous area
a254129e8686bf Joonsoo Kim      2014-08-06  421   * @cma:   Contiguous memory region for which the allocation is performed.
a254129e8686bf Joonsoo Kim      2014-08-06  422   * @count: Requested number of pages.
a254129e8686bf Joonsoo Kim      2014-08-06  423   * @align: Requested alignment of pages (in PAGE_SIZE order).
6518202970c105 Marek Szyprowski 2018-08-17  424   * @no_warn: Avoid printing message about failed allocation
a254129e8686bf Joonsoo Kim      2014-08-06  425   *
a254129e8686bf Joonsoo Kim      2014-08-06  426   * This function allocates part of contiguous memory on specific
a254129e8686bf Joonsoo Kim      2014-08-06  427   * contiguous memory area.
a254129e8686bf Joonsoo Kim      2014-08-06  428   */
e2f466e32f56c8 Lucas Stach      2017-02-24  429  struct page *cma_alloc(struct cma *cma, size_t count, unsigned int align,
6518202970c105 Marek Szyprowski 2018-08-17  430  		       bool no_warn)
a254129e8686bf Joonsoo Kim      2014-08-06  431  {
3acaea6804b3a1 Andrew Morton    2015-11-05  432  	unsigned long mask, offset;
3acaea6804b3a1 Andrew Morton    2015-11-05  433  	unsigned long pfn = -1;
3acaea6804b3a1 Andrew Morton    2015-11-05  434  	unsigned long start = 0;
a254129e8686bf Joonsoo Kim      2014-08-06  435  	unsigned long bitmap_maxno, bitmap_no, bitmap_count;
2813b9c0296259 Andrey Konovalov 2018-12-28  436  	size_t i;
a254129e8686bf Joonsoo Kim      2014-08-06  437  	struct page *page = NULL;
dbe43d4d2837da Jaewon Kim       2017-02-24  438  	int ret = -ENOMEM;
a254129e8686bf Joonsoo Kim      2014-08-06  439  
a254129e8686bf Joonsoo Kim      2014-08-06  440  	if (!cma || !cma->count)
a254129e8686bf Joonsoo Kim      2014-08-06  441  		return NULL;
a254129e8686bf Joonsoo Kim      2014-08-06  442  
67a2e213e7e937 Rohit Vaswani    2015-10-22  443  	pr_debug("%s(cma %p, count %zu, align %d)\n", __func__, (void *)cma,
a254129e8686bf Joonsoo Kim      2014-08-06  444  		 count, align);
a254129e8686bf Joonsoo Kim      2014-08-06  445  
a254129e8686bf Joonsoo Kim      2014-08-06  446  	if (!count)
a254129e8686bf Joonsoo Kim      2014-08-06  447  		return NULL;
a254129e8686bf Joonsoo Kim      2014-08-06  448  
a254129e8686bf Joonsoo Kim      2014-08-06  449  	mask = cma_bitmap_aligned_mask(cma, align);
b5be83e308f70e Gregory Fong     2014-12-12 @450  	offset = cma_bitmap_aligned_offset(cma, align);
a254129e8686bf Joonsoo Kim      2014-08-06  451  	bitmap_maxno = cma_bitmap_maxno(cma);
a254129e8686bf Joonsoo Kim      2014-08-06  452  	bitmap_count = cma_bitmap_pages_to_bits(cma, count);
a254129e8686bf Joonsoo Kim      2014-08-06  453  
6b36ba599d602d Shiraz Hashim    2016-11-10  454  	if (bitmap_count > bitmap_maxno)
6b36ba599d602d Shiraz Hashim    2016-11-10  455  		return NULL;
6b36ba599d602d Shiraz Hashim    2016-11-10  456  
a254129e8686bf Joonsoo Kim      2014-08-06  457  	for (;;) {
a254129e8686bf Joonsoo Kim      2014-08-06  458  		mutex_lock(&cma->lock);
b5be83e308f70e Gregory Fong     2014-12-12  459  		bitmap_no = bitmap_find_next_zero_area_off(cma->bitmap,
b5be83e308f70e Gregory Fong     2014-12-12  460  				bitmap_maxno, start, bitmap_count, mask,
b5be83e308f70e Gregory Fong     2014-12-12  461  				offset);
a254129e8686bf Joonsoo Kim      2014-08-06  462  		if (bitmap_no >= bitmap_maxno) {
a254129e8686bf Joonsoo Kim      2014-08-06  463  			mutex_unlock(&cma->lock);
a254129e8686bf Joonsoo Kim      2014-08-06  464  			break;
a254129e8686bf Joonsoo Kim      2014-08-06  465  		}
a254129e8686bf Joonsoo Kim      2014-08-06  466  		bitmap_set(cma->bitmap, bitmap_no, bitmap_count);
a254129e8686bf Joonsoo Kim      2014-08-06  467  		/*
a254129e8686bf Joonsoo Kim      2014-08-06  468  		 * It's safe to drop the lock here. We've marked this region for
a254129e8686bf Joonsoo Kim      2014-08-06  469  		 * our exclusive use. If the migration fails we will take the
a254129e8686bf Joonsoo Kim      2014-08-06  470  		 * lock again and unmark it.
a254129e8686bf Joonsoo Kim      2014-08-06  471  		 */
a254129e8686bf Joonsoo Kim      2014-08-06  472  		mutex_unlock(&cma->lock);
a254129e8686bf Joonsoo Kim      2014-08-06  473  
a254129e8686bf Joonsoo Kim      2014-08-06  474  		pfn = cma->base_pfn + (bitmap_no << cma->order_per_bit);
a254129e8686bf Joonsoo Kim      2014-08-06  475  		mutex_lock(&cma_mutex);
ca96b625341027 Lucas Stach      2017-02-24  476  		ret = alloc_contig_range(pfn, pfn + count, MIGRATE_CMA,
6518202970c105 Marek Szyprowski 2018-08-17  477  				     GFP_KERNEL | (no_warn ? __GFP_NOWARN : 0));
a254129e8686bf Joonsoo Kim      2014-08-06  478  		mutex_unlock(&cma_mutex);
a254129e8686bf Joonsoo Kim      2014-08-06  479  		if (ret == 0) {
a254129e8686bf Joonsoo Kim      2014-08-06  480  			page = pfn_to_page(pfn);
a254129e8686bf Joonsoo Kim      2014-08-06  481  			break;
a254129e8686bf Joonsoo Kim      2014-08-06  482  		}
b7155e76a702d9 Joonsoo Kim      2014-08-06  483  
a254129e8686bf Joonsoo Kim      2014-08-06 @484  		cma_clear_bitmap(cma, pfn, count);
b7155e76a702d9 Joonsoo Kim      2014-08-06  485  		if (ret != -EBUSY)
b7155e76a702d9 Joonsoo Kim      2014-08-06  486  			break;
b7155e76a702d9 Joonsoo Kim      2014-08-06  487  
a254129e8686bf Joonsoo Kim      2014-08-06  488  		pr_debug("%s(): memory range at %p is busy, retrying\n",
a254129e8686bf Joonsoo Kim      2014-08-06  489  			 __func__, pfn_to_page(pfn));
a254129e8686bf Joonsoo Kim      2014-08-06  490  		/* try again with a bit different memory target */
a254129e8686bf Joonsoo Kim      2014-08-06  491  		start = bitmap_no + mask + 1;
a254129e8686bf Joonsoo Kim      2014-08-06  492  	}
a254129e8686bf Joonsoo Kim      2014-08-06  493  
3acaea6804b3a1 Andrew Morton    2015-11-05  494  	trace_cma_alloc(pfn, page, count, align);
99e8ea6cd2210c Stefan Strogin   2015-04-15  495  
2813b9c0296259 Andrey Konovalov 2018-12-28  496  	/*
2813b9c0296259 Andrey Konovalov 2018-12-28  497  	 * CMA can allocate multiple page blocks, which results in different
2813b9c0296259 Andrey Konovalov 2018-12-28  498  	 * blocks being marked with different tags. Reset the tags to ignore
2813b9c0296259 Andrey Konovalov 2018-12-28  499  	 * those page blocks.
2813b9c0296259 Andrey Konovalov 2018-12-28  500  	 */
2813b9c0296259 Andrey Konovalov 2018-12-28  501  	if (page) {
2813b9c0296259 Andrey Konovalov 2018-12-28  502  		for (i = 0; i < count; i++)
2813b9c0296259 Andrey Konovalov 2018-12-28  503  			page_kasan_tag_reset(page + i);
2813b9c0296259 Andrey Konovalov 2018-12-28  504  	}
2813b9c0296259 Andrey Konovalov 2018-12-28  505  
6518202970c105 Marek Szyprowski 2018-08-17  506  	if (ret && !no_warn) {
5984af1082f3b1 Pintu Agarwal    2017-11-15  507  		pr_err("%s: alloc failed, req-size: %zu pages, ret: %d\n",
dbe43d4d2837da Jaewon Kim       2017-02-24  508  			__func__, count, ret);
dbe43d4d2837da Jaewon Kim       2017-02-24  509  		cma_debug_show_areas(cma);
dbe43d4d2837da Jaewon Kim       2017-02-24  510  	}
dbe43d4d2837da Jaewon Kim       2017-02-24  511  
a254129e8686bf Joonsoo Kim      2014-08-06  512  	pr_debug("%s(): returned %p\n", __func__, page);
a254129e8686bf Joonsoo Kim      2014-08-06  513  	return page;
a254129e8686bf Joonsoo Kim      2014-08-06  514  }
a254129e8686bf Joonsoo Kim      2014-08-06  515  

:::::: The code at line 484 was first introduced by commit
:::::: a254129e8686bff7a340b58f35241b04927e81c0 CMA: generalize CMA reserved area management functionality

:::::: TO: Joonsoo Kim <iamjoonsoo.kim@lge.com>
:::::: CC: Linus Torvalds <torvalds@linux-foundation.org>

---
0-DAY kernel test infrastructure                 Open Source Technology Center
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org Intel Corporation
kernel test robot Jan. 17, 2020, 4:17 a.m. UTC | #3
Hi,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on mmotm/master]
[also build test ERROR on next-20200110]
[if your patch is applied to the wrong git tree, please drop us a note to help
improve the system. BTW, we also suggest to use '--base' option to specify the
base tree in git format-patch, please see https://stackoverflow.com/a/37406982]

url:    https://github.com/0day-ci/linux/commits/buddy-zhang-aliyun-com/mm-cma-c-find-a-named-CMA-area-by-name/20200114-155334
base:   git://git.cmpxchg.org/linux-mmotm.git master
config: m68k-allmodconfig (attached as .config)
compiler: m68k-linux-gcc (GCC) 7.5.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        GCC_VERSION=7.5.0 make.cross ARCH=m68k 

If you fix the issue, kindly add following tag
Reported-by: kbuild test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

>> mm/cma.c:55:1: error: expected ',' or ';' before 'phys_addr_t'
    phys_addr_t cma_get_base(const struct cma *cma)
    ^~~~~~~~~~~

vim +55 mm/cma.c

0095fc296f5cf9 BuddyZhang  2020-01-14  54  
ac173824959ade Sasha Levin 2015-04-14 @55  phys_addr_t cma_get_base(const struct cma *cma)
a254129e8686bf Joonsoo Kim 2014-08-06  56  {
a254129e8686bf Joonsoo Kim 2014-08-06  57  	return PFN_PHYS(cma->base_pfn);
a254129e8686bf Joonsoo Kim 2014-08-06  58  }
a254129e8686bf Joonsoo Kim 2014-08-06  59  

:::::: The code at line 55 was first introduced by commit
:::::: ac173824959adeb489f9fcf88858774c4535a241 mm: cma: constify and use correct signness in mm/cma.c

:::::: TO: Sasha Levin <sasha.levin@oracle.com>
:::::: CC: Linus Torvalds <torvalds@linux-foundation.org>

---
0-DAY kernel test infrastructure                 Open Source Technology Center
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org Intel Corporation
diff mbox series

Patch

diff --git a/mm/cma.c b/mm/cma.c
index be55d1988c67..b562557572c4 100644
--- a/mm/cma.c
+++ b/mm/cma.c
@@ -40,6 +40,18 @@  struct cma cma_areas[MAX_CMA_AREAS];
 unsigned cma_area_count;
 static DEFINE_MUTEX(cma_mutex);
 
+struct cma *cma_find_by_name(const char *name)
+{
+	int idx;
+
+	for (idx = 0; idx < MAX_CMA_AREAS; idx++) {
+		if (cma_areas[idx].name && !strcmp(name, cma_areas[idx].name))
+			return &cma_areas[idx];
+	}
+	return NULL;
+}
+EXPORT_SYMBOL(cma_find_by_name)
+
 phys_addr_t cma_get_base(const struct cma *cma)
 {
 	return PFN_PHYS(cma->base_pfn);