ipv6: Ensure natural alignment of const ipv6 loopback and router addresses
[ Upstream commit 60365049ccbacd101654a66ddcb299abfabd4fc5 ]
On a parisc64 kernel I sometimes notice this kernel warning:
Kernel unaligned access to 0x40ff8814 at ndisc_send_skb+0xc0/0x4d8
The address 0x40ff8814 points to the in6addr_linklocal_allrouters
variable and the warning simply means that some ipv6 function tries to
read a 64-bit word directly from the not-64-bit aligned
in6addr_linklocal_allrouters variable.
Unaligned accesses are non-critical as the architecture or exception
handlers usually will fix it up at runtime. Nevertheless it may trigger
a performance penality for some architectures. For details read the
"unaligned-memory-access" kernel documentation.
The patch below ensures that the ipv6 loopback and router addresses will
always be naturally aligned. This prevents the unaligned accesses for
all architectures.
Signed-off-by: Helge Deller <deller@gmx.de>
Fixes: 034dfc5df9
("ipv6: export in6addr_loopback to modules")
Acked-by: Paolo Abeni <pabeni@redhat.com>
Link: https://lore.kernel.org/r/ZbNuFM1bFqoH-UoY@p100
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
b45fae96bd
commit
e34c91e7e8
@ -213,19 +213,26 @@ const struct ipv6_stub *ipv6_stub __read_mostly = &(struct ipv6_stub) {
|
||||
EXPORT_SYMBOL_GPL(ipv6_stub);
|
||||
|
||||
/* IPv6 Wildcard Address and Loopback Address defined by RFC2553 */
|
||||
const struct in6_addr in6addr_loopback = IN6ADDR_LOOPBACK_INIT;
|
||||
const struct in6_addr in6addr_loopback __aligned(BITS_PER_LONG/8)
|
||||
= IN6ADDR_LOOPBACK_INIT;
|
||||
EXPORT_SYMBOL(in6addr_loopback);
|
||||
const struct in6_addr in6addr_any = IN6ADDR_ANY_INIT;
|
||||
const struct in6_addr in6addr_any __aligned(BITS_PER_LONG/8)
|
||||
= IN6ADDR_ANY_INIT;
|
||||
EXPORT_SYMBOL(in6addr_any);
|
||||
const struct in6_addr in6addr_linklocal_allnodes = IN6ADDR_LINKLOCAL_ALLNODES_INIT;
|
||||
const struct in6_addr in6addr_linklocal_allnodes __aligned(BITS_PER_LONG/8)
|
||||
= IN6ADDR_LINKLOCAL_ALLNODES_INIT;
|
||||
EXPORT_SYMBOL(in6addr_linklocal_allnodes);
|
||||
const struct in6_addr in6addr_linklocal_allrouters = IN6ADDR_LINKLOCAL_ALLROUTERS_INIT;
|
||||
const struct in6_addr in6addr_linklocal_allrouters __aligned(BITS_PER_LONG/8)
|
||||
= IN6ADDR_LINKLOCAL_ALLROUTERS_INIT;
|
||||
EXPORT_SYMBOL(in6addr_linklocal_allrouters);
|
||||
const struct in6_addr in6addr_interfacelocal_allnodes = IN6ADDR_INTERFACELOCAL_ALLNODES_INIT;
|
||||
const struct in6_addr in6addr_interfacelocal_allnodes __aligned(BITS_PER_LONG/8)
|
||||
= IN6ADDR_INTERFACELOCAL_ALLNODES_INIT;
|
||||
EXPORT_SYMBOL(in6addr_interfacelocal_allnodes);
|
||||
const struct in6_addr in6addr_interfacelocal_allrouters = IN6ADDR_INTERFACELOCAL_ALLROUTERS_INIT;
|
||||
const struct in6_addr in6addr_interfacelocal_allrouters __aligned(BITS_PER_LONG/8)
|
||||
= IN6ADDR_INTERFACELOCAL_ALLROUTERS_INIT;
|
||||
EXPORT_SYMBOL(in6addr_interfacelocal_allrouters);
|
||||
const struct in6_addr in6addr_sitelocal_allrouters = IN6ADDR_SITELOCAL_ALLROUTERS_INIT;
|
||||
const struct in6_addr in6addr_sitelocal_allrouters __aligned(BITS_PER_LONG/8)
|
||||
= IN6ADDR_SITELOCAL_ALLROUTERS_INIT;
|
||||
EXPORT_SYMBOL(in6addr_sitelocal_allrouters);
|
||||
|
||||
static void snmp6_free_dev(struct inet6_dev *idev)
|
||||
|
Loading…
Reference in New Issue
Block a user