Skip to content

Commit e537dee

Browse files
committed
RDMA/mana_ib: Add flex array to struct mana_cfg_rx_steer_req_v2
The "struct mana_cfg_rx_steer_req_v2" uses a dynamically sized set of trailing elements. Specifically, it uses a "mana_handle_t" array. So, use the preferred way in the kernel declaring a flexible array [1]. At the same time, prepare for the coming implementation by GCC and Clang of the __counted_by attribute. Flexible array members annotated with __counted_by can have their accesses bounds-checked at run-time via CONFIG_UBSAN_BOUNDS (for array indexing) and CONFIG_FORTIFY_SOURCE (for strcpy/memcpy-family functions). Also, avoid the open-coded arithmetic in the memory allocator functions [2] using the "struct_size" macro. Moreover, use the "offsetof" helper to get the indirect table offset instead of the "sizeof" operator and avoid the open-coded arithmetic in pointers using the new flex member. This new structure member also allow us to remove the "req_indir_tab" variable since it is no longer needed. Now, it is also possible to use the "flex_array_size" helper to compute the size of these trailing elements in the "memcpy" function. Specifically, the first commit adds the flex member and the patches 2 and 3 refactor the consumers of the "struct mana_cfg_rx_steer_req_v2". This code was detected with the help of Coccinelle, and audited and modified manually. The Coccinelle script used to detect this code pattern is the following: virtual report @rule1@ type t1; type t2; identifier i0; identifier i1; identifier i2; identifier ALLOC =~ "kmalloc|kzalloc|kmalloc_node|kzalloc_node|vmalloc|vzalloc|kvmalloc|kvzalloc"; position p1; @@ i0 = sizeof(t1) + sizeof(t2) * i1; ... i2 = ALLOC@p1(..., i0, ...); @script:python depends on report@ p1 << rule1.p1; @@ msg = "WARNING: verify allocation on line %s" % (p1[0].line) coccilib.report.print_report(p1[0],msg) [1] https://www.kernel.org/doc/html/next/process/deprecated.html#zero-length-and-one-element-arrays [2] https://www.kernel.org/doc/html/next/process/deprecated.html#open-coded-arithmetic-in-allocator-arguments Link: https://lore.kernel.org/all/AS8PR02MB72374BD1B23728F2E3C3B1A18B022@AS8PR02MB7237.eurprd02.prod.outlook.com Signed-off-by: Erick Archer <erick.archer@outlook.com> Signed-off-by: Leon Romanovsky <leon@kernel.org> * mana-ib-flex: net: mana: Avoid open coded arithmetic RDMA/mana_ib: Prefer struct_size over open coded arithmetic net: mana: Add flex array to struct mana_cfg_rx_steer_req_v2
2 parents ee20cc1 + a68292e commit e537dee

File tree

3 files changed

+12
-15
lines changed

3 files changed

+12
-15
lines changed

drivers/infiniband/hw/mana/qp.c

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,13 @@ static int mana_ib_cfg_vport_steering(struct mana_ib_dev *dev,
1515
struct mana_port_context *mpc = netdev_priv(ndev);
1616
struct mana_cfg_rx_steer_req_v2 *req;
1717
struct mana_cfg_rx_steer_resp resp = {};
18-
mana_handle_t *req_indir_tab;
1918
struct gdma_context *gc;
2019
u32 req_buf_size;
2120
int i, err;
2221

2322
gc = mdev_to_gc(dev);
2423

25-
req_buf_size =
26-
sizeof(*req) + sizeof(mana_handle_t) * MANA_INDIRECT_TABLE_SIZE;
24+
req_buf_size = struct_size(req, indir_tab, MANA_INDIRECT_TABLE_SIZE);
2725
req = kzalloc(req_buf_size, GFP_KERNEL);
2826
if (!req)
2927
return -ENOMEM;
@@ -44,20 +42,20 @@ static int mana_ib_cfg_vport_steering(struct mana_ib_dev *dev,
4442
req->rss_enable = true;
4543

4644
req->num_indir_entries = MANA_INDIRECT_TABLE_SIZE;
47-
req->indir_tab_offset = sizeof(*req);
45+
req->indir_tab_offset = offsetof(struct mana_cfg_rx_steer_req_v2,
46+
indir_tab);
4847
req->update_indir_tab = true;
4948
req->cqe_coalescing_enable = 1;
5049

51-
req_indir_tab = (mana_handle_t *)(req + 1);
5250
/* The ind table passed to the hardware must have
5351
* MANA_INDIRECT_TABLE_SIZE entries. Adjust the verb
5452
* ind_table to MANA_INDIRECT_TABLE_SIZE if required
5553
*/
5654
ibdev_dbg(&dev->ib_dev, "ind table size %u\n", 1 << log_ind_tbl_size);
5755
for (i = 0; i < MANA_INDIRECT_TABLE_SIZE; i++) {
58-
req_indir_tab[i] = ind_table[i % (1 << log_ind_tbl_size)];
56+
req->indir_tab[i] = ind_table[i % (1 << log_ind_tbl_size)];
5957
ibdev_dbg(&dev->ib_dev, "index %u handle 0x%llx\n", i,
60-
req_indir_tab[i]);
58+
req->indir_tab[i]);
6159
}
6260

6361
req->update_hashkey = true;

drivers/net/ethernet/microsoft/mana/mana_en.c

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1058,11 +1058,10 @@ static int mana_cfg_vport_steering(struct mana_port_context *apc,
10581058
struct mana_cfg_rx_steer_req_v2 *req;
10591059
struct mana_cfg_rx_steer_resp resp = {};
10601060
struct net_device *ndev = apc->ndev;
1061-
mana_handle_t *req_indir_tab;
10621061
u32 req_buf_size;
10631062
int err;
10641063

1065-
req_buf_size = sizeof(*req) + sizeof(mana_handle_t) * num_entries;
1064+
req_buf_size = struct_size(req, indir_tab, num_entries);
10661065
req = kzalloc(req_buf_size, GFP_KERNEL);
10671066
if (!req)
10681067
return -ENOMEM;
@@ -1074,7 +1073,8 @@ static int mana_cfg_vport_steering(struct mana_port_context *apc,
10741073

10751074
req->vport = apc->port_handle;
10761075
req->num_indir_entries = num_entries;
1077-
req->indir_tab_offset = sizeof(*req);
1076+
req->indir_tab_offset = offsetof(struct mana_cfg_rx_steer_req_v2,
1077+
indir_tab);
10781078
req->rx_enable = rx;
10791079
req->rss_enable = apc->rss_state;
10801080
req->update_default_rxobj = update_default_rxobj;
@@ -1086,11 +1086,9 @@ static int mana_cfg_vport_steering(struct mana_port_context *apc,
10861086
if (update_key)
10871087
memcpy(&req->hashkey, apc->hashkey, MANA_HASH_KEY_SIZE);
10881088

1089-
if (update_tab) {
1090-
req_indir_tab = (mana_handle_t *)(req + 1);
1091-
memcpy(req_indir_tab, apc->rxobj_table,
1092-
req->num_indir_entries * sizeof(mana_handle_t));
1093-
}
1089+
if (update_tab)
1090+
memcpy(req->indir_tab, apc->rxobj_table,
1091+
flex_array_size(req, indir_tab, req->num_indir_entries));
10941092

10951093
err = mana_send_request(apc->ac, req, req_buf_size, &resp,
10961094
sizeof(resp));

include/net/mana/mana.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -671,6 +671,7 @@ struct mana_cfg_rx_steer_req_v2 {
671671
u8 hashkey[MANA_HASH_KEY_SIZE];
672672
u8 cqe_coalescing_enable;
673673
u8 reserved2[7];
674+
mana_handle_t indir_tab[] __counted_by(num_indir_entries);
674675
}; /* HW DATA */
675676

676677
struct mana_cfg_rx_steer_resp {

0 commit comments

Comments
 (0)