linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: "Jan Beulich" <JBeulich@suse.com>
To: sedat.dilek@gmail.com
Cc: Matthias Kaehlcke <mka@chromium.org>,
	Dmitry Vyukov <dvyukov@google.com>,
	Greg Hackmann <ghackmann@google.com>,
	Luis Lozano <llozano@google.com>,
	Michael Davidson <md@google.com>,
	Nick Desaulniers <ndesaulniers@google.com>,
	Paul Lawrence <paullawrence@google.com>,
	Sami Tolvanen <samitolvanen@google.com>,
	kasan-dev <kasan-dev@googlegroups.com>,
	Ingo Molnar <mingo@kernel.org>,
	linux-mm@kvack.org, llvmlinux@lists.linuxfoundation.org,
	sil2review@lists.osadl.org
Subject: Re: [llvmlinux] clang fails on linux-next since commit 8bf705d13039
Date: Tue, 29 May 2018 00:49:19 -0600	[thread overview]
Message-ID: <5B0CF7EF02000078001C677A@prv1-mh.provo.novell.com> (raw)
In-Reply-To: <CA+icZUVtK+Z_TLSevtheKSBp+WcfP2s+gbZ1meV1e+yKccQJdA@mail.gmail.com>

>>> On 28.05.18 at 18:05, <sedat.dilek@gmail.com> wrote:
> On Mon, Mar 19, 2018 at 6:29 PM, Matthias Kaehlcke <mka@chromium.org> wrote:
>> El Mon, Mar 19, 2018 at 09:43:25AM +0300 Dmitry Vyukov ha dit:
>>
>>> On Sat, Mar 17, 2018 at 2:13 PM, Lukas Bulwahn <lukas.bulwahn@gmail.com> wrote:
>>> > Hi Dmitry, hi Ingo,
>>> >
>>> > since commit 8bf705d13039 ("locking/atomic/x86: Switch atomic.h to use atomic-instrumented.h")
>>> > on linux-next (tested and bisected from tag next-20180316), compiling the
>>> > kernel with clang fails with:
>>> >
>>> > In file included from arch/x86/entry/vdso/vdso32/vclock_gettime.c:33:
>>> > In file included from arch/x86/entry/vdso/vdso32/../vclock_gettime.c:15:
>>> > In file included from ./arch/x86/include/asm/vgtod.h:6:
>>> > In file included from ./include/linux/clocksource.h:13:
>>> > In file included from ./include/linux/timex.h:56:
>>> > In file included from ./include/uapi/linux/timex.h:56:
>>> > In file included from ./include/linux/time.h:6:
>>> > In file included from ./include/linux/seqlock.h:36:
>>> > In file included from ./include/linux/spinlock.h:51:
>>> > In file included from ./include/linux/preempt.h:81:
>>> > In file included from ./arch/x86/include/asm/preempt.h:7:
>>> > In file included from ./include/linux/thread_info.h:38:
>>> > In file included from ./arch/x86/include/asm/thread_info.h:53:
>>> > In file included from ./arch/x86/include/asm/cpufeature.h:5:
>>> > In file included from ./arch/x86/include/asm/processor.h:21:
>>> > In file included from ./arch/x86/include/asm/msr.h:67:
>>> > In file included from ./arch/x86/include/asm/atomic.h:279:
>>> > ./include/asm-generic/atomic-instrumented.h:295:10: error: invalid output size for constraint '=a'
>>> >                 return arch_cmpxchg((u64 *)ptr, (u64)old, (u64)new);
>>> >                        ^
>>> > ./arch/x86/include/asm/cmpxchg.h:149:2: note: expanded from macro 'arch_cmpxchg'
>>> >         __cmpxchg(ptr, old, new, sizeof(*(ptr)))
>>> >         ^
>>> > ./arch/x86/include/asm/cmpxchg.h:134:2: note: expanded from macro '__cmpxchg'
>>> >         __raw_cmpxchg((ptr), (old), (new), (size), LOCK_PREFIX)
>>> >         ^
>>> > ./arch/x86/include/asm/cmpxchg.h:95:17: note: expanded from macro '__raw_cmpxchg'
>>> >                              : "=a" (__ret), "+m" (*__ptr)              \
>>> >                                      ^
>>> >
>>> > (... and some more similar and closely related errors)
>>>
>>>
>>> Thanks for reporting, Lukas.
>>>
>>> +more people who are more aware of the current state of clang for kernel.
>>>
>>> Are there are known issues in '=a' constraint handling between gcc and
>>> clang? Is there a recommended way to resolve them?
>>>
>>> Also, Lukas what's your version of clang? Potentially there are some
>>> fixes for kernel in the very latest versions of clang.
>>
>> My impression is that the problem only occurs in code built for
>> 32-bit (like arch/x86/entry/vdso/vdso32/*), where the use of a 64-bit
>> address with a '=a' constraint is indeed invalid. I think the 'root
>> cause' is that clang parses unreachable code before it discards it:
>>
>> static __always_inline unsigned long
>> cmpxchg_local_size(volatile void *ptr, unsigned long old, unsigned long new,
>>                    int size)
>> {
>>         ...
>>         switch (size) {
>>         ...
>>         case 8:
>>                 BUILD_BUG_ON(sizeof(unsigned long) != 8);
>>                 return arch_cmpxchg_local((u64 *)ptr, (u64)old, (u64)new);
>>         }
>>         ...
>> }
>>
>> For 32-bit builds size is 4 and the code in the 'offending' branch is
>> unreachable, however clang still parses it.
>>
>> d135b8b5060e ("arm64: uaccess: suppress spurious clang warning") fixes
>> a similar issue.
>>
> 
> [ CC Jan Beulich ]
> 
> Hi Jan,
> 
> can you look at this issue [1] as you have fixed the percpu issue [2]
> with [3] on the Linux-kernel side?

I don't see the connection between the two problems. The missing suffixes
were a latent problem with future improved assembler behavior. The issue
here is completely different. Short of the clang folks being able to point
out a suitable compiler level workaround, did anyone consider replacing the
expressions with the casts to u64 by invocations of arch_cmpxchg64() /
arch_cmpxchg64_local()? Later code in asm-generic/atomic-instrumented.h
suggests these symbols are required to be defined anyway.

The only other option I see is to break out the __X86_CASE_Q cases into
separate macros (evaluating to nothing or BUILD_BUG_ON(1) for 32-bit).
The definition of __X86_CASE_Q for 32-bit is bogus anyway - the
comment saying "sizeof will never return -1" is meaningless, because for
the comparison with the expression in switch() the constant from the case
label is converted to the type of that expression (i.e. size_t) anyway, i.e.
the value compared against is (size_t)-1, which is a value the compiler
can't prove that it won't be returned by sizeof() (despite that being
extremely unlikely).

Jan

> This problem still occurs with Linux v4.17-rc7 and reverting
> x86/asm-goto support (clang-7 does not support it).
> 
> Before this gets fixed on the clang-side, do you see a possibility to
> fix this on the kernel-side?
> 
> Clang fails like this as reported above and see [4] as mentioned by
> Matthias before.
> 
> ./arch/x86/include/asm/cpufeature.h:150:2: warning: "Compiler lacks
> ASM_GOTO support. Add -D __BPF_TRACING__ to your compiler arguments"
> [-W#warnings]
> #warning "Compiler lacks ASM_GOTO support. Add -D __BPF_TRACING__ to
> your compiler arguments"
>  ^
> In file included from arch/x86/entry/vdso/vdso32/vclock_gettime.c:31:
> In file included from arch/x86/entry/vdso/vdso32/../vclock_gettime.c:15:
> In file included from ./arch/x86/include/asm/vgtod.h:6:
> In file included from ./include/linux/clocksource.h:13:
> In file included from ./include/linux/timex.h:56:
> In file included from ./include/uapi/linux/timex.h:56:
> In file included from ./include/linux/time.h:6:
> In file included from ./include/linux/seqlock.h:36:
> In file included from ./include/linux/spinlock.h:51:
> In file included from ./include/linux/preempt.h:81:
> In file included from ./arch/x86/include/asm/preempt.h:7:
> In file included from ./include/linux/thread_info.h:38:
> In file included from ./arch/x86/include/asm/thread_info.h:53:
> In file included from ./arch/x86/include/asm/cpufeature.h:5:
> In file included from ./arch/x86/include/asm/processor.h:21:
> In file included from ./arch/x86/include/asm/msr.h:67:
> In file included from ./arch/x86/include/asm/atomic.h:283:
> ./include/asm-generic/atomic-instrumented.h:365:10: error: invalid
> output size for constraint '=a'
>                 return arch_cmpxchg((u64 *)ptr, (u64)old, (u64)new);
>                        ^
> ./arch/x86/include/asm/cmpxchg.h:149:2: note: expanded from macro 
> 'arch_cmpxchg'
>         __cmpxchg(ptr, old, new, sizeof(*(ptr)))
>         ^
> ./arch/x86/include/asm/cmpxchg.h:134:2: note: expanded from macro 
> '__cmpxchg'
>         __raw_cmpxchg((ptr), (old), (new), (size), LOCK_PREFIX)
>         ^
> ./arch/x86/include/asm/cmpxchg.h:95:17: note: expanded from macro
> '__raw_cmpxchg'
>                              : "=a" (__ret), "+m" (*__ptr)              \
>                                      ^
> 
> Thanks in advance.
> 
> Regards,
> - Sedat -
> 
> [1] https://bugs.llvm.org/show_bug.cgi?id=33587 
> [2] https://bugs.llvm.org/show_bug.cgi?id=33587#c18 
> [3] https://git.kernel.org/linus/22636f8c9511245cb3c8412039f1dd95afb3aa59 
> [4] 
> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/inclu 
> de/asm-generic/atomic-instrumented.h#n365

  reply	other threads:[~2018-05-29  6:49 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-03-17 11:13 Lukas Bulwahn
2018-03-19  6:43 ` Dmitry Vyukov
2018-03-19  7:15   ` Lukas Bulwahn
2018-03-19 17:24   ` Nick Desaulniers
2018-03-19 17:29   ` Matthias Kaehlcke
2018-03-19 17:39     ` Dmitry Vyukov
2018-03-19 17:54       ` Matthias Kaehlcke
2018-03-19 18:15         ` Dmitry Vyukov
2018-03-21 17:07           ` Nick Desaulniers
     [not found]     ` <99fbbbe3-df05-446b-9ce0-55787ea038f3@googlegroups.com>
2018-05-06 10:44       ` Dmitry Vyukov
2018-05-06 10:48         ` Sedat Dilek
2018-05-07  7:34           ` Dmitry Vyukov
2018-05-28 16:05             ` [llvmlinux] " Sedat Dilek
2018-05-29  6:49               ` Jan Beulich [this message]
2018-06-01 13:14                 ` Sedat Dilek
2018-07-29 18:12                 ` Sedat Dilek
2018-07-30  8:21                   ` Mark Rutland
2018-07-30  9:29                     ` Sedat Dilek
2018-06-09 15:17             ` Sedat Dilek
2018-07-30  9:09 [llvmlinux] " Sedat Dilek
2018-07-30  9:19 ` Mark Rutland
2018-07-30  9:40   ` Sedat Dilek
2018-07-30  9:46     ` Mark Rutland
2018-07-30 12:28       ` Sedat Dilek
2018-07-30 12:57         ` Mark Rutland
2018-07-30 16:35       ` Nick Desaulniers
2018-07-30 16:40         ` Sedat Dilek
2018-07-31  7:04           ` Sedat Dilek
2018-07-31  7:35             ` Sedat Dilek
2018-07-31 11:07               ` Sedat Dilek
2018-07-31  7:24         ` Sedat Dilek

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5B0CF7EF02000078001C677A@prv1-mh.provo.novell.com \
    --to=jbeulich@suse.com \
    --cc=dvyukov@google.com \
    --cc=ghackmann@google.com \
    --cc=kasan-dev@googlegroups.com \
    --cc=linux-mm@kvack.org \
    --cc=llozano@google.com \
    --cc=llvmlinux@lists.linuxfoundation.org \
    --cc=md@google.com \
    --cc=mingo@kernel.org \
    --cc=mka@chromium.org \
    --cc=ndesaulniers@google.com \
    --cc=paullawrence@google.com \
    --cc=samitolvanen@google.com \
    --cc=sedat.dilek@gmail.com \
    --cc=sil2review@lists.osadl.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox