|
@@ -337,6 +337,39 @@ static int add_roce_gid(struct ib_gid_table_entry *entry)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * del_gid - Delete GID table entry
|
|
|
+ *
|
|
|
+ * @ib_dev: IB device whose GID entry to be deleted
|
|
|
+ * @port: Port number of the IB device
|
|
|
+ * @table: GID table of the IB device for a port
|
|
|
+ * @ix: GID entry index to delete
|
|
|
+ *
|
|
|
+ */
|
|
|
+static void del_gid(struct ib_device *ib_dev, u8 port,
|
|
|
+ struct ib_gid_table *table, int ix)
|
|
|
+{
|
|
|
+ struct ib_gid_table_entry *entry;
|
|
|
+
|
|
|
+ lockdep_assert_held(&table->lock);
|
|
|
+
|
|
|
+ pr_debug("%s device=%s port=%d index=%d gid %pI6\n", __func__,
|
|
|
+ ib_dev->name, port, ix,
|
|
|
+ table->data_vec[ix]->attr.gid.raw);
|
|
|
+
|
|
|
+ write_lock_irq(&table->rwlock);
|
|
|
+ entry = table->data_vec[ix];
|
|
|
+ entry->state = GID_TABLE_ENTRY_PENDING_DEL;
|
|
|
+ /*
|
|
|
+ * For non RoCE protocol, GID entry slot is ready to use.
|
|
|
+ */
|
|
|
+ if (!rdma_protocol_roce(ib_dev, port))
|
|
|
+ table->data_vec[ix] = NULL;
|
|
|
+ write_unlock_irq(&table->rwlock);
|
|
|
+
|
|
|
+ put_gid_entry_locked(entry);
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* add_modify_gid - Add or modify GID table entry
|
|
|
*
|
|
@@ -358,7 +391,7 @@ static int add_modify_gid(struct ib_gid_table *table,
|
|
|
* this index.
|
|
|
*/
|
|
|
if (is_gid_entry_valid(table->data_vec[attr->index]))
|
|
|
- put_gid_entry(table->data_vec[attr->index]);
|
|
|
+ del_gid(attr->device, attr->port_num, table, attr->index);
|
|
|
|
|
|
/*
|
|
|
* Some HCA's report multiple GID entries with only one valid GID, and
|
|
@@ -386,39 +419,6 @@ done:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * del_gid - Delete GID table entry
|
|
|
- *
|
|
|
- * @ib_dev: IB device whose GID entry to be deleted
|
|
|
- * @port: Port number of the IB device
|
|
|
- * @table: GID table of the IB device for a port
|
|
|
- * @ix: GID entry index to delete
|
|
|
- *
|
|
|
- */
|
|
|
-static void del_gid(struct ib_device *ib_dev, u8 port,
|
|
|
- struct ib_gid_table *table, int ix)
|
|
|
-{
|
|
|
- struct ib_gid_table_entry *entry;
|
|
|
-
|
|
|
- lockdep_assert_held(&table->lock);
|
|
|
-
|
|
|
- pr_debug("%s device=%s port=%d index=%d gid %pI6\n", __func__,
|
|
|
- ib_dev->name, port, ix,
|
|
|
- table->data_vec[ix]->attr.gid.raw);
|
|
|
-
|
|
|
- write_lock_irq(&table->rwlock);
|
|
|
- entry = table->data_vec[ix];
|
|
|
- entry->state = GID_TABLE_ENTRY_PENDING_DEL;
|
|
|
- /*
|
|
|
- * For non RoCE protocol, GID entry slot is ready to use.
|
|
|
- */
|
|
|
- if (!rdma_protocol_roce(ib_dev, port))
|
|
|
- table->data_vec[ix] = NULL;
|
|
|
- write_unlock_irq(&table->rwlock);
|
|
|
-
|
|
|
- put_gid_entry_locked(entry);
|
|
|
-}
|
|
|
-
|
|
|
/* rwlock should be read locked, or lock should be held */
|
|
|
static int find_gid(struct ib_gid_table *table, const union ib_gid *gid,
|
|
|
const struct ib_gid_attr *val, bool default_gid,
|