dma-buf: cma_heap: Check for device max segment size when attaching
Subsystems (2)
PATCH 1/1 dma-buf: cma_heap: Check for device max segment size when attaching
Although there is usually not such a limitation (and when there is it is often only because the driver forgot to change the super small default), it is still correct here to break scatterlist element into chunks of dma_max_mapping_size().
This might cause some issues for users with misbehaving drivers. If bisecting has landed you on this commit, make sure your drivers both set dma_set_max_seg_size() and are checking for contiguousness correctly.
--- drivers/dma-buf/heaps/cma_heap.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
drivers/dma-buf/heaps/cma_heap.c +5 -4
@@ -58,10 +58,11 @@ static int cma_heap_attach(struct dma_buf *dmabuf,if (!a)return -ENOMEM ; - ret =sg_alloc_table_from_pages (&a->table, buffer->pages, - buffer->pagecount,0 , - buffer->pagecount <<PAGE_SHIFT , -GFP_KERNEL ); +size_t max_segment =dma_get_max_seg_size (attachment->dev); + ret =sg_alloc_table_from_pages_segment (&a->table, buffer->pages, + buffer->pagecount,0 , + buffer->pagecount <<PAGE_SHIFT , + max_segment,GFP_KERNEL );if (ret) {kfree (a);return ret;
Signature · 1 line
2.36.1
kernel test robot
build botThank you for the patch! Perhaps something to improve:
Hi Andrew,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on drm-misc/drm-misc-next]
[also build test WARNING on linus/master v6.0-rc2 next-20220822] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Andrew-Davis/dma-buf-cma_heap-Check-for-device-max-segment-size-when-attaching/20220823-073240 base: git://anongit.freedesktop.org/drm/drm-misc drm-misc-next config: s390-allyesconfig (https://download.01.org/0day-ci/archive/20220823/[email protected]/config) compiler: s390-linux-gcc (GCC) 12.1.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/intel-lab-lkp/linux/commit/f390cef50ba6681ea767283e413cb8e9f8f2b426
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Andrew-Davis/dma-buf-cma_heap-Check-for-device-max-segment-size-when-attaching/20220823-073240 git checkout f390cef50ba6681ea767283e413cb8e9f8f2b426
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=s390 SHELL=/bin/bash drivers/dma-buf/
If you fix the issue, kindly add following tag where applicable
All warnings (new ones prefixed by >>):
drivers/dma-buf/heaps/cma_heap.c: In function 'cma_heap_attach':
>> drivers/dma-buf/heaps/cma_heap.c:61:9: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
61 | size_t max_segment = dma_get_max_seg_size(attachment->dev);
| ^~~~~~vim +61 drivers/dma-buf/heaps/cma_heap.c
49
50 static int cma_heap_attach(struct dma_buf *dmabuf,
51 struct dma_buf_attachment *attachment)
52 {
53 struct cma_heap_buffer *buffer = dmabuf->priv;
54 struct dma_heap_attachment *a;
55 int ret;
56
57 a = kzalloc(sizeof(*a), GFP_KERNEL);
58 if (!a)
59 return -ENOMEM;
60
> 61 size_t max_segment = dma_get_max_seg_size(attachment->dev);
62 ret = sg_alloc_table_from_pages_segment(&a->table, buffer->pages,
63 buffer->pagecount, 0,
64 buffer->pagecount << PAGE_SHIFT,
65 max_segment, GFP_KERNEL);
66 if (ret) {
67 kfree(a);
68 return ret;
69 }
70
71 a->dev = attachment->dev;
72 INIT_LIST_HEAD(&a->list);
73 a->mapped = false;
74
75 attachment->priv = a;
76
77 mutex_lock(&buffer->lock);
78 list_add(&a->list, &buffer->attachments);
79 mutex_unlock(&buffer->lock);
80
81 return 0;
82 }
83 Signature · 2 lines
0-DAY CI Kernel Test Service https://01.org/lkp
Quoted 25 lines · kernel test robot
Hi Andrew,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on drm-misc/drm-misc-next]
[also build test WARNING on linus/master v6.0-rc2 next-20220822] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]url: https://github.com/intel-lab-lkp/linux/commits/Andrew-Davis/dma-buf-cma_heap-Check-for-device-max-segment-size-when-attaching/20220823-073240 base: git://anongit.freedesktop.org/drm/drm-misc drm-misc-next config: s390-allyesconfig (https://download.01.org/0day-ci/archive/20220823/202208230840.npLcmvVn-lkp(a)intel.com/config) compiler: s390-linux-gcc (GCC) 12.1.0reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/intel-lab-lkp/linux/commit/f390cef50ba6681ea767283e413cb8e9f8f2b426
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Andrew-Davis/dma-buf-cma_heap-Check-for-device-max-segment-size-when-attaching/20220823-073240 git checkoutf390cef50ba6681ea767283e413cb8e9f8f2b426
# save the config file
mkdirbuild_dir&& cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=s390 SHELL=/bin/bashdrivers/dma-buf/
Quoted 7 lines
If you fix the issue, kindly add following tag where applicable
Reported-by kernel test robot <[email protected]>All warnings (new ones prefixed by >>):
drivers/dma-buf/heaps/cma_heap.c: In function 'cma_heap_attach':Quoted 1 line
Quoted 1 line
drivers/dma-buf/heaps/cma_heap.c:61:9: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
Hmm, thought someone removed this warning after we switched to C11, maybe it is time again for some brave soul to re-poke that topic..
Not sure why I missed it when compiling though, will fix for v2.
Andrew
Quoted 42 lines
61 | size_t max_segment = dma_get_max_seg_size(attachment->dev); | ^~~~~~vim +61
drivers/dma-buf/heaps/cma_heap.c49 50 static int cma_heap_attach(struct dma_buf *dmabuf, 51 struct dma_buf_attachment *attachment) 52 { 53 struct cma_heap_buffer *buffer = dmabuf->priv; 54 struct dma_heap_attachment *a; 55 int ret; 56 57 a = kzalloc(sizeof(*a), GFP_KERNEL); 58 if (!a) 59 return -ENOMEM; 60Quoted 1 line
61
size_tmax_segment=dma_get_max_seg_size(attachment->dev);62 ret = sg_alloc_table_from_pages_segment(&a->table, buffer->pages, 63 buffer->pagecount, 0, 64 buffer->pagecount << PAGE_SHIFT, 65 max_segment, GFP_KERNEL); 66 if (ret) { 67 kfree(a); 68 return ret; 69 } 70 71 a->dev = attachment->dev; 72 INIT_LIST_HEAD(&a->list); 73 a->mapped = false; 74 75 attachment->priv = a; 76 77 mutex_lock(&buffer->lock); 78 list_add(&a->list, &buffer->attachments); 79 mutex_unlock(&buffer->lock); 80 81 return 0; 82 } 83
kernel test robot
build botThank you for the patch! Perhaps something to improve:
Hi Andrew,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on drm-misc/drm-misc-next]
[also build test WARNING on linus/master v6.0-rc2 next-20220823] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Andrew-Davis/dma-buf-cma_heap-Check-for-device-max-segment-size-when-attaching/20220823-073240 base: git://anongit.freedesktop.org/drm/drm-misc drm-misc-next config: x86_64-randconfig-a002-20220822 (https://download.01.org/0day-ci/archive/20220823/[email protected]/config) compiler: clang version 14.0.6 (https://github.com/llvm/llvm-project f28c006a5895fc0e329fe15fead81e37457cb1d1)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/intel-lab-lkp/linux/commit/f390cef50ba6681ea767283e413cb8e9f8f2b426
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Andrew-Davis/dma-buf-cma_heap-Check-for-device-max-segment-size-when-attaching/20220823-073240 git checkout f390cef50ba6681ea767283e413cb8e9f8f2b426
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=x86_64 SHELL=/bin/bash drivers/dma-buf/heaps/
If you fix the issue, kindly add following tag where applicable
All warnings (new ones prefixed by >>):
>> drivers/dma-buf/heaps/cma_heap.c:61:9: warning: mixing declarations and code is incompatible with standards before C99 [-Wdeclaration-after-statement]
size_t max_segment = dma_get_max_seg_size(attachment->dev);
^1 warning generated.
vim +61 drivers/dma-buf/heaps/cma_heap.c
49
50 static int cma_heap_attach(struct dma_buf *dmabuf,
51 struct dma_buf_attachment *attachment)
52 {
53 struct cma_heap_buffer *buffer = dmabuf->priv;
54 struct dma_heap_attachment *a;
55 int ret;
56
57 a = kzalloc(sizeof(*a), GFP_KERNEL);
58 if (!a)
59 return -ENOMEM;
60
> 61 size_t max_segment = dma_get_max_seg_size(attachment->dev);
62 ret = sg_alloc_table_from_pages_segment(&a->table, buffer->pages,
63 buffer->pagecount, 0,
64 buffer->pagecount << PAGE_SHIFT,
65 max_segment, GFP_KERNEL);
66 if (ret) {
67 kfree(a);
68 return ret;
69 }
70
71 a->dev = attachment->dev;
72 INIT_LIST_HEAD(&a->list);
73 a->mapped = false;
74
75 attachment->priv = a;
76
77 mutex_lock(&buffer->lock);
78 list_add(&a->list, &buffer->attachments);
79 mutex_unlock(&buffer->lock);
80
81 return 0;
82 }
83 Signature · 2 lines
0-DAY CI Kernel Test Service https://01.org/lkp