2017-03-02 21:10:48

by Jason Baron

[permalink] [raw]
Subject: Re: [PATCH] jump_label: Fix anonymous union initialization

On 02/28/2017 11:32 AM, Boris Ostrovsky wrote:
> Pre-4.6 gcc do not allow direct static initialization of members of
> anonymous structs/unions. After commit 3821fd35b58d ("jump_label:
> Reduce the size of struct static_key") STATIC_KEY_INIT_{TRUE|FALSE}
> definitions cannot be compiled with those older compilers.
>
> Placing initializers inside curved brackets works around this problem.
>
> Signed-off-by: Boris Ostrovsky <[email protected]>
> ---
> include/linux/jump_label.h | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h
> index 8e06d75..518020b 100644
> --- a/include/linux/jump_label.h
> +++ b/include/linux/jump_label.h
> @@ -166,10 +166,10 @@ extern void arch_jump_label_transform_static(struct jump_entry *entry,
> */
> #define STATIC_KEY_INIT_TRUE \
> { .enabled = { 1 }, \
> - .entries = (void *)JUMP_TYPE_TRUE }
> + { .entries = (void *)JUMP_TYPE_TRUE } }
> #define STATIC_KEY_INIT_FALSE \
> { .enabled = { 0 }, \
> - .entries = (void *)JUMP_TYPE_FALSE }
> + { .entries = (void *)JUMP_TYPE_FALSE } }
>
> #else /* !HAVE_JUMP_LABEL */
>
>

(Adding Steve to 'cc)

Thanks for the fix.

Reviewed-by: Jason Baron <[email protected]>

Thanks,

-Jason


2017-03-02 22:02:21

by Chris Mason

[permalink] [raw]
Subject: Re: [PATCH] jump_label: Fix anonymous union initialization

On 03/02/2017 04:42 PM, Steven Rostedt wrote:
> On Thu, 2 Mar 2017 16:07:19 -0500
> Jason Baron <[email protected]> wrote:
>
>> On 02/28/2017 11:32 AM, Boris Ostrovsky wrote:
>>> Pre-4.6 gcc do not allow direct static initialization of members of
>>> anonymous structs/unions. After commit 3821fd35b58d ("jump_label:
>>> Reduce the size of struct static_key") STATIC_KEY_INIT_{TRUE|FALSE}
>>> definitions cannot be compiled with those older compilers.
>>>
>>> Placing initializers inside curved brackets works around this problem.
>>>
>>> Signed-off-by: Boris Ostrovsky <[email protected]>
>>> ---
>>> include/linux/jump_label.h | 4 ++--
>>> 1 file changed, 2 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h
>>> index 8e06d75..518020b 100644
>>> --- a/include/linux/jump_label.h
>>> +++ b/include/linux/jump_label.h
>>> @@ -166,10 +166,10 @@ extern void arch_jump_label_transform_static(struct jump_entry *entry,
>>> */
>>> #define STATIC_KEY_INIT_TRUE \
>>> { .enabled = { 1 }, \
>>> - .entries = (void *)JUMP_TYPE_TRUE }
>>> + { .entries = (void *)JUMP_TYPE_TRUE } }
>>> #define STATIC_KEY_INIT_FALSE \
>>> { .enabled = { 0 }, \
>>> - .entries = (void *)JUMP_TYPE_FALSE }
>>> + { .entries = (void *)JUMP_TYPE_FALSE } }
>>>
>>> #else /* !HAVE_JUMP_LABEL */
>>>
>>>
>>
>> (Adding Steve to 'cc)
>>
>> Thanks for the fix.
>>
>> Reviewed-by: Jason Baron <[email protected]>
>
> Funny, Chris pinged me on IRC telling me that jump labels broke with my
> latest tree. And we discovered it was because of anonymous unions and
> he was using an older compiler (4.4 or something). I didn't know how to
> make it work, and we were just going to say "tough, jump labels are not
> for 4.4". Although, didn't goto asm get added into 4.5? Did someone
> backport it to the gcc 4.4 compilers? I believe 4.5 handles anonymous
> unions.
>
> Since the broken commit went through my tree, I'll take this patch.
> I'm getting ready for another git pull request to Linus.
>

Compiled-by: Chris Mason <[email protected]>

-chris

2017-03-02 22:36:59

by Steven Rostedt

[permalink] [raw]
Subject: Re: [PATCH] jump_label: Fix anonymous union initialization

On Thu, 2 Mar 2017 16:07:19 -0500
Jason Baron <[email protected]> wrote:

> On 02/28/2017 11:32 AM, Boris Ostrovsky wrote:
> > Pre-4.6 gcc do not allow direct static initialization of members of
> > anonymous structs/unions. After commit 3821fd35b58d ("jump_label:
> > Reduce the size of struct static_key") STATIC_KEY_INIT_{TRUE|FALSE}
> > definitions cannot be compiled with those older compilers.
> >
> > Placing initializers inside curved brackets works around this problem.
> >
> > Signed-off-by: Boris Ostrovsky <[email protected]>
> > ---
> > include/linux/jump_label.h | 4 ++--
> > 1 file changed, 2 insertions(+), 2 deletions(-)
> >
> > diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h
> > index 8e06d75..518020b 100644
> > --- a/include/linux/jump_label.h
> > +++ b/include/linux/jump_label.h
> > @@ -166,10 +166,10 @@ extern void arch_jump_label_transform_static(struct jump_entry *entry,
> > */
> > #define STATIC_KEY_INIT_TRUE \
> > { .enabled = { 1 }, \
> > - .entries = (void *)JUMP_TYPE_TRUE }
> > + { .entries = (void *)JUMP_TYPE_TRUE } }
> > #define STATIC_KEY_INIT_FALSE \
> > { .enabled = { 0 }, \
> > - .entries = (void *)JUMP_TYPE_FALSE }
> > + { .entries = (void *)JUMP_TYPE_FALSE } }
> >
> > #else /* !HAVE_JUMP_LABEL */
> >
> >
>
> (Adding Steve to 'cc)
>
> Thanks for the fix.
>
> Reviewed-by: Jason Baron <[email protected]>

Funny, Chris pinged me on IRC telling me that jump labels broke with my
latest tree. And we discovered it was because of anonymous unions and
he was using an older compiler (4.4 or something). I didn't know how to
make it work, and we were just going to say "tough, jump labels are not
for 4.4". Although, didn't goto asm get added into 4.5? Did someone
backport it to the gcc 4.4 compilers? I believe 4.5 handles anonymous
unions.

Since the broken commit went through my tree, I'll take this patch.
I'm getting ready for another git pull request to Linus.

-- Steve

2017-03-02 23:03:37

by Boris Ostrovsky

[permalink] [raw]
Subject: Re: [PATCH] jump_label: Fix anonymous union initialization

On 03/02/2017 04:42 PM, Steven Rostedt wrote:
> On Thu, 2 Mar 2017 16:07:19 -0500
> Jason Baron <[email protected]> wrote:
>
>> On 02/28/2017 11:32 AM, Boris Ostrovsky wrote:
>>> Pre-4.6 gcc do not allow direct static initialization of members of
>>> anonymous structs/unions. After commit 3821fd35b58d ("jump_label:
>>> Reduce the size of struct static_key") STATIC_KEY_INIT_{TRUE|FALSE}
>>> definitions cannot be compiled with those older compilers.
>>>
>>> Placing initializers inside curved brackets works around this problem.
>>>
>>> Signed-off-by: Boris Ostrovsky <[email protected]>
>>> ---
>>> include/linux/jump_label.h | 4 ++--
>>> 1 file changed, 2 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h
>>> index 8e06d75..518020b 100644
>>> --- a/include/linux/jump_label.h
>>> +++ b/include/linux/jump_label.h
>>> @@ -166,10 +166,10 @@ extern void arch_jump_label_transform_static(struct jump_entry *entry,
>>> */
>>> #define STATIC_KEY_INIT_TRUE \
>>> { .enabled = { 1 }, \
>>> - .entries = (void *)JUMP_TYPE_TRUE }
>>> + { .entries = (void *)JUMP_TYPE_TRUE } }
>>> #define STATIC_KEY_INIT_FALSE \
>>> { .enabled = { 0 }, \
>>> - .entries = (void *)JUMP_TYPE_FALSE }
>>> + { .entries = (void *)JUMP_TYPE_FALSE } }
>>>
>>> #else /* !HAVE_JUMP_LABEL */
>>>
>>>
>> (Adding Steve to 'cc)
>>
>> Thanks for the fix.
>>
>> Reviewed-by: Jason Baron <[email protected]>
> Funny, Chris pinged me on IRC telling me that jump labels broke with my
> latest tree. And we discovered it was because of anonymous unions and
> he was using an older compiler (4.4 or something). I didn't know how to
> make it work, and we were just going to say "tough, jump labels are not
> for 4.4". Although, didn't goto asm get added into 4.5? Did someone
> backport it to the gcc 4.4 compilers? I believe 4.5 handles anonymous
> unions.

Per https://gcc.gnu.org/bugzilla/show_bug.cgi?id=10676 this was fixed in
4.6. I don't know whether this was ever backported but my gcc 4.4.4 is
definitely not able to deal with those initializers.

As for the fix, it was , in fact, suggested to me by Linus at some point
in the past when a similar issue came up. The only thing here is that we
need to be careful about initialization order.

-boris