Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1402289 > unrolled thread

[PATCH] workqueue: Fix an object aliasing bug with `work_data_bits'

Started by"Maciej W. Rozycki" <macro@imgtec.com>
First post2016-05-17 13:10 +0200
Last post2016-05-25 23:30 +0200
Articles 3 — 2 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH] workqueue: Fix an object aliasing bug with  `work_data_bits' "Maciej W. Rozycki" <macro@imgtec.com> - 2016-05-17 13:10 +0200
    Re: [PATCH] workqueue: Fix an object aliasing bug with  `work_data_bits' Tejun Heo <tj@kernel.org> - 2016-05-25 23:00 +0200
      Re: [PATCH] workqueue: Fix an object aliasing bug with  `work_data_bits' "Maciej W. Rozycki" <macro@imgtec.com> - 2016-05-25 23:30 +0200

#1402289 — [PATCH] workqueue: Fix an object aliasing bug with `work_data_bits'

From"Maciej W. Rozycki" <macro@imgtec.com>
Date2016-05-17 13:10 +0200
Subject[PATCH] workqueue: Fix an object aliasing bug with `work_data_bits'
Message-ID<rzL2W-3NJ-21@gated-at.bofh.it>
Fix an aliasing issue causing a MIPS port build error:

In file included from include/linux/srcu.h:34:0,
                 from include/linux/notifier.h:15,
                 from ./arch/mips/include/asm/uprobes.h:9,
                 from include/linux/uprobes.h:61,
                 from include/linux/mm_types.h:13,
                 from ./arch/mips/include/asm/vdso.h:14,
                 from arch/mips/vdso/vdso.h:27,
                 from arch/mips/vdso/gettimeofday.c:11:
include/linux/workqueue.h: In function 'work_static':
include/linux/workqueue.h:186:2: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
  return *work_data_bits(work) & WORK_STRUCT_STATIC;
  ^
cc1: all warnings being treated as errors
make[2]: *** [arch/mips/vdso/gettimeofday.o] Error 1

with a CONFIG_DEBUG_OBJECTS_WORK configuration and GCC 5.2.0.  Use a
union to switch between pointers as per ISO C language rules.

Signed-off-by: Maciej W. Rozycki <macro@imgtec.com>
Cc: stable@vger.kernel.org # v2.6.20+
---
 This has been probably missed with ports which do not use `-Werror' and 
consequently let warnings scroll by unnoticed.  Yet undefined behaviour 
results as the compiler is free to optimise (e.g. remove) code under the 
assumption that the two objects do not alias.

 Please apply then.  This reaches back to 2.6.20 I believe.

  Maciej

linux-work-data-bits.diff
Index: linux-sfr-shell/include/linux/workqueue.h
===================================================================
--- linux-sfr-shell.orig/include/linux/workqueue.h	2016-04-22 17:31:08.000000000 +0100
+++ linux-sfr-shell/include/linux/workqueue.h	2016-05-17 05:26:18.772193000 +0100
@@ -23,7 +23,16 @@ void delayed_work_timer_fn(unsigned long
  * The first word is the work queue pointer and the flags rolled into
  * one
  */
-#define work_data_bits(work) ((unsigned long *)(&(work)->data))
+#define work_data_bits(work)						\
+({									\
+	union {								\
+		atomic_long_t *a;					\
+		unsigned long *l;					\
+	} u;								\
+									\
+	u.a = &(work)->data;						\
+	u.l;								\
+})
 
 enum {
 	WORK_STRUCT_PENDING_BIT	= 0,	/* work item is pending execution */

[toc] | [next] | [standalone]


#1407206

FromTejun Heo <tj@kernel.org>
Date2016-05-25 23:00 +0200
Message-ID<rCO4h-5ww-3@gated-at.bofh.it>
In reply to#1402289
On Tue, May 17, 2016 at 12:04:33PM +0100, Maciej W. Rozycki wrote:
> Fix an aliasing issue causing a MIPS port build error:
> 
> In file included from include/linux/srcu.h:34:0,
>                  from include/linux/notifier.h:15,
>                  from ./arch/mips/include/asm/uprobes.h:9,
>                  from include/linux/uprobes.h:61,
>                  from include/linux/mm_types.h:13,
>                  from ./arch/mips/include/asm/vdso.h:14,
>                  from arch/mips/vdso/vdso.h:27,
>                  from arch/mips/vdso/gettimeofday.c:11:
> include/linux/workqueue.h: In function 'work_static':
> include/linux/workqueue.h:186:2: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
>   return *work_data_bits(work) & WORK_STRUCT_STATIC;
>   ^

Umm... the kernel is built explicitly with -fno-strict-aliasing and
it's not something individual archs can opt out.

Thanks.

-- 
tejun

[toc] | [prev] | [next] | [standalone]


#1407224

From"Maciej W. Rozycki" <macro@imgtec.com>
Date2016-05-25 23:30 +0200
Message-ID<rCOxk-5WN-41@gated-at.bofh.it>
In reply to#1407206
On Wed, 25 May 2016, Tejun Heo wrote:

> > Fix an aliasing issue causing a MIPS port build error:
> > 
> > In file included from include/linux/srcu.h:34:0,
> >                  from include/linux/notifier.h:15,
> >                  from ./arch/mips/include/asm/uprobes.h:9,
> >                  from include/linux/uprobes.h:61,
> >                  from include/linux/mm_types.h:13,
> >                  from ./arch/mips/include/asm/vdso.h:14,
> >                  from arch/mips/vdso/vdso.h:27,
> >                  from arch/mips/vdso/gettimeofday.c:11:
> > include/linux/workqueue.h: In function 'work_static':
> > include/linux/workqueue.h:186:2: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
> >   return *work_data_bits(work) & WORK_STRUCT_STATIC;
> >   ^
> 
> Umm... the kernel is built explicitly with -fno-strict-aliasing and
> it's not something individual archs can opt out.

 Hmm, good point, I had forgotten about it, it's been a while -- now I 
recall there was once quite a discussion about it, when GCC switched its 
default.

 However it's VDSO being built here, i.e. strictly speaking not a part of 
the kernel itself, and this uses specialised build recipes so as to make 
this code user-callable (PIC, among others).  Which is undoubtedly why the 
error triggers so rarely.  So I guess the way to sort this out is to stick 
an explicit `-fno-strict-aliasing' option along with `-fno-common' and 
some other stuff already present there.  Due to the arcana of MIPS ABIs 
this is unfortunately very fragile.

 I'll handle it with the MIPS port then.  Sorry to trouble you with a bad 
change, thanks for the advice, and please consider the patch withdrawn.

  Maciej

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web