Messages in this thread | | | From | Lai Jiangshan <> | Date | Tue, 9 May 2023 11:26:14 +0800 | Subject | Re: [PATCH] workqueue: fix enum type for gcc-13 |
| |
On Wed, Jan 18, 2023 at 12:40 AM Arnd Bergmann <arnd@kernel.org> wrote: > > From: Arnd Bergmann <arnd@arndb.de> > > In gcc-13, the WORK_STRUCT_WQ_DATA_MASK constant is a signed 64-bit > type on 32-bit architectures because the enum definition has both > negative numbers and numbers above LONG_MAX in it: > > kernel/workqueue.c: In function 'get_work_pwq': > kernel/workqueue.c:709:24: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast] > 709 | return (void *)(data & WORK_STRUCT_WQ_DATA_MASK); > | ^ > kernel/workqueue.c: In function 'get_work_pool': > kernel/workqueue.c:737:25: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast] > 737 | return ((struct pool_workqueue *) > | ^ > kernel/workqueue.c: In function 'get_work_pool_id': > kernel/workqueue.c:759:25: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast] > 759 | return ((struct pool_workqueue *) > | ^ > > Change the enum definition to ensure all values can fit into > the range of 'unsigned long' on all architectures. > > Signed-off-by: Arnd Bergmann <arnd@arndb.de> > --- > include/linux/workqueue.h | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/include/linux/workqueue.h b/include/linux/workqueue.h > index ac551b8ee7d9..fba8d0154a1e 100644 > --- a/include/linux/workqueue.h > +++ b/include/linux/workqueue.h > @@ -83,7 +83,7 @@ enum { > > /* convenience constants */ > WORK_STRUCT_FLAG_MASK = (1UL << WORK_STRUCT_FLAG_BITS) - 1, > - WORK_STRUCT_WQ_DATA_MASK = ~WORK_STRUCT_FLAG_MASK, > + WORK_STRUCT_WQ_DATA_MASK = (unsigned long)~WORK_STRUCT_FLAG_MASK, > WORK_STRUCT_NO_POOL = (unsigned long)WORK_OFFQ_POOL_NONE << WORK_OFFQ_POOL_SHIFT,
Tested with "old" gcc: 7.3.1
Tested-by: Lai Jiangshan<jiangshanlai@gmail.com>
But I personally prefer to redefine them as non-enum.
> > /* bit mask for work_busy() return values */ > -- > 2.39.0 >
| |