Hi Igor, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on linuxtv-media/master] [also build test WARNING on v5.12-rc6 next-20210408] [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] url: https://github.com/0day-ci/linux/commits/Igor-Matheus-Andrade-Torrente/media-em28xx-Fix-race-condition-between-open-and-init-function/20210408-201217 base: git://linuxtv.org/media_tree.git master config: x86_64-randconfig-a014-20210408 (attached as .config) compiler: clang version 13.0.0 (https://github.com/llvm/llvm-project 56ea2e2fdd691136d5e6631fa0e447173694b82c) 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 # install x86_64 cross compiling tool for clang build # apt-get install binutils-x86-64-linux-gnu # https://github.com/0day-ci/linux/commit/e13d07271a1ee4cbd8ac421bf575a36f9d0e1008 git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Igor-Matheus-Andrade-Torrente/media-em28xx-Fix-race-condition-between-open-and-init-function/20210408-201217 git checkout e13d07271a1ee4cbd8ac421bf575a36f9d0e1008 # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=x86_64 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@xxxxxxxxx> All warnings (new ones prefixed by >>): >> drivers/media/usb/em28xx/em28xx-video.c:2347:6: warning: no previous prototype for function 'em28xx_vdev_release' [-Wmissing-prototypes] void em28xx_vdev_release(struct video_device *vdev) ^ drivers/media/usb/em28xx/em28xx-video.c:2347:1: note: declare 'static' if the function is not intended to be used outside of this translation unit void em28xx_vdev_release(struct video_device *vdev) ^ static >> drivers/media/usb/em28xx/em28xx-video.c:2545:6: warning: no previous prototype for function 'em28xx_v4l2_dev_release' [-Wmissing-prototypes] void em28xx_v4l2_dev_release(struct v4l2_device *v4l2_dev) ^ drivers/media/usb/em28xx/em28xx-video.c:2545:1: note: declare 'static' if the function is not intended to be used outside of this translation unit void em28xx_v4l2_dev_release(struct v4l2_device *v4l2_dev) ^ static 2 warnings generated. vim +/em28xx_vdev_release +2347 drivers/media/usb/em28xx/em28xx-video.c 2346 > 2347 void em28xx_vdev_release(struct video_device *vdev) 2348 { 2349 #ifdef CONFIG_MEDIA_CONTROLLER 2350 int i; 2351 2352 for (i = 0; i < vdev->entity.num_pads; i++) 2353 kfree(&vdev->entity.pads[i]); 2354 #endif 2355 kfree(vdev); 2356 } 2357 2358 static const struct v4l2_file_operations em28xx_v4l_fops = { 2359 .owner = THIS_MODULE, 2360 .open = em28xx_v4l2_open, 2361 .release = em28xx_v4l2_close, 2362 .read = vb2_fop_read, 2363 .poll = vb2_fop_poll, 2364 .mmap = vb2_fop_mmap, 2365 .unlocked_ioctl = video_ioctl2, 2366 }; 2367 2368 static const struct v4l2_ioctl_ops video_ioctl_ops = { 2369 .vidioc_querycap = vidioc_querycap, 2370 .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap, 2371 .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap, 2372 .vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap, 2373 .vidioc_s_fmt_vid_cap = vidioc_s_fmt_vid_cap, 2374 .vidioc_g_fmt_vbi_cap = vidioc_g_fmt_vbi_cap, 2375 .vidioc_try_fmt_vbi_cap = vidioc_g_fmt_vbi_cap, 2376 .vidioc_s_fmt_vbi_cap = vidioc_g_fmt_vbi_cap, 2377 .vidioc_enum_framesizes = vidioc_enum_framesizes, 2378 .vidioc_enumaudio = vidioc_enumaudio, 2379 .vidioc_g_audio = vidioc_g_audio, 2380 .vidioc_s_audio = vidioc_s_audio, 2381 2382 .vidioc_reqbufs = vb2_ioctl_reqbufs, 2383 .vidioc_create_bufs = vb2_ioctl_create_bufs, 2384 .vidioc_prepare_buf = vb2_ioctl_prepare_buf, 2385 .vidioc_querybuf = vb2_ioctl_querybuf, 2386 .vidioc_qbuf = vb2_ioctl_qbuf, 2387 .vidioc_dqbuf = vb2_ioctl_dqbuf, 2388 2389 .vidioc_g_std = vidioc_g_std, 2390 .vidioc_querystd = vidioc_querystd, 2391 .vidioc_s_std = vidioc_s_std, 2392 .vidioc_g_parm = vidioc_g_parm, 2393 .vidioc_s_parm = vidioc_s_parm, 2394 .vidioc_enum_input = vidioc_enum_input, 2395 .vidioc_g_input = vidioc_g_input, 2396 .vidioc_s_input = vidioc_s_input, 2397 .vidioc_streamon = vb2_ioctl_streamon, 2398 .vidioc_streamoff = vb2_ioctl_streamoff, 2399 .vidioc_g_tuner = vidioc_g_tuner, 2400 .vidioc_s_tuner = vidioc_s_tuner, 2401 .vidioc_g_frequency = vidioc_g_frequency, 2402 .vidioc_s_frequency = vidioc_s_frequency, 2403 .vidioc_subscribe_event = v4l2_ctrl_subscribe_event, 2404 .vidioc_unsubscribe_event = v4l2_event_unsubscribe, 2405 #ifdef CONFIG_VIDEO_ADV_DEBUG 2406 .vidioc_g_chip_info = vidioc_g_chip_info, 2407 .vidioc_g_register = vidioc_g_register, 2408 .vidioc_s_register = vidioc_s_register, 2409 #endif 2410 }; 2411 2412 static const struct video_device em28xx_video_template = { 2413 .fops = &em28xx_v4l_fops, 2414 .ioctl_ops = &video_ioctl_ops, 2415 .release = em28xx_vdev_release, 2416 .tvnorms = V4L2_STD_ALL, 2417 }; 2418 2419 static const struct v4l2_file_operations radio_fops = { 2420 .owner = THIS_MODULE, 2421 .open = em28xx_v4l2_open, 2422 .release = em28xx_v4l2_close, 2423 .unlocked_ioctl = video_ioctl2, 2424 }; 2425 2426 static const struct v4l2_ioctl_ops radio_ioctl_ops = { 2427 .vidioc_querycap = vidioc_querycap, 2428 .vidioc_g_tuner = radio_g_tuner, 2429 .vidioc_s_tuner = radio_s_tuner, 2430 .vidioc_g_frequency = vidioc_g_frequency, 2431 .vidioc_s_frequency = vidioc_s_frequency, 2432 .vidioc_subscribe_event = v4l2_ctrl_subscribe_event, 2433 .vidioc_unsubscribe_event = v4l2_event_unsubscribe, 2434 #ifdef CONFIG_VIDEO_ADV_DEBUG 2435 .vidioc_g_chip_info = vidioc_g_chip_info, 2436 .vidioc_g_register = vidioc_g_register, 2437 .vidioc_s_register = vidioc_s_register, 2438 #endif 2439 }; 2440 2441 static struct video_device em28xx_radio_template = { 2442 .fops = &radio_fops, 2443 .ioctl_ops = &radio_ioctl_ops, 2444 .release = video_device_release_empty, 2445 }; 2446 2447 /* I2C possible address to saa7115, tvp5150, msp3400, tvaudio */ 2448 static unsigned short saa711x_addrs[] = { 2449 0x4a >> 1, 0x48 >> 1, /* SAA7111, SAA7111A and SAA7113 */ 2450 0x42 >> 1, 0x40 >> 1, /* SAA7114, SAA7115 and SAA7118 */ 2451 I2C_CLIENT_END }; 2452 2453 static unsigned short tvp5150_addrs[] = { 2454 0xb8 >> 1, 2455 0xba >> 1, 2456 I2C_CLIENT_END 2457 }; 2458 2459 static unsigned short msp3400_addrs[] = { 2460 0x80 >> 1, 2461 0x88 >> 1, 2462 I2C_CLIENT_END 2463 }; 2464 2465 /******************************** usb interface ******************************/ 2466 2467 static void em28xx_vdev_init(struct em28xx *dev, 2468 struct video_device *vfd, 2469 const struct video_device *template, 2470 const char *type_name) 2471 { 2472 *vfd = *template; 2473 vfd->v4l2_dev = dev->v4l2->v4l2_dev; 2474 vfd->lock = &dev->lock; 2475 if (dev->is_webcam) 2476 vfd->tvnorms = 0; 2477 2478 snprintf(vfd->name, sizeof(vfd->name), "%s %s", 2479 dev_name(&dev->intf->dev), type_name); 2480 2481 video_set_drvdata(vfd, dev); 2482 } 2483 2484 static void em28xx_tuner_setup(struct em28xx *dev, unsigned short tuner_addr) 2485 { 2486 struct em28xx_v4l2 *v4l2 = dev->v4l2; 2487 struct v4l2_device *v4l2_dev = v4l2->v4l2_dev; 2488 struct tuner_setup tun_setup; 2489 struct v4l2_frequency f; 2490 2491 memset(&tun_setup, 0, sizeof(tun_setup)); 2492 2493 tun_setup.mode_mask = T_ANALOG_TV | T_RADIO; 2494 tun_setup.tuner_callback = em28xx_tuner_callback; 2495 2496 if (dev->board.radio.type) { 2497 tun_setup.type = dev->board.radio.type; 2498 tun_setup.addr = dev->board.radio_addr; 2499 2500 v4l2_device_call_all(v4l2_dev, 2501 0, tuner, s_type_addr, &tun_setup); 2502 } 2503 2504 if (dev->tuner_type != TUNER_ABSENT && dev->tuner_type) { 2505 tun_setup.type = dev->tuner_type; 2506 tun_setup.addr = tuner_addr; 2507 2508 v4l2_device_call_all(v4l2_dev, 2509 0, tuner, s_type_addr, &tun_setup); 2510 } 2511 2512 if (dev->board.tda9887_conf) { 2513 struct v4l2_priv_tun_config tda9887_cfg; 2514 2515 tda9887_cfg.tuner = TUNER_TDA9887; 2516 tda9887_cfg.priv = &dev->board.tda9887_conf; 2517 2518 v4l2_device_call_all(v4l2_dev, 2519 0, tuner, s_config, &tda9887_cfg); 2520 } 2521 2522 if (dev->tuner_type == TUNER_XC2028) { 2523 struct v4l2_priv_tun_config xc2028_cfg; 2524 struct xc2028_ctrl ctl; 2525 2526 memset(&xc2028_cfg, 0, sizeof(xc2028_cfg)); 2527 memset(&ctl, 0, sizeof(ctl)); 2528 2529 em28xx_setup_xc3028(dev, &ctl); 2530 2531 xc2028_cfg.tuner = TUNER_XC2028; 2532 xc2028_cfg.priv = &ctl; 2533 2534 v4l2_device_call_all(v4l2_dev, 0, tuner, s_config, &xc2028_cfg); 2535 } 2536 2537 /* configure tuner */ 2538 f.tuner = 0; 2539 f.type = V4L2_TUNER_ANALOG_TV; 2540 f.frequency = 9076; /* just a magic number */ 2541 v4l2->frequency = f.frequency; 2542 v4l2_device_call_all(v4l2_dev, 0, tuner, s_frequency, &f); 2543 } 2544 > 2545 void em28xx_v4l2_dev_release(struct v4l2_device *v4l2_dev) 2546 { 2547 kfree(v4l2_dev); 2548 } 2549 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@xxxxxxxxxxxx
Attachment:
.config.gz
Description: application/gzip