Skip to content

Commit 89d42b8

Browse files
longlimsftjgunthorpe
authored andcommitted
RDMA/mana_ib: Fix a bug when the PF indicates more entries for registering memory on first packet
When registering memory in a large chunk that doesn't fit into a single PF message, the PF may return GDMA_STATUS_MORE_ENTRIES on the first message if there are more messages needed for registering more chunks. Fix the VF to make it process the correct return code. Fixes: 0266a17 ("RDMA/mana_ib: Add a driver for Microsoft Azure Network Adapter") Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Long Li <[email protected]> Signed-off-by: Jason Gunthorpe <[email protected]>
1 parent 72a0362 commit 89d42b8

File tree

1 file changed

+12
-10
lines changed
  • drivers/infiniband/hw/mana

1 file changed

+12
-10
lines changed

drivers/infiniband/hw/mana/main.c

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,8 @@ static int
249249
mana_ib_gd_first_dma_region(struct mana_ib_dev *dev,
250250
struct gdma_context *gc,
251251
struct gdma_create_dma_region_req *create_req,
252-
size_t num_pages, mana_handle_t *gdma_region)
252+
size_t num_pages, mana_handle_t *gdma_region,
253+
u32 expected_status)
253254
{
254255
struct gdma_create_dma_region_resp create_resp = {};
255256
unsigned int create_req_msg_size;
@@ -261,7 +262,7 @@ mana_ib_gd_first_dma_region(struct mana_ib_dev *dev,
261262

262263
err = mana_gd_send_request(gc, create_req_msg_size, create_req,
263264
sizeof(create_resp), &create_resp);
264-
if (err || create_resp.hdr.status) {
265+
if (err || create_resp.hdr.status != expected_status) {
265266
ibdev_dbg(&dev->ib_dev,
266267
"Failed to create DMA region: %d, 0x%x\n",
267268
err, create_resp.hdr.status);
@@ -372,14 +373,21 @@ int mana_ib_gd_create_dma_region(struct mana_ib_dev *dev, struct ib_umem *umem,
372373

373374
page_addr_list = create_req->page_addr_list;
374375
rdma_umem_for_each_dma_block(umem, &biter, page_sz) {
376+
u32 expected_status = 0;
377+
375378
page_addr_list[tail++] = rdma_block_iter_dma_address(&biter);
376379
if (tail < num_pages_to_handle)
377380
continue;
378381

382+
if (num_pages_processed + num_pages_to_handle <
383+
num_pages_total)
384+
expected_status = GDMA_STATUS_MORE_ENTRIES;
385+
379386
if (!num_pages_processed) {
380387
/* First create message */
381388
err = mana_ib_gd_first_dma_region(dev, gc, create_req,
382-
tail, gdma_region);
389+
tail, gdma_region,
390+
expected_status);
383391
if (err)
384392
goto out;
385393

@@ -392,14 +400,8 @@ int mana_ib_gd_create_dma_region(struct mana_ib_dev *dev, struct ib_umem *umem,
392400
page_addr_list = add_req->page_addr_list;
393401
} else {
394402
/* Subsequent create messages */
395-
u32 expected_s = 0;
396-
397-
if (num_pages_processed + num_pages_to_handle <
398-
num_pages_total)
399-
expected_s = GDMA_STATUS_MORE_ENTRIES;
400-
401403
err = mana_ib_gd_add_dma_region(dev, gc, add_req, tail,
402-
expected_s);
404+
expected_status);
403405
if (err)
404406
break;
405407
}

0 commit comments

Comments
 (0)