Re: [PATCH for-next 2/7] IB/mlx4: Add RoCE per GID support for add_gid and del_gid

2015-12-30 Thread Matan Barak



On 12/29/2015 5:24 PM, Or Gerlitz wrote:

On 12/29/2015 3:24 PM, Matan Barak wrote:

[...] We use a new firmware command in order to populate the GID table
and store the type along with the GID value.


Its a new value to existing command.. so better say we use a new value
to the SET_PORT firmware command to do X



Ok


Also here, break out mlx4_core new functionality e.g the changes to
include/linux/mlx4/cmd.h into mlx4_core only patch. You don't need any
change to mlx4_core to have it's own patch, I guess one up to three mlx4
core patches would be OK.



I'll split mlx4_core logically.


Did you make sure (at the resource tracker) that VFs can't do this new
set port command flavor?



In mlx4_common_set_port:
if (slave != dev->caps.function &&
in_modifier != MLX4_SET_PORT_GENERAL &&
 in_modifier != MLX4_SET_PORT_GID_TABLE) {
mlx4_warn(dev, "denying SET_PORT for slave:%d\n", slave);
return -EINVAL;
}




Also find some spot to put blank line in the change-log, it's hard to
read this way.



No problem


Or.


Matan




--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH for-next 2/7] IB/mlx4: Add RoCE per GID support for add_gid and del_gid

2015-12-29 Thread Or Gerlitz

On 12/29/2015 3:24 PM, Matan Barak wrote:

[...] We use a new firmware command in order to populate the GID table and 
store the type along with the GID value.


Its a new value to existing command.. so better say we use a new value 
to the SET_PORT firmware command to do X


Also here, break out mlx4_core new functionality e.g the changes to 
include/linux/mlx4/cmd.h into mlx4_core only patch. You don't need any 
change to mlx4_core to have it's own patch, I guess one up to three mlx4 
core patches would be OK.


Did you make sure (at the resource tracker) that VFs can't do this new 
set port command flavor?


Also find some spot to put blank line in the change-log, it's hard to 
read this way.


Or.


--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH for-next 2/7] IB/mlx4: Add RoCE per GID support for add_gid and del_gid

2015-12-29 Thread Matan Barak
In RoCE, GID table is managed in the IB core driver. The role of the
mlx4 driver is to synchronize the HW with the entries in the GID table.
Since it is possible that the same GID value will appear more than once
in the GID table (though with different attributes) it is required from
the mlx4 driver to maintain a reference counting mechanism and populate
the HW with a single value. We use a new firmware command in order to
populate the GID table and store the type along with the GID value.

Signed-off-by: Moni Shoua 
---
 drivers/infiniband/hw/mlx4/main.c| 69 +---
 drivers/infiniband/hw/mlx4/mlx4_ib.h |  1 +
 include/linux/mlx4/cmd.h |  3 +-
 3 files changed, 67 insertions(+), 6 deletions(-)

diff --git a/drivers/infiniband/hw/mlx4/main.c 
b/drivers/infiniband/hw/mlx4/main.c
index 627267f..988fa33 100644
--- a/drivers/infiniband/hw/mlx4/main.c
+++ b/drivers/infiniband/hw/mlx4/main.c
@@ -154,9 +154,9 @@ static struct net_device *mlx4_ib_get_netdev(struct 
ib_device *device, u8 port_n
return dev;
 }
 
-static int mlx4_ib_update_gids(struct gid_entry *gids,
-  struct mlx4_ib_dev *ibdev,
-  u8 port_num)
+static int mlx4_ib_update_gids_v1(struct gid_entry *gids,
+ struct mlx4_ib_dev *ibdev,
+ u8 port_num)
 {
struct mlx4_cmd_mailbox *mailbox;
int err;
@@ -187,6 +187,61 @@ static int mlx4_ib_update_gids(struct gid_entry *gids,
return err;
 }
 
+static int mlx4_ib_update_gids_v1_v2(struct gid_entry *gids,
+struct mlx4_ib_dev *ibdev,
+u8 port_num)
+{
+   struct mlx4_cmd_mailbox *mailbox;
+   int err;
+   struct mlx4_dev *dev = ibdev->dev;
+   int i;
+   struct {
+   union ib_gidgid;
+   __be32  rsrvd1[2];
+   __be16  rsrvd2;
+   u8  type;
+   u8  version;
+   __be32  rsrvd3;
+   } *gid_tbl;
+
+   mailbox = mlx4_alloc_cmd_mailbox(dev);
+   if (IS_ERR(mailbox))
+   return -ENOMEM;
+
+   gid_tbl = mailbox->buf;
+   for (i = 0; i < MLX4_MAX_PORT_GIDS; ++i) {
+   memcpy(_tbl[i].gid, [i].gid, sizeof(union ib_gid));
+   if (gids[i].gid_type == IB_GID_TYPE_ROCE_UDP_ENCAP) {
+   gid_tbl[i].version = 2;
+   if (!ipv6_addr_v4mapped((struct in6_addr 
*)[i].gid))
+   gid_tbl[i].type = 1;
+   }
+   }
+
+   err = mlx4_cmd(dev, mailbox->dma,
+  MLX4_SET_PORT_ROCE_ADDR << 8 | port_num,
+  1, MLX4_CMD_SET_PORT, MLX4_CMD_TIME_CLASS_B,
+  MLX4_CMD_WRAPPED);
+   if (mlx4_is_bonded(dev))
+   err += mlx4_cmd(dev, mailbox->dma,
+   MLX4_SET_PORT_ROCE_ADDR << 8 | 2,
+   1, MLX4_CMD_SET_PORT, MLX4_CMD_TIME_CLASS_B,
+   MLX4_CMD_WRAPPED);
+
+   mlx4_free_cmd_mailbox(dev, mailbox);
+   return err;
+}
+
+static int mlx4_ib_update_gids(struct gid_entry *gids,
+  struct mlx4_ib_dev *ibdev,
+  u8 port_num)
+{
+   if (ibdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_ROCE_V1_V2)
+   return mlx4_ib_update_gids_v1_v2(gids, ibdev, port_num);
+
+   return mlx4_ib_update_gids_v1(gids, ibdev, port_num);
+}
+
 static int mlx4_ib_add_gid(struct ib_device *device,
   u8 port_num,
   unsigned int index,
@@ -215,7 +270,8 @@ static int mlx4_ib_add_gid(struct ib_device *device,
port_gid_table = >gids[port_num - 1];
spin_lock_bh(>lock);
for (i = 0; i < MLX4_MAX_PORT_GIDS; ++i) {
-   if (!memcmp(_gid_table->gids[i].gid, gid, sizeof(*gid))) {
+   if (!memcmp(_gid_table->gids[i].gid, gid, sizeof(*gid)) &&
+   (port_gid_table->gids[i].gid_type == attr->gid_type))  {
found = i;
break;
}
@@ -233,6 +289,7 @@ static int mlx4_ib_add_gid(struct ib_device *device,
} else {
*context = port_gid_table->gids[free].ctx;
memcpy(_gid_table->gids[free].gid, gid, 
sizeof(*gid));
+   port_gid_table->gids[free].gid_type = 
attr->gid_type;
port_gid_table->gids[free].ctx->real_index = 
free;
port_gid_table->gids[free].ctx->refcount = 1;
hw_update = 1;
@@ -248,8 +305,10 @@ static int mlx4_ib_add_gid(struct ib_device *device,
if (!gids) {
ret = -ENOMEM;