On Wed, Aug 07, 2019 at 01:50:42PM +0300, Dan Carpenter wrote: > On Tue, Aug 06, 2019 at 06:41:44PM +0200, Oliver Hartkopp wrote: > > I compiled the code (the original version), but I do not get that "Should it > > be static?" warning: > > > > user@box:~/net-next$ make C=1 > > CALL scripts/checksyscalls.sh > > CALL scripts/atomic/check-atomics.sh > > DESCEND objtool > > CHK include/generated/compile.h > > CHECK net/can/af_can.c > > ./include/linux/sched.h:609:43: error: bad integer constant expression > > ./include/linux/sched.h:609:73: error: invalid named zero-width bitfield > > `value' > > ./include/linux/sched.h:610:43: error: bad integer constant expression > > ./include/linux/sched.h:610:67: error: invalid named zero-width bitfield > > `bucket_id' > > CC [M] net/can/af_can.o > > The sched.h errors suppress Sparse warnings so it's broken/useless now. > The code looks like this: > > include/linux/sched.h > 613 struct uclamp_se { > 614 unsigned int value : bits_per(SCHED_CAPACITY_SCALE); > 615 unsigned int bucket_id : bits_per(UCLAMP_BUCKETS); > 616 unsigned int active : 1; > 617 unsigned int user_defined : 1; > 618 }; > > bits_per() is zero and Sparse doesn't like zero sized bitfields. I just noticed these sparse warnings too -- what's happening here? Are they _supposed_ to be 0-width fields? It doesn't look like it to me: CONFIG_UCLAMP_BUCKETS_COUNT=5 ... #define UCLAMP_BUCKETS CONFIG_UCLAMP_BUCKETS_COUNT ... unsigned int bucket_id : bits_per(UCLAMP_BUCKETS); I would expect this to be 3 bits wide. ... Looks like gcc agrees: struct uclamp_se { unsigned int value:11; /* 0: 0 4 */ unsigned int bucket_id:3; /* 0:11 4 */ ... So this is a sparse issue? -- Kees Cook