From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759420Ab3HNHaP (ORCPT ); Wed, 14 Aug 2013 03:30:15 -0400 Received: from ams-iport-3.cisco.com ([144.254.224.146]:30103 "EHLO ams-iport-3.cisco.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1759386Ab3HNHaI (ORCPT ); Wed, 14 Aug 2013 03:30:08 -0400 X-IronPort-AV: E=Sophos;i="4.89,871,1367971200"; d="scan'208";a="16646102" From: Hans Verkuil To: Ricardo Ribalda Delgado Subject: Re: [PATCH] v4l2-dev: Fix race condition on __video_register_device Date: Wed, 14 Aug 2013 09:29:29 +0200 User-Agent: KMail/1.13.7 (Linux/3.10-0.slh.1-aptosid-amd64; KDE/4.8.4; x86_64; ; ) Cc: Mauro Carvalho Chehab , Hans Verkuil , Tomasz Stanislawski , Sakari Ailus , Frank =?utf-8?q?Sch=C3=A4fer?= , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org References: <1376406247-18757-1-git-send-email-ricardo.ribalda@gmail.com> In-Reply-To: <1376406247-18757-1-git-send-email-ricardo.ribalda@gmail.com> MIME-Version: 1.0 Content-Type: Text/Plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <201308140929.29682.hverkuil@xs4all.nl> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue 13 August 2013 17:04:06 Ricardo Ribalda Delgado wrote: > When 2 devices are registered at the same time, in Part 2 both will get > the same minor number, making Part6 crash, because it cannot create a > create a device with a duplicated minor: You would expect that such core code would be bug free by now, but this is indeed a race condition. Acked-by: Hans Verkuil Regards, Hans > > [ 7.157648] ------------[ cut here ]------------ > [ 7.157666] WARNING: at fs/sysfs/dir.c:530 sysfs_add_one+0xbd/0xe0() > [ 7.157669] sysfs: cannot create duplicate filename '/dev/char/81:1' > [ 7.157672] Modules linked in: qtec_xform(+) qt5023_video(+) videobuf2_vmalloc videobuf2_dma_sg videobuf2_memops videobuf2_core gpio_xilinx(+) qtec_white qtec_cmosis(+) qtec_pcie qt5023 > [ 7.157694] CPU: 0 PID: 120 Comm: systemd-udevd Not tainted 3.10.0-qtec-standard #8 > [ 7.157698] Hardware name: QTechnology QT5022/QT5022, BIOS PM_2.1.0.309 X64 05/23/2013 > [ 7.157702] 0000000000000009 ffff8801788358e8 ffffffff8176c487 ffff880178835928 > [ 7.157707] ffffffff8106f6f0 ffff880175759770 00000000ffffffef ffff880175759930 > [ 7.157712] ffff8801788359e8 ffff880178bff000 ffff880175759930 ffff880178835988 > [ 7.157718] Call Trace: > [ 7.157728] [] dump_stack+0x19/0x1b > [ 7.157735] [] warn_slowpath_common+0x70/0xa0 > [ 7.157740] [] warn_slowpath_fmt+0x46/0x50 > [ 7.157746] [] ? strlcat+0x65/0x90 > [ 7.157750] [] sysfs_add_one+0xbd/0xe0 > [ 7.157755] [] sysfs_do_create_link_sd+0xdb/0x200 > [ 7.157760] [] sysfs_create_link+0x21/0x40 > [ 7.157765] [] device_add+0x21b/0x6d0 > [ 7.157772] [] ? pm_runtime_init+0xe5/0xf0 > [ 7.157776] [] device_register+0x1e/0x30 > [ 7.157782] [] __video_register_device+0x313/0x610 > [ 7.157791] [] qtec_xform_probe+0x465/0x7a4 [qtec_xform] > [ 7.157797] [] platform_drv_probe+0x43/0x80 > [ 7.157802] [] ? driver_sysfs_add+0x7a/0xb0 > [ 7.157807] [] driver_probe_device+0x8b/0x3a0 > [ 7.157812] [] __driver_attach+0xab/0xb0 > [ 7.157816] [] ? driver_probe_device+0x3a0/0x3a0 > [ 7.157820] [] bus_for_each_dev+0x5d/0xa0 > [ 7.157825] [] driver_attach+0x1e/0x20 > [ 7.157829] [] bus_add_driver+0x10e/0x280 > [ 7.157833] [] ? 0xffffffffa0098fff > [ 7.157837] [] ? 0xffffffffa0098fff > [ 7.157842] [] driver_register+0x77/0x170 > [ 7.157848] [] ? __vunmap+0x9c/0x110 > [ 7.157852] [] ? 0xffffffffa0098fff > [ 7.157857] [] platform_driver_register+0x46/0x50 > [ 7.157863] [] qtec_xform_plat_driver_init+0x10/0x12 [qtec_xform] > [ 7.157869] [] do_one_initcall+0xea/0x1a0 > [ 7.157875] [] load_module+0x1a91/0x2630 > [ 7.157880] [] ? ddebug_proc_show+0xe0/0xe0 > [ 7.157887] [] ? page_fault+0x22/0x30 > [ 7.157892] [] SyS_init_module+0xea/0x140 > [ 7.157898] [] tracesys+0xd0/0xd5 > [ 7.157902] ---[ end trace 660cc3a65a4bf01b ]--- > [ 7.157939] __video_register_device: device_register failed > > Signed-off-by: Ricardo Ribalda Delgado > --- > drivers/media/v4l2-core/v4l2-dev.c | 5 ++--- > 1 file changed, 2 insertions(+), 3 deletions(-) > > diff --git a/drivers/media/v4l2-core/v4l2-dev.c b/drivers/media/v4l2-core/v4l2-dev.c > index 5923c5d..3f75f99 100644 > --- a/drivers/media/v4l2-core/v4l2-dev.c > +++ b/drivers/media/v4l2-core/v4l2-dev.c > @@ -873,6 +873,7 @@ int __video_register_device(struct video_device *vdev, int type, int nr, > > /* Should not happen since we thought this minor was free */ > WARN_ON(video_device[vdev->minor] != NULL); > + video_device[vdev->minor] = vdev; > vdev->index = get_index(vdev); > mutex_unlock(&videodev_lock); > > @@ -936,9 +937,6 @@ int __video_register_device(struct video_device *vdev, int type, int nr, > #endif > /* Part 6: Activate this minor. The char device can now be used. */ > set_bit(V4L2_FL_REGISTERED, &vdev->flags); > - mutex_lock(&videodev_lock); > - video_device[vdev->minor] = vdev; > - mutex_unlock(&videodev_lock); > > return 0; > > @@ -946,6 +944,7 @@ cleanup: > mutex_lock(&videodev_lock); > if (vdev->cdev) > cdev_del(vdev->cdev); > + video_device[vdev->minor] = NULL; > devnode_clear(vdev); > mutex_unlock(&videodev_lock); > /* Mark this video device as never having been registered. */ >