Re: include/linux/eventpoll.h:81:13: sparse: sparse: restricted __poll_t degrades to integer

From: Arnd Bergmann
Date: Wed Feb 23 2022 - 07:59:50 EST


On Wed, Feb 23, 2022 at 1:47 PM kernel test robot <lkp@xxxxxxxxx> wrote:
>
> tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
> head: 5c1ee569660d4a205dced9cb4d0306b907fb7599
> commit: 249dbe74d3c4b568a623fb55c56cddf19fdf0b89 ARM: 9108/1: oabi-compat: rework epoll_wait/epoll_pwait emulation
> date: 6 months ago
> config: riscv-randconfig-s031-20220221 (https://download.01.org/0day-ci/archive/20220223/202202231910.H30peLyl-lkp@xxxxxxxxx/config)
> compiler: riscv32-linux-gcc (GCC) 11.2.0
> reproduce:
> wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
> chmod +x ~/bin/make.cross
> # apt-get install sparse
> # sparse version: v0.6.4-dirty
> # https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=249dbe74d3c4b568a623fb55c56cddf19fdf0b89
> git remote add linus https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> git fetch --no-tags linus master
> git checkout 249dbe74d3c4b568a623fb55c56cddf19fdf0b89
> # save the config file to linux build tree
> mkdir build_dir
> COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=riscv SHELL=/bin/bash
>
> If you fix the issue, kindly add following tag as appropriate
> Reported-by: kernel test robot <lkp@xxxxxxxxx>
>
>
> sparse warnings: (new ones prefixed by >>)
> fs/eventpoll.c: note: in included file:
> >> include/linux/eventpoll.h:81:13: sparse: sparse: restricted __poll_t degrades to integer
> >> include/linux/eventpoll.h:81:13: sparse: sparse: restricted __poll_t degrades to integer
> include/linux/eventpoll.h:81:13: sparse: sparse: cast from restricted __poll_t

The code is only moved from one file to another, so I don't think this
adds a new sparse
warning but only changes the build log contents.

> 77 static inline struct epoll_event __user *
> 78 epoll_put_uevent(__poll_t revents, __u64 data,
> 79 struct epoll_event __user *uevent)
> 80 {
> > 81 if (__put_user(revents, &uevent->events) ||
> 82 __put_user(data, &uevent->data))
> 83 return NULL;
> 84

I think the problem is the riscv __put_user() macro, this should not
warn when storing a __poll_t into a __user*__poll_t pointer.

Arnd