virtio_net: Fix misalignment bug in struct virtnet_info
Subsystems (4)
PATCH v2 1/1 virtio_net: Fix misalignment bug in struct virtnet_info
Use the new TRAILING_OVERLAP() helper to fix a misalignment bug along with the following warning:
drivers/net/virtio_net.c:429:46: warning: structure containing a flexible array member is not at the end of another structure [-Wflex-array-member-not-at-end]
This helper creates a union between a flexible-array member (FAM) and a set of members that would otherwise follow it (in this case u8 rss_hash_key_data[VIRTIO_NET_RSS_MAX_KEY_SIZE];). This overlays the trailing members (rss_hash_key_data) onto the FAM (hash_key_data) while keeping the FAM and the start of MEMBERS aligned. The static_assert() ensures this alignment remains.
Notice that due to tail padding in flexible struct virtio_net_rss_config_trailer, rss_trailer.hash_key_data (at offset 83 in struct virtnet_info) and rss_hash_key_data (at offset 84 in struct virtnet_info) are misaligned by one byte. See below:
struct virtio_net_rss_config_trailer {
__le16 max_tx_vq; /* 0 2 */
__u8 hash_key_length; /* 2 1 */
__u8 hash_key_data[]; /* 3 0 */
/* size: 4, cachelines: 1, members: 3 */
/* padding: 1 */
/* last cacheline: 4 bytes */
};struct virtnet_info {
...
struct virtio_net_rss_config_trailer rss_trailer; /* 80 4 */
/* XXX last struct has 1 byte of padding */
u8 rss_hash_key_data[40]; /* 84 40 */
...
/* size: 832, cachelines: 13, members: 48 */
/* sum members: 801, holes: 8, sum holes: 31 */
/* paddings: 2, sum paddings: 5 */
};After changes, those members are correctly aligned at offset 795:
struct virtnet_info {
...
union {
struct virtio_net_rss_config_trailer rss_trailer; /* 792 4 */
struct {
unsigned char __offset_to_hash_key_data[3]; /* 792 3 */
u8 rss_hash_key_data[40]; /* 795 40 */
}; /* 792 43 */
}; /* 792 44 */
...
/* size: 840, cachelines: 14, members: 47 */
/* sum members: 801, holes: 8, sum holes: 35 */
/* padding: 4 */
/* paddings: 1, sum paddings: 4 */
/* last cacheline: 8 bytes */
};As a result, the RSS key passed to the device is shifted by 1
byte: the last byte is cut off, and instead a (possibly uninitialized) byte is added at the beginning.
As a last note struct virtio_net_rss_config_hdr *rss_hdr; is also moved to the end, since it seems those three members should stick around together. :)
---
Changes in v2:
- Update subject and changelog text (include feedback from Simon and Michael --thanks folks)
- Add Fixes tag and CC -stable.
v1:
- Link: https://lore.kernel.org/linux-hardening/aLiYrQGdGmaDTtLF@kspp/
drivers/net/virtio_net.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)
drivers/net/virtio_net.c +9 -3
@@ -425,9 +425,6 @@ struct virtnet_info {u16 rss_indir_table_size;u32 rss_hash_types_supported;u32 rss_hash_types_saved; -struct virtio_net_rss_config_hdr *rss_hdr; -struct virtio_net_rss_config_trailer rss_trailer; -u8 rss_hash_key_data[VIRTIO_NET_RSS_MAX_KEY_SIZE ];/* Has control virtqueue */ bool has_cvq;
@@ -493,7 +490,16 @@ struct virtnet_info {struct failover *failover;u64 device_stats_cap; + +struct virtio_net_rss_config_hdr *rss_hdr; + +/* Must be last as it ends in a flexible-array member. */ + TRAILING_OVERLAP(struct virtio_net_rss_config_trailer, rss_trailer, hash_key_data, + u8 rss_hash_key_data[VIRTIO_NET_RSS_MAX_KEY_SIZE]; + ); }; +static_assert(offsetof(struct virtnet_info, rss_trailer.hash_key_data) == + offsetof(struct virtnet_info, rss_hash_key_data));struct padded_vnet_hdr {struct virtio_net_hdr_v1_hash hdr;
Signature · 1 line
2.43.0
Paolo Abeni
maintainerQuoted 68 lines · Gustavo A. R. Silva
Use the new
TRAILING_OVERLAP()helper to fix a misalignment bug along with the following warning:
drivers/net/virtio_net.c:429:46: warning: structure containing a flexible array member is not at the end of another structure [-Wflex-array-member-not-at-end]This helper creates a union between a flexible-array member (FAM) and a set of members that would otherwise follow it (in this case
u8 rss_hash_key_data[VIRTIO_NET_RSS_MAX_KEY_SIZE];). This overlays the trailing members (rss_hash_key_data) onto the FAM (hash_key_data) while keeping the FAM and the start of MEMBERS aligned. Thestatic_assert()ensures this alignment remains.Notice that due to tail padding in flexible
struct virtio_net_rss_config_trailer,rss_trailer.hash_key_data(at offset 83 in structvirtnet_info) andrss_hash_key_data(at offset 84 in structvirtnet_info) are misaligned by one byte. See below:struct virtio_net_rss_config_trailer { __le16 max_tx_vq; /* 0 2 */ __u8 hash_key_length; /* 2 1 */ __u8 hash_key_data[]; /* 3 0 */ /* size: 4, cachelines: 1, members: 3 */ /* padding: 1 */ /* last cacheline: 4 bytes */ };struct
virtnet_info{
...struct virtio_net_rss_config_trailer rss_trailer; /* 80 4 */ /* XXX last struct has 1 byte of padding */ u8 rss_hash_key_data[40]; /* 84 40 */ ... /* size: 832, cachelines: 13, members: 48 */ /* sum members: 801, holes: 8, sum holes: 31 */ /* paddings: 2, sum paddings: 5 */ };After changes, those members are correctly aligned at offset 795:
struct
virtnet_info{
...union { struct virtio_net_rss_config_trailer rss_trailer; /* 792 4 */ struct { unsigned char __offset_to_hash_key_data[3]; /* 792 3 */ u8 rss_hash_key_data[40]; /* 795 40 */ }; /* 792 43 */ }; /* 792 44 */ ... /* size: 840, cachelines: 14, members: 47 */ /* sum members: 801, holes: 8, sum holes: 35 */ /* padding: 4 */ /* paddings: 1, sum paddings: 4 */ /* last cacheline: 8 bytes */ };As a result, the RSS key passed to the device is shifted by 1
byte: the last byte is cut off, and instead a (possibly uninitialized) byte is added at the beginning.As a last note
struct virtio_net_rss_config_hdr *rss_hdr;is also moved to the end, since it seems those three members should stick around together. :)
Quoted 8 lines
Fixes ed3100e90d0d ("virtio_net: Use new RSS config structs")Signed-off-by Gustavo A. R. Silva <[email protected]>---
Changes in v2:
- Update subject and changelog text (include feedback from Simon and Michael --thanks folks)
- Add Fixes tag and CC -stable.
@Michael, @Jason: This is still apparently targeting 'net-next', but I think it should land in the 'net' tree, right?
/P
Michael S. Tsirkin
maintainerQuoted 78 lines · Paolo Abeni
Quoted 68 lines · Gustavo A. R. Silva
Use the new
TRAILING_OVERLAP()helper to fix a misalignment bug along with the following warning:
drivers/net/virtio_net.c:429:46: warning: structure containing a flexible array member is not at the end of another structure [-Wflex-array-member-not-at-end]This helper creates a union between a flexible-array member (FAM) and a set of members that would otherwise follow it (in this case
u8 rss_hash_key_data[VIRTIO_NET_RSS_MAX_KEY_SIZE];). This overlays the trailing members (rss_hash_key_data) onto the FAM (hash_key_data) while keeping the FAM and the start of MEMBERS aligned. Thestatic_assert()ensures this alignment remains.Notice that due to tail padding in flexible
struct virtio_net_rss_config_trailer,rss_trailer.hash_key_data(at offset 83 in structvirtnet_info) andrss_hash_key_data(at offset 84 in structvirtnet_info) are misaligned by one byte. See below:struct virtio_net_rss_config_trailer { __le16 max_tx_vq; /* 0 2 */ __u8 hash_key_length; /* 2 1 */ __u8 hash_key_data[]; /* 3 0 */ /* size: 4, cachelines: 1, members: 3 */ /* padding: 1 */ /* last cacheline: 4 bytes */ };struct
virtnet_info{
...struct virtio_net_rss_config_trailer rss_trailer; /* 80 4 */ /* XXX last struct has 1 byte of padding */ u8 rss_hash_key_data[40]; /* 84 40 */ ... /* size: 832, cachelines: 13, members: 48 */ /* sum members: 801, holes: 8, sum holes: 31 */ /* paddings: 2, sum paddings: 5 */ };After changes, those members are correctly aligned at offset 795:
struct
virtnet_info{
...union { struct virtio_net_rss_config_trailer rss_trailer; /* 792 4 */ struct { unsigned char __offset_to_hash_key_data[3]; /* 792 3 */ u8 rss_hash_key_data[40]; /* 795 40 */ }; /* 792 43 */ }; /* 792 44 */ ... /* size: 840, cachelines: 14, members: 47 */ /* sum members: 801, holes: 8, sum holes: 35 */ /* padding: 4 */ /* paddings: 1, sum paddings: 4 */ /* last cacheline: 8 bytes */ };As a result, the RSS key passed to the device is shifted by 1
byte: the last byte is cut off, and instead a (possibly uninitialized) byte is added at the beginning.As a last note
struct virtio_net_rss_config_hdr *rss_hdr;is also moved to the end, since it seems those three members should stick around together. :)Quoted 8 lines
Fixes ed3100e90d0d ("virtio_net: Use new RSS config structs")Signed-off-by Gustavo A. R. Silva <[email protected]>---
Changes in v2:
- Update subject and changelog text (include feedback from Simon and Michael --thanks folks)
- Add Fixes tag and CC -stable.
Quoted 4 lines
@Michael, @Jason: This is still apparently targeting 'net-next', but I think it should land in the 'net' tree, right?
/P
Probably but I'm yet to properly review it. The thing that puzzles me at a first glance is how are things working right now then?
Signature · 1 line
MST
Paolo Abeni
maintainerQuoted 79 lines · Michael S. Tsirkin
Quoted 78 lines · Paolo Abeni
Quoted 76 lines · Gustavo A. R. Silva
Use the new
TRAILING_OVERLAP()helper to fix a misalignment bug along with the following warning:
drivers/net/virtio_net.c:429:46: warning: structure containing a flexible array member is not at the end of another structure [-Wflex-array-member-not-at-end]This helper creates a union between a flexible-array member (FAM) and a set of members that would otherwise follow it (in this case
u8 rss_hash_key_data[VIRTIO_NET_RSS_MAX_KEY_SIZE];). This overlays the trailing members (rss_hash_key_data) onto the FAM (hash_key_data) while keeping the FAM and the start of MEMBERS aligned. Thestatic_assert()ensures this alignment remains.Notice that due to tail padding in flexible
struct virtio_net_rss_config_trailer,rss_trailer.hash_key_data(at offset 83 in structvirtnet_info) andrss_hash_key_data(at offset 84 in structvirtnet_info) are misaligned by one byte. See below:struct virtio_net_rss_config_trailer { __le16 max_tx_vq; /* 0 2 */ __u8 hash_key_length; /* 2 1 */ __u8 hash_key_data[]; /* 3 0 */ /* size: 4, cachelines: 1, members: 3 */ /* padding: 1 */ /* last cacheline: 4 bytes */ };struct
virtnet_info{
...struct virtio_net_rss_config_trailer rss_trailer; /* 80 4 */ /* XXX last struct has 1 byte of padding */ u8 rss_hash_key_data[40]; /* 84 40 */ ... /* size: 832, cachelines: 13, members: 48 */ /* sum members: 801, holes: 8, sum holes: 31 */ /* paddings: 2, sum paddings: 5 */ };After changes, those members are correctly aligned at offset 795:
struct
virtnet_info{
...union { struct virtio_net_rss_config_trailer rss_trailer; /* 792 4 */ struct { unsigned char __offset_to_hash_key_data[3]; /* 792 3 */ u8 rss_hash_key_data[40]; /* 795 40 */ }; /* 792 43 */ }; /* 792 44 */ ... /* size: 840, cachelines: 14, members: 47 */ /* sum members: 801, holes: 8, sum holes: 35 */ /* padding: 4 */ /* paddings: 1, sum paddings: 4 */ /* last cacheline: 8 bytes */ };As a result, the RSS key passed to the device is shifted by 1
byte: the last byte is cut off, and instead a (possibly uninitialized) byte is added at the beginning.As a last note
struct virtio_net_rss_config_hdr *rss_hdr;is also moved to the end, since it seems those three members should stick around together. :)Fixes ed3100e90d0d ("virtio_net: Use new RSS config structs")Signed-off-by Gustavo A. R. Silva <[email protected]>---
Changes in v2:
- Update subject and changelog text (include feedback from Simon and Michael --thanks folks)
- Add Fixes tag and CC -stable.
Quoted 7 lines
Quoted 4 lines
@Michael, @Jason: This is still apparently targeting 'net-next', but I think it should land in the 'net' tree, right?
/P
Probably but I'm yet to properly review it. The thing that puzzles me at a first glance is how are things working right now then?
Apparently they aren't ?!?
rss self-tests for virtio_net are failing:
https://netdev-ctrl.bots.linux.dev/logs/vmksft/drv-hw-dbg/results/471521/15-rss-api-py/stdout
but the result is into the CI reported as success (no idea why?!?)
/P
Michael S. Tsirkin
maintainerQuoted 90 lines · Paolo Abeni
Quoted 79 lines · Michael S. Tsirkin
Quoted 78 lines · Paolo Abeni
Quoted 76 lines · Gustavo A. R. Silva
Use the new
TRAILING_OVERLAP()helper to fix a misalignment bug along with the following warning:
drivers/net/virtio_net.c:429:46: warning: structure containing a flexible array member is not at the end of another structure [-Wflex-array-member-not-at-end]This helper creates a union between a flexible-array member (FAM) and a set of members that would otherwise follow it (in this case
u8 rss_hash_key_data[VIRTIO_NET_RSS_MAX_KEY_SIZE];). This overlays the trailing members (rss_hash_key_data) onto the FAM (hash_key_data) while keeping the FAM and the start of MEMBERS aligned. Thestatic_assert()ensures this alignment remains.Notice that due to tail padding in flexible
struct virtio_net_rss_config_trailer,rss_trailer.hash_key_data(at offset 83 in structvirtnet_info) andrss_hash_key_data(at offset 84 in structvirtnet_info) are misaligned by one byte. See below:struct virtio_net_rss_config_trailer { __le16 max_tx_vq; /* 0 2 */ __u8 hash_key_length; /* 2 1 */ __u8 hash_key_data[]; /* 3 0 */ /* size: 4, cachelines: 1, members: 3 */ /* padding: 1 */ /* last cacheline: 4 bytes */ };struct
virtnet_info{
...struct virtio_net_rss_config_trailer rss_trailer; /* 80 4 */ /* XXX last struct has 1 byte of padding */ u8 rss_hash_key_data[40]; /* 84 40 */ ... /* size: 832, cachelines: 13, members: 48 */ /* sum members: 801, holes: 8, sum holes: 31 */ /* paddings: 2, sum paddings: 5 */ };After changes, those members are correctly aligned at offset 795:
struct
virtnet_info{
...union { struct virtio_net_rss_config_trailer rss_trailer; /* 792 4 */ struct { unsigned char __offset_to_hash_key_data[3]; /* 792 3 */ u8 rss_hash_key_data[40]; /* 795 40 */ }; /* 792 43 */ }; /* 792 44 */ ... /* size: 840, cachelines: 14, members: 47 */ /* sum members: 801, holes: 8, sum holes: 35 */ /* padding: 4 */ /* paddings: 1, sum paddings: 4 */ /* last cacheline: 8 bytes */ };As a result, the RSS key passed to the device is shifted by 1
byte: the last byte is cut off, and instead a (possibly uninitialized) byte is added at the beginning.As a last note
struct virtio_net_rss_config_hdr *rss_hdr;is also moved to the end, since it seems those three members should stick around together. :)Fixes ed3100e90d0d ("virtio_net: Use new RSS config structs")Signed-off-by Gustavo A. R. Silva <[email protected]>---
Changes in v2:
- Update subject and changelog text (include feedback from Simon and Michael --thanks folks)
- Add Fixes tag and CC -stable.Quoted 7 lines
Quoted 4 lines
@Michael, @Jason: This is still apparently targeting 'net-next', but I think it should land in the 'net' tree, right?
/P
Probably but I'm yet to properly review it. The thing that puzzles me at a first glance is how are things working right now then?
Apparently they aren't ?!?
Quoted 7 lines
rss self-tests for
virtio_netare failing:https://netdev-ctrl.bots.linux.dev/logs/vmksft/drv-hw-dbg/results/471521/15-rss-api-py/stdout
but the result is into the CI reported as success (no idea why?!?)
/P
and this fixes it?
Jakub Kicinski
maintainerQuoted 10 lines · On Tue, 13 Jan 2026 16:06:05 +0100 Paolo Abeni wrote:
Quoted 2 lines
Probably but I'm yet to properly review it. The thing that puzzles me at a first glance is how are things working right now then?
Apparently they aren't ?!?
rss self-tests for
virtio_netare failing:https://netdev-ctrl.bots.linux.dev/logs/vmksft/drv-hw-dbg/results/471521/15-rss-api-py/stdout
but the result is into the CI reported as success (no idea why?!?)
To be clear this is a HW test so the fact that it shows up in CI as green means just that the 2 sub cases (per [1]) which the CI judged to be stable and passing are still passing. The other 10 sub cases have never passed and still don't. IDK if you QEMU doesn't support RSS or it's something else but AFAICT this patch doesn't appear to make a difference to us.
[1] https://netdev.bots.linux.dev/devices.html
You can see the per-case breakdown of the history here (including the ignored sub-cases):
https://netdev.bots.linux.dev/flakes.html?tn-needle=drv-hw%2Fselftests-drivers-net-hw%2Frss-api-py&min-flip=0&br-pfx=net-next-hw&ld-cases=1
Quoted 79 lines · Paolo Abeni
Quoted 68 lines · Gustavo A. R. Silva
Use the new
TRAILING_OVERLAP()helper to fix a misalignment bug along with the following warning:
drivers/net/virtio_net.c:429:46: warning: structure containing a flexible array member is not at the end of another structure [-Wflex-array-member-not-at-end]This helper creates a union between a flexible-array member (FAM) and a set of members that would otherwise follow it (in this case
u8 rss_hash_key_data[VIRTIO_NET_RSS_MAX_KEY_SIZE];). This overlays the trailing members (rss_hash_key_data) onto the FAM (hash_key_data) while keeping the FAM and the start of MEMBERS aligned. Thestatic_assert()ensures this alignment remains.Notice that due to tail padding in flexible
struct virtio_net_rss_config_trailer,rss_trailer.hash_key_data(at offset 83 in structvirtnet_info) andrss_hash_key_data(at offset 84 in structvirtnet_info) are misaligned by one byte. See below:struct virtio_net_rss_config_trailer { __le16 max_tx_vq; /* 0 2 */ __u8 hash_key_length; /* 2 1 */ __u8 hash_key_data[]; /* 3 0 */ /* size: 4, cachelines: 1, members: 3 */ /* padding: 1 */ /* last cacheline: 4 bytes */ };struct
virtnet_info{
...struct virtio_net_rss_config_trailer rss_trailer; /* 80 4 */ /* XXX last struct has 1 byte of padding */ u8 rss_hash_key_data[40]; /* 84 40 */ ... /* size: 832, cachelines: 13, members: 48 */ /* sum members: 801, holes: 8, sum holes: 31 */ /* paddings: 2, sum paddings: 5 */ };After changes, those members are correctly aligned at offset 795:
struct
virtnet_info{
...union { struct virtio_net_rss_config_trailer rss_trailer; /* 792 4 */ struct { unsigned char __offset_to_hash_key_data[3]; /* 792 3 */ u8 rss_hash_key_data[40]; /* 795 40 */ }; /* 792 43 */ }; /* 792 44 */ ... /* size: 840, cachelines: 14, members: 47 */ /* sum members: 801, holes: 8, sum holes: 35 */ /* padding: 4 */ /* paddings: 1, sum paddings: 4 */ /* last cacheline: 8 bytes */ };As a result, the RSS key passed to the device is shifted by 1
byte: the last byte is cut off, and instead a (possibly uninitialized) byte is added at the beginning.As a last note
struct virtio_net_rss_config_hdr *rss_hdr;is also moved to the end, since it seems those three members should stick around together. :)Quoted 8 lines
Fixes ed3100e90d0d ("virtio_net: Use new RSS config structs")Signed-off-by Gustavo A. R. Silva <[email protected]>---
Changes in v2:
- Update subject and changelog text (include feedback from Simon and Michael --thanks folks)
- Add Fixes tag and CC -stable.
Quoted 2 lines
@Michael, @Jason: This is still apparently targeting 'net-next', but I think it should land in the 'net' tree, right?
Right.
Thanks
Quoted 3 lines
/P
Quoted 64 lines · Gustavo A. R. Silva
Use the new
TRAILING_OVERLAP()helper to fix a misalignment bug along with the following warning:
drivers/net/virtio_net.c:429:46: warning: structure containing a flexible array member is not at the end of another structure [-Wflex-array-member-not-at-end]This helper creates a union between a flexible-array member (FAM) and a set of members that would otherwise follow it (in this case
u8 rss_hash_key_data[VIRTIO_NET_RSS_MAX_KEY_SIZE];). This overlays the trailing members (rss_hash_key_data) onto the FAM (hash_key_data) while keeping the FAM and the start of MEMBERS aligned. Thestatic_assert()ensures this alignment remains.Notice that due to tail padding in flexible
struct virtio_net_rss_config_trailer,rss_trailer.hash_key_data(at offset 83 in structvirtnet_info) andrss_hash_key_data(at offset 84 in structvirtnet_info) are misaligned by one byte. See below:struct virtio_net_rss_config_trailer { __le16 max_tx_vq; /* 0 2 */ __u8 hash_key_length; /* 2 1 */ __u8 hash_key_data[]; /* 3 0 */ /* size: 4, cachelines: 1, members: 3 */ /* padding: 1 */ /* last cacheline: 4 bytes */ };struct
virtnet_info{
...struct virtio_net_rss_config_trailer rss_trailer; /* 80 4 */ /* XXX last struct has 1 byte of padding */ u8 rss_hash_key_data[40]; /* 84 40 */ ... /* size: 832, cachelines: 13, members: 48 */ /* sum members: 801, holes: 8, sum holes: 31 */ /* paddings: 2, sum paddings: 5 */ };After changes, those members are correctly aligned at offset 795:
struct
virtnet_info{
...union { struct virtio_net_rss_config_trailer rss_trailer; /* 792 4 */ struct { unsigned char __offset_to_hash_key_data[3]; /* 792 3 */ u8 rss_hash_key_data[40]; /* 795 40 */ }; /* 792 43 */ }; /* 792 44 */ ... /* size: 840, cachelines: 14, members: 47 */ /* sum members: 801, holes: 8, sum holes: 35 */ /* padding: 4 */ /* paddings: 1, sum paddings: 4 */ /* last cacheline: 8 bytes */ };As a result, the RSS key passed to the device is shifted by 1
byte: the last byte is cut off, and instead a (possibly uninitialized) byte is added at the beginning.
Quoted 8 lines
As a last note
struct virtio_net_rss_config_hdr *rss_hdr;is also moved to the end, since it seems those three members should stick around together. :)Fixes ed3100e90d0d ("virtio_net: Use new RSS config structs")Signed-off-by Gustavo A. R. Silva <[email protected]>---
Seems to belong in net, not next.
Besides that:
Quoted 44 lines
Changes in v2:
- Update subject and changelog text (include feedback from Simon and Michael --thanks folks)
- Add Fixes tag and CC -stable.v1:
- Link: https://lore.kernel.org/linux-hardening/aLiYrQGdGmaDTtLF@kspp/drivers/net/virtio_net.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)drivers/net/virtio_net.c +9
-3@@ -425,9 +425,6 @@ struct virtnet_info {u16 rss_indir_table_size;u32 rss_hash_types_supported;u32 rss_hash_types_saved; -struct virtio_net_rss_config_hdr *rss_hdr; -struct virtio_net_rss_config_trailer rss_trailer; -u8 rss_hash_key_data[VIRTIO_NET_RSS_MAX_KEY_SIZE ];/* Has control virtqueue */ bool has_cvq;@@ -493,7 +490,16 @@ struct virtnet_info {struct failover *failover;u64 device_stats_cap; + +struct virtio_net_rss_config_hdr *rss_hdr; + +/* Must be last as it ends in a flexible-array member. */ + TRAILING_OVERLAP(struct virtio_net_rss_config_trailer, rss_trailer, hash_key_data, + u8 rss_hash_key_data[VIRTIO_NET_RSS_MAX_KEY_SIZE]; + ); }; +static_assert(offsetof(struct virtnet_info, rss_trailer.hash_key_data) == + offsetof(struct virtnet_info, rss_hash_key_data));struct padded_vnet_hdr {struct virtio_net_hdr_v1_hash hdr;Signature · 1 line
2.43.0
This patch was applied to netdev/net.git (main) by Paolo Abeni <[email protected]>:
Hello:
This patch was applied to netdev/net.git (main)
by Paolo Abeni <[email protected]>:
Quoted 5 lines · On Sat, 10 Jan 2026 17:07:17 +0900 you wrote:
Use the new
TRAILING_OVERLAP()helper to fix a misalignment bug along with the following warning:
drivers/net/virtio_net.c:429:46: warning: structure containing a flexible array member is not at the end of another structure [-Wflex-array-member-not-at-end]
Quoted 8 lines
This helper creates a union between a flexible-array member (FAM) and a set of members that would otherwise follow it (in this case
u8 rss_hash_key_data[VIRTIO_NET_RSS_MAX_KEY_SIZE];). This overlays the trailing members (rss_hash_key_data) onto the FAM (hash_key_data) while keeping the FAM and the start of MEMBERS aligned. Thestatic_assert()ensures this alignment remains.[...]
Here is the summary with links:
- [v2,next] virtio_net: Fix misalignment bug in struct virtnet_info
https://git.kernel.org/netdev/net/c/4156c3745f06
You are awesome, thank you!
Signature · 2 lines
Deet-doot-dot, I am a bot. https://korg.docs.kernel.org/patchwork/pwbot.html