From: David Gibson <david-xT8FGy+AXnRB3Ne2BGzF6laj5H9X9Tb+@public.gmane.org>
To: Tom Rini <trini-OWPKS81ov/FWk0Htik3J/w@public.gmane.org>
Cc: devicetree-compiler-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
Rob Herring <robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
Subject: Re: [PATCHv2] libfdt: Internally perform potentially unaligned loads
Date: Wed, 25 Nov 2020 17:27:58 +1100 [thread overview]
Message-ID: <20201125062758.GG521467@yekko.fritz.box> (raw)
In-Reply-To: <20201124122538.GI32272@bill-the-cat>
[-- Attachment #1: Type: text/plain, Size: 7025 bytes --]
On Tue, Nov 24, 2020 at 07:25:38AM -0500, Tom Rini wrote:
> On Tue, Nov 24, 2020 at 04:41:04PM +1100, David Gibson wrote:
> > Hi Tom,
> >
> > Sorry I've taken so long to reply to this. I was pretty busy, and
> > then on holiday away from my email.
>
> Thanks for explaining.
>
> > Overall I think this looks good, but there are some nits and some
> > inaccuracies in comments.
> >
> > On Thu, Nov 05, 2020 at 11:57:07AM -0500, Tom Rini wrote:
> > > Commits 6dcb8ba4 "libfdt: Add helpers for accessing unaligned words"
> > > introduced changes to support unaligned reads for ARM platforms and
> > > 11738cf01f15 "libfdt: Don't use memcpy to handle unaligned reads on ARM"
> > > improved the performance of these helpers.
> > >
> > > On further discussion, while there are potential cases where we could be
> > > used on platforms that do not fixup unaligned reads for us, making this
> > > choice the default is very expensive in terms of binary size and access
> > > time. To address this, introduce and use new _fdt{32,64}_ld functions
> > > that call fdt{32,64}_to_cpu() as was done prior to the above mentioned
> > > commits. Leave the existing load functions as unaligned-safe and
> > > include comments in both cases.
> >
> > So, leading underscore identifiers are off limits for libfdt - they're
> > reserved for the system libraries (the kernel can get away with it
> > because it doesn't use the system libraries, but we sometimes do).
> >
> > The usual workaround is to use a trailing underscore instead
> > (e.g. fdt_add_property_(), fdt_splice_struct_()). Although.. the
> > convention with those (similar to the kernel's) is that foo() is
> > usually a safer wrapper implemented in terms of foo_(). In this case
> > fdtXX_ld() is not, and cannot, be implemented in terms of fdtXX_ld_().
>
> Alright, so not _foo(). foo__() to indicate it's special?
Just foo_() will be ok. Two underscores doesn't really clarify
anything. fdtXX_ld_aligned() would be clearer, but are also really
verbose.
> > [snip]
> > > const char *fdt_get_alias_namelen(const void *fdt,
> > > diff --git a/libfdt/libfdt.h b/libfdt/libfdt.h
> > > index b600c8d6dd41..3f36ed6d690f 100644
> > > --- a/libfdt/libfdt.h
> > > +++ b/libfdt/libfdt.h
> > > @@ -126,12 +126,10 @@ static inline void *fdt_offset_ptr_w(void *fdt, int offset, int checklen)
> > > uint32_t fdt_next_tag(const void *fdt, int offset, int *nextoffset);
> > >
> > > /*
> > > - * Alignment helpers:
> > > - * These helpers access words from a device tree blob. They're
> > > - * built to work even with unaligned pointers on platforms (ike
> > > - * ARM) that don't like unaligned loads and stores
> > > + * External helpers to access words from a device tree blob. These functions
> > > + * work in a manner that is safe on platforms that do not handle unaligned
> > > + * memory accesses and need special care in those cases.
> >
> > I actually prefer the old wording for the most part. Could you just
> > tweak it for the changes, rather than rewriting the whole thing?
>
> I rewrote it because I didn't like the level of accuracy in the existing
> comment. As Rob detailed in the other thread, yes, ARM could be a
> problem, but only if you don't enable the feature that's virtually
> always enabled on cores that have it.
I'd be fine with adjusting that to say "like certain ARM
configurations" or something similar.
> But, I don't feel so strongly
> about it that it's worth delaying this either. Do you prefer:
>
> External helpers to access words from a device tree blob. They're built
> to work even with unaligned pointers on platforms (like ARM) that don't
> like unaligned loads and stores.
>
> Or:
>
> External helpers to access words from a device tree blob. They're built
> to work even with unaligned pointers on platforms that don't like
> unaligned loads and stores.
I'd prefer to give some example, but changing that example to be more
accurate would be welcome.
>
> > > */
> > > -
> > > static inline uint32_t fdt32_ld(const fdt32_t *p)
> > > {
> > > const uint8_t *bp = (const uint8_t *)p;
> > > diff --git a/libfdt/libfdt_internal.h b/libfdt/libfdt_internal.h
> > > index d4e0bd49c037..785b8b45ad1c 100644
> > > --- a/libfdt/libfdt_internal.h
> > > +++ b/libfdt/libfdt_internal.h
> > > @@ -46,6 +46,23 @@ static inline struct fdt_reserve_entry *fdt_mem_rsv_w_(void *fdt, int n)
> > > return (void *)(uintptr_t)fdt_mem_rsv_(fdt, n);
> > > }
> > >
> > > +/*
> > > + * Internal helpers to access words from a device tree blob. Assume that we
> > > + * are on a platform where unaligned memory reads will be handled in a graceful
> > > + * manner and that we do not need to ensure our reads are aligned. If this is
> > > + * not the case there are _unaligned versions of these functions that follow
> > > + * and can be used.
> >
> > Can you adjust this to emphasise a couple of points:
> > * These helpers are intended for structural elements of the DT,
> > rather than for reading integers from within property values
> > * These are safe if EITHER the platform handles unaligned loads OR
> > they're given naturally aligned addresses. Currently you only
> > mention the first, but the second condition is really the one we
> > rely on, since it should be true in practice for the users of these
> > assuming a compliant dtb loaded at an 8-byte aligned address.
>
> OK.
>
> > Finally, given the history, I'm just a little paranoid that somebody
> > in future is going to hit some weird platform with some new weird
> > alignment issue. So, I'm rather tempted to tie this to a new ASSUME
> > flag (though I'd be willing to have it default to on). I'd envision:
> > 1. You use new internal load wrappers
> > 2. If can_assume(ALIGNED) or whatever, those wrappers expand to the
> > load and byteswap only
> > 3. if !can_assume(ALIGNED), they call the external, unaligned-safe
> > helpers instead
>
> But the entirety of the history of the problem is caught with the other
> patch, fail directly if we're not 8 byte aligned.
Hmm... yes, I guess that's true. Ok, let's leave out a new assume
flag for now, we can add it if we really do hit a problem in future.
> That said, if we renumber the ASSUME values so that
> ASSUME_SAFE_UNALIGNED_LOAD, I would hope that the compiler would do the
> right thing and optimize things the way we need them over in U-Boot.
> But I have to experiment first there to be sure.
All the ASSUME flags are intended to work that way - they're
written as runtime tests in the source, but the expectation is that
they will be resolved at compile time. If that's not true, it needs
addressing.
--
David Gibson | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
prev parent reply other threads:[~2020-11-25 6:27 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-11-05 16:57 [PATCHv2] libfdt: Internally perform potentially unaligned loads Tom Rini
[not found] ` <20201105165707.21916-1-trini-OWPKS81ov/FWk0Htik3J/w@public.gmane.org>
2020-11-18 20:54 ` Tom Rini
2020-11-24 5:41 ` David Gibson
[not found] ` <20201124054104.GC521467-l+x2Y8Cxqc4e6aEkudXLsA@public.gmane.org>
2020-11-24 12:25 ` Tom Rini
2020-11-25 6:27 ` David Gibson [this message]
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=20201125062758.GG521467@yekko.fritz.box \
--to=david-xt8fgy+axnrb3ne2bgzf6laj5h9x9tb+@public.gmane.org \
--cc=devicetree-compiler-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
--cc=trini-OWPKS81ov/FWk0Htik3J/w@public.gmane.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;
as well as URLs for NNTP newsgroup(s).