Hi Bartosz, I love your patch! Yet something to improve: [auto build test ERROR on brgl/gpio/for-next] [also build test ERROR on linus/master v6.1-rc7 next-20221128] [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/Bartosz-Golaszewski/gpiolib-don-t-allow-user-space-to-crash-the-kernel-with-hot-unplugs/20221129-021037 base: https://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux.git gpio/for-next patch link: https://lore.kernel.org/r/20221128175214.602612-3-brgl%40bgdev.pl patch subject: [PATCH v2 2/2] gpiolib: protect the GPIO device against being dropped while in use by user-space config: arm-randconfig-r046-20221128 compiler: arm-linux-gnueabi-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/ccf2821b643c23a5ef6fac8a4785c2127d4125c7 git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Bartosz-Golaszewski/gpiolib-don-t-allow-user-space-to-crash-the-kernel-with-hot-unplugs/20221129-021037 git checkout ccf2821b643c23a5ef6fac8a4785c2127d4125c7 # 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=arm SHELL=/bin/bash drivers/gpio/ If you fix the issue, kindly add following tag where applicable | Reported-by: kernel test robot All error/warnings (new ones prefixed by >>): drivers/gpio/gpiolib-cdev.c: In function 'lineinfo_watch_read': >> drivers/gpio/gpiolib-cdev.c:2647:1: error: expected 'while' before 'static' 2647 | static int gpio_chrdev_open(struct inode *inode, struct file *file) | ^~~~~~ >> drivers/gpio/gpiolib-cdev.c:2709:12: error: invalid storage class for function 'gpio_chrdev_release' 2709 | static int gpio_chrdev_release(struct inode *inode, struct file *file) | ^~~~~~~~~~~~~~~~~~~ >> drivers/gpio/gpiolib-cdev.c:2709:1: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] 2709 | static int gpio_chrdev_release(struct inode *inode, struct file *file) | ^~~~~~ >> drivers/gpio/gpiolib-cdev.c:2724:20: error: initializer element is not constant 2724 | .release = gpio_chrdev_release, | ^~~~~~~~~~~~~~~~~~~ drivers/gpio/gpiolib-cdev.c:2724:20: note: (near initialization for 'gpio_fileops.release') >> drivers/gpio/gpiolib-cdev.c:2725:17: error: 'gpio_chrdev_open' undeclared (first use in this function); did you mean 'gpio_chardev_data'? 2725 | .open = gpio_chrdev_open, | ^~~~~~~~~~~~~~~~ | gpio_chardev_data drivers/gpio/gpiolib-cdev.c:2725:17: note: each undeclared identifier is reported only once for each function it appears in >> drivers/gpio/gpiolib-cdev.c:2757:1: error: expected declaration or statement at end of input 2757 | } | ^ drivers/gpio/gpiolib-cdev.c: At top level: drivers/gpio/gpiolib-cdev.c:2754:6: warning: 'gpiolib_cdev_unregister' defined but not used [-Wunused-function] 2754 | void gpiolib_cdev_unregister(struct gpio_device *gdev) | ^~~~~~~~~~~~~~~~~~~~~~~ drivers/gpio/gpiolib-cdev.c:2736:5: warning: 'gpiolib_cdev_register' defined but not used [-Wunused-function] 2736 | int gpiolib_cdev_register(struct gpio_device *gdev, dev_t devt) | ^~~~~~~~~~~~~~~~~~~~~ drivers/gpio/gpiolib-cdev.c:2543:16: warning: 'lineinfo_watch_read' defined but not used [-Wunused-function] 2543 | static ssize_t lineinfo_watch_read(struct file *file, char __user *buf, | ^~~~~~~~~~~~~~~~~~~ drivers/gpio/gpiolib-cdev.c:2494:12: warning: 'lineinfo_changed_notify' defined but not used [-Wunused-function] 2494 | static int lineinfo_changed_notify(struct notifier_block *nb, | ^~~~~~~~~~~~~~~~~~~~~~~ vim +2647 drivers/gpio/gpiolib-cdev.c 925ca36913fc7df Kent Gibson 2020-06-16 2640 925ca36913fc7df Kent Gibson 2020-06-16 2641 /** 925ca36913fc7df Kent Gibson 2020-06-16 2642 * gpio_chrdev_open() - open the chardev for ioctl operations 925ca36913fc7df Kent Gibson 2020-06-16 2643 * @inode: inode for this chardev 49bc52798d7bb66 Kent Gibson 2020-07-08 2644 * @file: file struct for storing private data 925ca36913fc7df Kent Gibson 2020-06-16 2645 * Returns 0 on success 925ca36913fc7df Kent Gibson 2020-06-16 2646 */ 49bc52798d7bb66 Kent Gibson 2020-07-08 @2647 static int gpio_chrdev_open(struct inode *inode, struct file *file) 925ca36913fc7df Kent Gibson 2020-06-16 2648 { 925ca36913fc7df Kent Gibson 2020-06-16 2649 struct gpio_device *gdev = container_of(inode->i_cdev, 925ca36913fc7df Kent Gibson 2020-06-16 2650 struct gpio_device, chrdev); e2b781c5f0dd45f Kent Gibson 2020-07-08 2651 struct gpio_chardev_data *cdev; 925ca36913fc7df Kent Gibson 2020-06-16 2652 int ret = -ENOMEM; 925ca36913fc7df Kent Gibson 2020-06-16 2653 ccf2821b643c23a Bartosz Golaszewski 2022-11-28 2654 down_read(&gdev->sem); ccf2821b643c23a Bartosz Golaszewski 2022-11-28 2655 925ca36913fc7df Kent Gibson 2020-06-16 2656 /* Fail on open if the backing gpiochip is gone */ ccf2821b643c23a Bartosz Golaszewski 2022-11-28 2657 if (!gdev->chip) { ccf2821b643c23a Bartosz Golaszewski 2022-11-28 2658 up_read(&gdev->sem); 925ca36913fc7df Kent Gibson 2020-06-16 2659 return -ENODEV; ccf2821b643c23a Bartosz Golaszewski 2022-11-28 2660 } 925ca36913fc7df Kent Gibson 2020-06-16 2661 e2b781c5f0dd45f Kent Gibson 2020-07-08 2662 cdev = kzalloc(sizeof(*cdev), GFP_KERNEL); ccf2821b643c23a Bartosz Golaszewski 2022-11-28 2663 if (!cdev) { ccf2821b643c23a Bartosz Golaszewski 2022-11-28 2664 up_read(&gdev->sem); 925ca36913fc7df Kent Gibson 2020-06-16 2665 return -ENOMEM; ccf2821b643c23a Bartosz Golaszewski 2022-11-28 2666 } 925ca36913fc7df Kent Gibson 2020-06-16 2667 e2b781c5f0dd45f Kent Gibson 2020-07-08 2668 cdev->watched_lines = bitmap_zalloc(gdev->chip->ngpio, GFP_KERNEL); e2b781c5f0dd45f Kent Gibson 2020-07-08 2669 if (!cdev->watched_lines) e2b781c5f0dd45f Kent Gibson 2020-07-08 2670 goto out_free_cdev; 925ca36913fc7df Kent Gibson 2020-06-16 2671 e2b781c5f0dd45f Kent Gibson 2020-07-08 2672 init_waitqueue_head(&cdev->wait); e2b781c5f0dd45f Kent Gibson 2020-07-08 2673 INIT_KFIFO(cdev->events); e2b781c5f0dd45f Kent Gibson 2020-07-08 2674 cdev->gdev = gdev; 925ca36913fc7df Kent Gibson 2020-06-16 2675 e2b781c5f0dd45f Kent Gibson 2020-07-08 2676 cdev->lineinfo_changed_nb.notifier_call = lineinfo_changed_notify; 6accc376a7482ec Kent Gibson 2020-07-08 2677 ret = blocking_notifier_chain_register(&gdev->notifier, e2b781c5f0dd45f Kent Gibson 2020-07-08 2678 &cdev->lineinfo_changed_nb); 925ca36913fc7df Kent Gibson 2020-06-16 2679 if (ret) 925ca36913fc7df Kent Gibson 2020-06-16 2680 goto out_free_bitmap; 925ca36913fc7df Kent Gibson 2020-06-16 2681 925ca36913fc7df Kent Gibson 2020-06-16 2682 get_device(&gdev->dev); e2b781c5f0dd45f Kent Gibson 2020-07-08 2683 file->private_data = cdev; 925ca36913fc7df Kent Gibson 2020-06-16 2684 49bc52798d7bb66 Kent Gibson 2020-07-08 2685 ret = nonseekable_open(inode, file); 925ca36913fc7df Kent Gibson 2020-06-16 2686 if (ret) 925ca36913fc7df Kent Gibson 2020-06-16 2687 goto out_unregister_notifier; 925ca36913fc7df Kent Gibson 2020-06-16 2688 ccf2821b643c23a Bartosz Golaszewski 2022-11-28 2689 up_read(&gdev->sem); 925ca36913fc7df Kent Gibson 2020-06-16 2690 return ret; 925ca36913fc7df Kent Gibson 2020-06-16 2691 925ca36913fc7df Kent Gibson 2020-06-16 2692 out_unregister_notifier: 6accc376a7482ec Kent Gibson 2020-07-08 2693 blocking_notifier_chain_unregister(&gdev->notifier, e2b781c5f0dd45f Kent Gibson 2020-07-08 2694 &cdev->lineinfo_changed_nb); 925ca36913fc7df Kent Gibson 2020-06-16 2695 out_free_bitmap: e2b781c5f0dd45f Kent Gibson 2020-07-08 2696 bitmap_free(cdev->watched_lines); e2b781c5f0dd45f Kent Gibson 2020-07-08 2697 out_free_cdev: e2b781c5f0dd45f Kent Gibson 2020-07-08 2698 kfree(cdev); ccf2821b643c23a Bartosz Golaszewski 2022-11-28 2699 up_read(&gdev->sem); 925ca36913fc7df Kent Gibson 2020-06-16 2700 return ret; 925ca36913fc7df Kent Gibson 2020-06-16 2701 } 925ca36913fc7df Kent Gibson 2020-06-16 2702 925ca36913fc7df Kent Gibson 2020-06-16 2703 /** 925ca36913fc7df Kent Gibson 2020-06-16 2704 * gpio_chrdev_release() - close chardev after ioctl operations 925ca36913fc7df Kent Gibson 2020-06-16 2705 * @inode: inode for this chardev 49bc52798d7bb66 Kent Gibson 2020-07-08 2706 * @file: file struct for storing private data 925ca36913fc7df Kent Gibson 2020-06-16 2707 * Returns 0 on success 925ca36913fc7df Kent Gibson 2020-06-16 2708 */ 49bc52798d7bb66 Kent Gibson 2020-07-08 @2709 static int gpio_chrdev_release(struct inode *inode, struct file *file) 925ca36913fc7df Kent Gibson 2020-06-16 2710 { e2b781c5f0dd45f Kent Gibson 2020-07-08 2711 struct gpio_chardev_data *cdev = file->private_data; e2b781c5f0dd45f Kent Gibson 2020-07-08 2712 struct gpio_device *gdev = cdev->gdev; 925ca36913fc7df Kent Gibson 2020-06-16 2713 e2b781c5f0dd45f Kent Gibson 2020-07-08 2714 bitmap_free(cdev->watched_lines); 6accc376a7482ec Kent Gibson 2020-07-08 2715 blocking_notifier_chain_unregister(&gdev->notifier, e2b781c5f0dd45f Kent Gibson 2020-07-08 2716 &cdev->lineinfo_changed_nb); 925ca36913fc7df Kent Gibson 2020-06-16 2717 put_device(&gdev->dev); e2b781c5f0dd45f Kent Gibson 2020-07-08 2718 kfree(cdev); 925ca36913fc7df Kent Gibson 2020-06-16 2719 925ca36913fc7df Kent Gibson 2020-06-16 2720 return 0; 925ca36913fc7df Kent Gibson 2020-06-16 2721 } 925ca36913fc7df Kent Gibson 2020-06-16 2722 925ca36913fc7df Kent Gibson 2020-06-16 2723 static const struct file_operations gpio_fileops = { 925ca36913fc7df Kent Gibson 2020-06-16 @2724 .release = gpio_chrdev_release, 925ca36913fc7df Kent Gibson 2020-06-16 @2725 .open = gpio_chrdev_open, 925ca36913fc7df Kent Gibson 2020-06-16 2726 .poll = lineinfo_watch_poll, 925ca36913fc7df Kent Gibson 2020-06-16 2727 .read = lineinfo_watch_read, 925ca36913fc7df Kent Gibson 2020-06-16 2728 .owner = THIS_MODULE, 925ca36913fc7df Kent Gibson 2020-06-16 2729 .llseek = no_llseek, 925ca36913fc7df Kent Gibson 2020-06-16 2730 .unlocked_ioctl = gpio_ioctl, 925ca36913fc7df Kent Gibson 2020-06-16 2731 #ifdef CONFIG_COMPAT 925ca36913fc7df Kent Gibson 2020-06-16 2732 .compat_ioctl = gpio_ioctl_compat, 925ca36913fc7df Kent Gibson 2020-06-16 2733 #endif 925ca36913fc7df Kent Gibson 2020-06-16 2734 }; 925ca36913fc7df Kent Gibson 2020-06-16 2735 925ca36913fc7df Kent Gibson 2020-06-16 2736 int gpiolib_cdev_register(struct gpio_device *gdev, dev_t devt) 925ca36913fc7df Kent Gibson 2020-06-16 2737 { 925ca36913fc7df Kent Gibson 2020-06-16 2738 int ret; 925ca36913fc7df Kent Gibson 2020-06-16 2739 925ca36913fc7df Kent Gibson 2020-06-16 2740 cdev_init(&gdev->chrdev, &gpio_fileops); 925ca36913fc7df Kent Gibson 2020-06-16 2741 gdev->chrdev.owner = THIS_MODULE; 925ca36913fc7df Kent Gibson 2020-06-16 2742 gdev->dev.devt = MKDEV(MAJOR(devt), gdev->id); 925ca36913fc7df Kent Gibson 2020-06-16 2743 925ca36913fc7df Kent Gibson 2020-06-16 2744 ret = cdev_device_add(&gdev->chrdev, &gdev->dev); 925ca36913fc7df Kent Gibson 2020-06-16 2745 if (ret) 925ca36913fc7df Kent Gibson 2020-06-16 2746 return ret; 925ca36913fc7df Kent Gibson 2020-06-16 2747 925ca36913fc7df Kent Gibson 2020-06-16 2748 chip_dbg(gdev->chip, "added GPIO chardev (%d:%d)\n", 925ca36913fc7df Kent Gibson 2020-06-16 2749 MAJOR(devt), gdev->id); 925ca36913fc7df Kent Gibson 2020-06-16 2750 925ca36913fc7df Kent Gibson 2020-06-16 2751 return 0; 925ca36913fc7df Kent Gibson 2020-06-16 2752 } 925ca36913fc7df Kent Gibson 2020-06-16 2753 925ca36913fc7df Kent Gibson 2020-06-16 2754 void gpiolib_cdev_unregister(struct gpio_device *gdev) 925ca36913fc7df Kent Gibson 2020-06-16 2755 { 925ca36913fc7df Kent Gibson 2020-06-16 2756 cdev_device_del(&gdev->chrdev, &gdev->dev); 925ca36913fc7df Kent Gibson 2020-06-16 @2757 } -- 0-DAY CI Kernel Test Service https://01.org/lkp