Merge branch 'compiler_types-add-endianness-dependent-__counted_by_-le-be'
Alexander Lobakin says: ==================== compiler_types: add Endianness-dependent __counted_by_{le,be} Some structures contain flexible arrays at the end and the counter for them, but the counter has explicit Endianness and thus __counted_by() can't be used directly. To increase test coverage for potential problems without breaking anything, introduce __counted_by_{le,be} defined depending on platform's Endianness to either __counted_by() when applicable or noop otherwise. The first user will be virtchnl2.h from idpf just as example with 9 flex structures having Little Endian counters. Maybe it would be a good idea to introduce such attributes on compiler level if possible, but for now let's stop on what we have. ==================== Link: https://lore.kernel.org/r/20240327142241.1745989-1-aleksander.lobakin@intel.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
af352c3b66
@ -75,6 +75,8 @@ if major >= 3:
|
||||
"__rcu",
|
||||
"__user",
|
||||
"__force",
|
||||
"__counted_by_le",
|
||||
"__counted_by_be",
|
||||
|
||||
# include/linux/compiler_attributes.h:
|
||||
"__alias",
|
||||
|
@ -8,6 +8,8 @@
|
||||
#include <net/tcp.h>
|
||||
#include <net/netdev_queues.h>
|
||||
|
||||
#include "virtchnl2_lan_desc.h"
|
||||
|
||||
#define IDPF_LARGE_MAX_Q 256
|
||||
#define IDPF_MAX_Q 16
|
||||
#define IDPF_MIN_Q 2
|
||||
|
@ -4,6 +4,8 @@
|
||||
#ifndef _VIRTCHNL2_H_
|
||||
#define _VIRTCHNL2_H_
|
||||
|
||||
#include <linux/if_ether.h>
|
||||
|
||||
/* All opcodes associated with virtchnl2 are prefixed with virtchnl2 or
|
||||
* VIRTCHNL2. Any future opcodes, offloads/capabilities, structures,
|
||||
* and defines must be prefixed with virtchnl2 or VIRTCHNL2 to avoid confusion.
|
||||
@ -17,8 +19,6 @@
|
||||
* must remain unchanged over time, so we specify explicit values for all enums.
|
||||
*/
|
||||
|
||||
#include "virtchnl2_lan_desc.h"
|
||||
|
||||
/* This macro is used to generate compilation errors if a structure
|
||||
* is not exactly the correct length.
|
||||
*/
|
||||
@ -555,7 +555,7 @@ VIRTCHNL2_CHECK_STRUCT_LEN(32, virtchnl2_queue_reg_chunk);
|
||||
struct virtchnl2_queue_reg_chunks {
|
||||
__le16 num_chunks;
|
||||
u8 pad[6];
|
||||
struct virtchnl2_queue_reg_chunk chunks[];
|
||||
struct virtchnl2_queue_reg_chunk chunks[] __counted_by_le(num_chunks);
|
||||
};
|
||||
VIRTCHNL2_CHECK_STRUCT_LEN(8, virtchnl2_queue_reg_chunks);
|
||||
|
||||
@ -703,7 +703,7 @@ struct virtchnl2_config_tx_queues {
|
||||
__le32 vport_id;
|
||||
__le16 num_qinfo;
|
||||
u8 pad[10];
|
||||
struct virtchnl2_txq_info qinfo[];
|
||||
struct virtchnl2_txq_info qinfo[] __counted_by_le(num_qinfo);
|
||||
};
|
||||
VIRTCHNL2_CHECK_STRUCT_LEN(16, virtchnl2_config_tx_queues);
|
||||
|
||||
@ -782,7 +782,7 @@ struct virtchnl2_config_rx_queues {
|
||||
__le32 vport_id;
|
||||
__le16 num_qinfo;
|
||||
u8 pad[18];
|
||||
struct virtchnl2_rxq_info qinfo[];
|
||||
struct virtchnl2_rxq_info qinfo[] __counted_by_le(num_qinfo);
|
||||
};
|
||||
VIRTCHNL2_CHECK_STRUCT_LEN(24, virtchnl2_config_rx_queues);
|
||||
|
||||
@ -868,7 +868,7 @@ VIRTCHNL2_CHECK_STRUCT_LEN(32, virtchnl2_vector_chunk);
|
||||
struct virtchnl2_vector_chunks {
|
||||
__le16 num_vchunks;
|
||||
u8 pad[14];
|
||||
struct virtchnl2_vector_chunk vchunks[];
|
||||
struct virtchnl2_vector_chunk vchunks[] __counted_by_le(num_vchunks);
|
||||
};
|
||||
VIRTCHNL2_CHECK_STRUCT_LEN(16, virtchnl2_vector_chunks);
|
||||
|
||||
@ -912,7 +912,7 @@ struct virtchnl2_rss_lut {
|
||||
__le16 lut_entries_start;
|
||||
__le16 lut_entries;
|
||||
u8 pad[4];
|
||||
__le32 lut[];
|
||||
__le32 lut[] __counted_by_le(lut_entries);
|
||||
};
|
||||
VIRTCHNL2_CHECK_STRUCT_LEN(12, virtchnl2_rss_lut);
|
||||
|
||||
@ -977,7 +977,7 @@ struct virtchnl2_ptype {
|
||||
u8 ptype_id_8;
|
||||
u8 proto_id_count;
|
||||
__le16 pad;
|
||||
__le16 proto_id[];
|
||||
__le16 proto_id[] __counted_by(proto_id_count);
|
||||
} __packed __aligned(2);
|
||||
VIRTCHNL2_CHECK_STRUCT_LEN(6, virtchnl2_ptype);
|
||||
|
||||
@ -1104,7 +1104,7 @@ struct virtchnl2_rss_key {
|
||||
__le32 vport_id;
|
||||
__le16 key_len;
|
||||
u8 pad;
|
||||
u8 key_flex[];
|
||||
u8 key_flex[] __counted_by_le(key_len);
|
||||
} __packed;
|
||||
VIRTCHNL2_CHECK_STRUCT_LEN(7, virtchnl2_rss_key);
|
||||
|
||||
@ -1131,7 +1131,7 @@ VIRTCHNL2_CHECK_STRUCT_LEN(16, virtchnl2_queue_chunk);
|
||||
struct virtchnl2_queue_chunks {
|
||||
__le16 num_chunks;
|
||||
u8 pad[6];
|
||||
struct virtchnl2_queue_chunk chunks[];
|
||||
struct virtchnl2_queue_chunk chunks[] __counted_by_le(num_chunks);
|
||||
};
|
||||
VIRTCHNL2_CHECK_STRUCT_LEN(8, virtchnl2_queue_chunks);
|
||||
|
||||
@ -1195,7 +1195,7 @@ struct virtchnl2_queue_vector_maps {
|
||||
__le32 vport_id;
|
||||
__le16 num_qv_maps;
|
||||
u8 pad[10];
|
||||
struct virtchnl2_queue_vector qv_maps[];
|
||||
struct virtchnl2_queue_vector qv_maps[] __counted_by_le(num_qv_maps);
|
||||
};
|
||||
VIRTCHNL2_CHECK_STRUCT_LEN(16, virtchnl2_queue_vector_maps);
|
||||
|
||||
@ -1247,7 +1247,7 @@ struct virtchnl2_mac_addr_list {
|
||||
__le32 vport_id;
|
||||
__le16 num_mac_addr;
|
||||
u8 pad[2];
|
||||
struct virtchnl2_mac_addr mac_addr_list[];
|
||||
struct virtchnl2_mac_addr mac_addr_list[] __counted_by_le(num_mac_addr);
|
||||
};
|
||||
VIRTCHNL2_CHECK_STRUCT_LEN(8, virtchnl2_mac_addr_list);
|
||||
|
||||
|
@ -282,6 +282,17 @@ struct ftrace_likely_data {
|
||||
#define __no_sanitize_or_inline __always_inline
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Apply __counted_by() when the Endianness matches to increase test coverage.
|
||||
*/
|
||||
#ifdef __LITTLE_ENDIAN
|
||||
#define __counted_by_le(member) __counted_by(member)
|
||||
#define __counted_by_be(member)
|
||||
#else
|
||||
#define __counted_by_le(member)
|
||||
#define __counted_by_be(member) __counted_by(member)
|
||||
#endif
|
||||
|
||||
/* Do not trap wrapping arithmetic within an annotated function. */
|
||||
#ifdef CONFIG_UBSAN_SIGNED_WRAP
|
||||
# define __signed_wrap __attribute__((no_sanitize("signed-integer-overflow")))
|
||||
|
@ -1143,6 +1143,7 @@ sub dump_struct($$) {
|
||||
$members =~ s/\s*$attribute/ /gi;
|
||||
$members =~ s/\s*__aligned\s*\([^;]*\)/ /gos;
|
||||
$members =~ s/\s*__counted_by\s*\([^;]*\)/ /gos;
|
||||
$members =~ s/\s*__counted_by_(le|be)\s*\([^;]*\)/ /gos;
|
||||
$members =~ s/\s*__packed\s*/ /gos;
|
||||
$members =~ s/\s*CRYPTO_MINALIGN_ATTR/ /gos;
|
||||
$members =~ s/\s*____cacheline_aligned_in_smp/ /gos;
|
||||
|
Loading…
x
Reference in New Issue
Block a user