]> git.ipfire.org Git - thirdparty/kernel/stable.git/commit
net: Fix for_each_netdev_feature on Big endian
authorHauke Mehrtens <hauke.mehrtens@intel.com>
Fri, 15 Feb 2019 16:58:54 +0000 (17:58 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 23 Feb 2019 08:08:05 +0000 (09:08 +0100)
commit6d7a9a07e0f7c46d5cae44f6a635bc2930066a1b
tree301a515f0ffa4a8bd26fb31a34a37b8e0d797202
parentcc5cb5c0d03d9a990dd6d40dce5a5cf96de8e81e
net: Fix for_each_netdev_feature on Big endian

[ Upstream commit 3b89ea9c5902acccdbbdec307c85edd1bf52515e ]

The features attribute is of type u64 and stored in the native endianes on
the system. The for_each_set_bit() macro takes a pointer to a 32 bit array
and goes over the bits in this area. On little Endian systems this also
works with an u64 as the most significant bit is on the highest address,
but on big endian the words are swapped. When we expect bit 15 here we get
bit 47 (15 + 32).

This patch converts it more or less to its own for_each_set_bit()
implementation which works on 64 bit integers directly. This is then
completely in host endianness and should work like expected.

Fixes: fd867d51f ("net/core: generic support for disabling netdev features down stack")
Signed-off-by: Hauke Mehrtens <hauke.mehrtens@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
include/linux/netdev_features.h
net/core/dev.c