Re: [PATCH v2 2/8] media: videobuf2: Make bufs array dynamic allocated
From: Tomasz Figa <tfiga@chromium.org>
Date: 2023-05-19 10:00:40
Also in:
linux-arm-msm, linux-media, linux-mediatek, linux-rockchip, lkml, oe-kbuild, oe-kbuild-all
On Fri, Mar 24, 2023 at 09:56:34AM +0100, Benjamin Gaignard wrote:
Le 24/03/2023 à 09:52, Hans Verkuil a écrit :quoted
On 24/03/2023 09:48, Laurent Pinchart wrote:quoted
On Fri, Mar 24, 2023 at 09:31:35AM +0100, Hans Verkuil wrote:quoted
On 24/03/2023 09:11, Benjamin Gaignard wrote:quoted
Le 24/03/2023 à 06:01, Dan Carpenter a écrit :quoted
Hi Benjamin, https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Benjamin-Gaignard/media-videobuf2-Access-vb2_queue-bufs-array-through-helper-functions/20230321-183154 base: git://linuxtv.org/media_tree.git master patch link: https://lore.kernel.org/r/20230321102855.346732-3-benjamin.gaignard%40collabora.com patch subject: [PATCH v2 2/8] media: videobuf2: Make bufs array dynamic allocated config: arm64-randconfig-m041-20230319 (https://download.01.org/0day-ci/archive/20230324/202303240148.lKRnUqW9-lkp@intel.com/config) compiler: aarch64-linux-gcc (GCC) 12.1.0 If you fix the issue, kindly add following tag where applicable | Reported-by: kernel test robot [off-list ref] | Reported-by: Dan Carpenter [off-list ref] | Link: https://lore.kernel.org/r/202303240148.lKRnUqW9-lkp@intel.com/ (local) smatch warnings: include/media/videobuf2-core.h:1272 vb2_queue_add_buffer() warn: sleeping in atomic context drivers/media/common/videobuf2/videobuf2-core.c:2456 vb2_core_queue_init() warn: Please consider using kcalloc instead of kmalloc_array vim +1272 include/media/videobuf2-core.h 625d46c1c1fe8e Benjamin Gaignard 2023-03-21 1263 static inline bool vb2_queue_add_buffer(struct vb2_queue *q, struct vb2_buffer *vb) 625d46c1c1fe8e Benjamin Gaignard 2023-03-21 1264 { 487d3f14d12ecf Benjamin Gaignard 2023-03-21 1265 bool ret = false; 487d3f14d12ecf Benjamin Gaignard 2023-03-21 1266 487d3f14d12ecf Benjamin Gaignard 2023-03-21 1267 spin_lock(&q->bufs_lock); ^^^^^^^^^^^^^^^^^^^^^^^ Holding a spin lock. 487d3f14d12ecf Benjamin Gaignard 2023-03-21 1268 487d3f14d12ecf Benjamin Gaignard 2023-03-21 1269 if (vb->index >= q->max_num_bufs) { 487d3f14d12ecf Benjamin Gaignard 2023-03-21 1270 struct vb2_buffer **tmp; 487d3f14d12ecf Benjamin Gaignard 2023-03-21 1271 487d3f14d12ecf Benjamin Gaignard 2023-03-21 @1272 tmp = krealloc_array(q->bufs, q->max_num_bufs * 2, sizeof(*q->bufs), GFP_KERNEL); ^^^^^^^^^^ Sleeping allocation. GFP_ATOMIC? Or is there a way to move the allocation outside the lock?I will add GFP_ATOMIC flag in next version.No need. Instead, don't use realloc here, just allocate a new array, copy over all the data from the old, and then switch q->bufs with the spinlock held. Then you can free the old one. It's only when you update q->bufs that you need the lock.The copy also needs to be protected by the lock.I suspect that that is not needed, since you shouldn't be able to add buffers here since a mutex should be held at this time. That said, it's something that Benjamin needs to analyze.
I spent some time looking through the call sites of vb2_get_buffer() and how those can be called and it turned out to be a massive list of code paths, including a lot of calls originating from codec drivers calling vb2_find_buffer() in random contexts (possibly even interrupt). So a spinlock protecting the array pointer makes sense indeed.
Does using GFP_ATOMIC is problematic ?
Yes, because the ability to reclaim memory is drastically limited and the allocation is more likely to fail (as in: it's actually possible). (And generally the time with interrupts disabled should be minimized to keep system latency reasonable.) Best regards, Tomasz _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel