On 02/15/2019 08:24 PM, David Miller wrote:
From: Hauke Mehrtens hauke.mehrtens@intel.com Date: Fri, 15 Feb 2019 17:58:54 +0100
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") Cc: stable@vger.kernel.org Signed-off-by: Hauke Mehrtens hauke.mehrtens@intel.com
Applied and queued up for -stable.
Please do not CC: stable for networking fixes, I handle -stable submissions myself manually and this is documented in the netdev FAQ.
This commit added a call to fls64(), but not the needed include.
This might break some uses I think.
I suggest the following fix :
diff --git a/include/linux/netdev_features.h b/include/linux/netdev_features.h index c50cedb65cf56fe7d722a5a321b714ed83f449a0..d3f61011f4346e4ea80b61f88bd24541dd006014 100644 --- a/include/linux/netdev_features.h +++ b/include/linux/netdev_features.h @@ -11,6 +11,7 @@ #define _LINUX_NETDEV_FEATURES_H
#include <linux/types.h> +#include <linux/bitops.h> #include <asm/byteorder.h>
typedef u64 netdev_features_t;