Messages in this thread | | | Date | Fri, 30 Aug 2019 11:49:27 -0500 | From | Josh Poimboeuf <> | Subject | Re: objtool warning "uses BP as a scratch register" with clang-9 |
| |
On Fri, Aug 30, 2019 at 08:48:49AM -0700, Linus Torvalds wrote: > On Fri, Aug 30, 2019 at 8:02 AM Josh Poimboeuf <jpoimboe@redhat.com> wrote: > > > > For KASAN, the Clang threshold for inserting memset() is *2* consecutive > > writes instead of 17. Isn't that likely to cause tearing-related > > surprises? > > Tearing isn't likely to be a problem. > > It's not like memcpy() does byte-by-byte copies. If you pass it a > word-aligned pointer, it will do word-aligned accesses simply for > performance reasons. > > Even on x86, where we use "rep movsb", we (a) tend to disable it for > small copies and (b) it turns out that microcode that does the > optimized movsb (which is the only case we use it) probably ends up > doing atomic things anyway. Note the "probably". I don't have > microcode source code, but there are other indications like "we know > it doesn't take interrupts on a byte-per-byte level, only on the > cacheline level".
The microcode argument is not all that comforting :-)
Also what about unaligned accesses, e.g. if a struct member isn't on a word boundary? Arnd's godbolt link showed those can get combined too.
I don't see x86 memcpy() doing any destination alignment checks.
Have we audited other arches' memset/memcpy implementations?
> So it's probably not an issue from a tearing standpoint - but it > worries me because of "this has to be a leaf function" kind of issues > where we may be using individual stores on purpose. We do have things > like that.
It sounds like everybody's in agreement that replacing accesses with memset/memcpy is bad in a kernel context. Should we push for a new fine-grained compiler option to disable it?
-- Josh
| |