From 09aeb01bccce606e53b645f015b1fa16e4e29ba2 Mon Sep 17 00:00:00 2001 From: Parav Pandit Date: Tue, 19 Feb 2019 09:07:41 +0800 Subject: [PATCH] RDMA/core: Delete RoCE GID in hw when corresponding IP is deleted mainline inclusion from mainline-5.0-rc1 commit be5914c124bc3179536e5c4598f59aeb4b880517 category: bugfix bugzilla: 6441 CVE: NA -------------------------- Since Virtual Lanes BCT credits and MTU are set through separate MADs, we Currently a RoCE GID entry is removed from the hardware when all references to the GID entry drop to zero. This is a change in behavior from before the fixed patch. The GID entry should be removed from the hardware when GID entry deletion is requested. This allows the driver terminate ongoing traffic through the RoCE GID. While a GID is deleted from the hardware, GID slot in the software GID cache is not freed. GID slot is freed once all references of such GID are dropped. This continue to ensure that such GID slot of hardware is not allocated to new GID entry allocation request. It is allocated once all references to GID entry drop. This approach allows drivers to put a tombestone of some kind on the HW GID index to block the traffic. Fixes: b150c3862d21 ("IB/core: Introduce GID entry reference counts") Signed-off-by: Parav Pandit Reviewed-by: Mark Bloch Signed-off-by: Leon Romanovsky Signed-off-by: Jason Gunthorpe Signed-off-by: Jing Xiangfeng Reviewed-by: Hanjun Guo Signed-off-by: Yang Yingliang --- drivers/infiniband/core/cache.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/drivers/infiniband/core/cache.c b/drivers/infiniband/core/cache.c index 3208ad6ad540..99e321c72e75 100644 --- a/drivers/infiniband/core/cache.c +++ b/drivers/infiniband/core/cache.c @@ -216,10 +216,6 @@ static void free_gid_entry_locked(struct ib_gid_table_entry *entry) device->name, port_num, entry->attr.index, entry->attr.gid.raw); - if (rdma_cap_roce_gid_table(device, port_num) && - entry->state != GID_TABLE_ENTRY_INVALID) - device->del_gid(&entry->attr, &entry->context); - write_lock_irq(&table->rwlock); /* @@ -367,6 +363,9 @@ static void del_gid(struct ib_device *ib_dev, u8 port, table->data_vec[ix] = NULL; write_unlock_irq(&table->rwlock); + if (rdma_cap_roce_gid_table(ib_dev, port)) + ib_dev->del_gid(&entry->attr, &entry->context); + put_gid_entry_locked(entry); } -- GitLab