Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 23 Apr 2016 12:15:02 -0700
From:      "David P. Discher" <dpd@dpdtech.com>
To:        Hans Petter Selasky <hps@selasky.org>
Cc:        freebsd-infiniband@freebsd.org
Subject:   Re: Request updated/unified patch for OFED v3.2 update
Message-ID:  <5A0F033C-32E0-4F44-8835-2C079581EE32@dpdtech.com>
In-Reply-To: <571BC0A6.9070100@selasky.org>
References:  <AD97190D-7A99-4007-B0F9-6684D39326AC@dpdtech.com> <571B31B6.4070206@selasky.org> <571BC0A6.9070100@selasky.org>

next in thread | previous in thread | raw e-mail | index | archive | help

--Apple-Mail=_11D7EE31-E231-4C64-801D-5222CD654299
Content-Type: multipart/mixed;
	boundary="Apple-Mail=_81524E70-C381-42F8-AEB2-30266F029757"


--Apple-Mail=_81524E70-C381-42F8-AEB2-30266F029757
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
	charset=utf-8

Thanks Hans ! - Just one issue =E2=80=A6 I was going to attempt to =
resolve myself, but the rej is just too large.

Attached: sys/ofed/drivers/infiniband/hw/mlx4/main.c.rej


--Apple-Mail=_81524E70-C381-42F8-AEB2-30266F029757
Content-Disposition: attachment;
	filename=main.c.rej
Content-Type: application/octet-stream;
	name="main.c.rej"
Content-Transfer-Encoding: 7bit

@@ -1531,420 +2144,296 @@
 	return sprintf(buf, "%x\n", dev->dev->rev_id);
 }
 
-static ssize_t show_board(struct device *device, struct device_attribute *attr,
-			  char *buf)
-{
-	struct mlx4_ib_dev *dev =
-		container_of(device, struct mlx4_ib_dev, ib_dev.dev);
-	return sprintf(buf, "%.*s\n", MLX4_BOARD_ID_LEN,
-		       dev->dev->board_id);
-}
-
-static ssize_t show_vsd(struct device *device, struct device_attribute *attr,
-			  char *buf)
-{
-	struct mlx4_ib_dev *dev =
-		container_of(device, struct mlx4_ib_dev, ib_dev.dev);
-	ssize_t len = MLX4_VSD_LEN;
-
-	if (dev->dev->vsd_vendor_id == PCI_VENDOR_ID_MELLANOX)
-		len = sprintf(buf, "%.*s\n", MLX4_VSD_LEN, dev->dev->vsd);
-	else
-		memcpy(buf, dev->dev->vsd, MLX4_VSD_LEN);
-
-	return len;
-}
-
-static DEVICE_ATTR(hw_rev,   S_IRUGO, show_rev,    NULL);
-static DEVICE_ATTR(fw_ver,   S_IRUGO, show_fw_ver, NULL);
-static DEVICE_ATTR(hca_type, S_IRUGO, show_hca,    NULL);
-static DEVICE_ATTR(board_id, S_IRUGO, show_board,  NULL);
-static DEVICE_ATTR(vsd,      S_IRUGO, show_vsd,    NULL);
-
-static struct device_attribute *mlx4_class_attributes[] = {
-	&dev_attr_hw_rev,
-	&dev_attr_fw_ver,
-	&dev_attr_hca_type,
-	&dev_attr_board_id,
-	&dev_attr_vsd
-};
-
-static void mlx4_addrconf_ifid_eui48(u8 *eui, u16 vlan_id, struct net_device *dev, u8 port)
-{
-        memcpy(eui, IF_LLADDR(dev), 3);
-        memcpy(eui + 5, IF_LLADDR(dev) + 3, 3);
-	if (vlan_id < 0x1000) {
-		eui[3] = vlan_id >> 8;
-		eui[4] = vlan_id & 0xff;
-	} else {
-		eui[3] = 0xff;
-		eui[4] = 0xfe;
-	}
-	eui[0] ^= 2;
-}
-
-static void update_gids_task(struct work_struct *work)
-{
-	struct update_gid_work *gw = container_of(work, struct update_gid_work, work);
-	struct mlx4_cmd_mailbox *mailbox;
-	union ib_gid *gids;
-	int err;
-	struct mlx4_dev	*dev = gw->dev->dev;
-
-
-	mailbox = mlx4_alloc_cmd_mailbox(dev);
-	if (IS_ERR(mailbox)) {
-		pr_warn("update gid table failed %ld\n", PTR_ERR(mailbox));
-		goto free;
-	}
-
-	gids = mailbox->buf;
-	memcpy(gids, gw->gids, sizeof gw->gids);
-
-	if (mlx4_ib_port_link_layer(&gw->dev->ib_dev, gw->port) ==
-					IB_LINK_LAYER_ETHERNET) {
-		err = mlx4_cmd(dev, mailbox->dma,
-			       MLX4_SET_PORT_GID_TABLE << 8 | gw->port,
-			       1, MLX4_CMD_SET_PORT, MLX4_CMD_TIME_CLASS_B,
-			       MLX4_CMD_WRAPPED);
-
-		if (err)
-			pr_warn("set port command failed\n");
-		else
-			mlx4_ib_dispatch_event(gw->dev, gw->port,
-					       IB_EVENT_GID_CHANGE);
-	}
-
-	mlx4_free_cmd_mailbox(dev, mailbox);
-free:
-	kfree(gw);
-}
-
-static void reset_gids_task(struct work_struct *work)
+static ssize_t show_board(struct device *device, struct device_attribute *attr,
+			  char *buf)
 {
-	struct update_gid_work *gw =
-			container_of(work, struct update_gid_work, work);
-	struct mlx4_cmd_mailbox *mailbox;
-	union ib_gid *gids;
-	int err;
-	struct mlx4_dev	*dev = gw->dev->dev;
-
-	mailbox = mlx4_alloc_cmd_mailbox(dev);
-	if (IS_ERR(mailbox)) {
-		pr_warn("reset gid table failed\n");
-		goto free;
-	}
-
-	gids = mailbox->buf;
-	memcpy(gids, gw->gids, sizeof(gw->gids));
-
-	if (mlx4_ib_port_link_layer(&gw->dev->ib_dev, 1) ==
-					IB_LINK_LAYER_ETHERNET &&
-					dev->caps.num_ports > 0) {
-		err = mlx4_cmd(dev, mailbox->dma,
-			       MLX4_SET_PORT_GID_TABLE << 8 | 1,
-			       1, MLX4_CMD_SET_PORT, MLX4_CMD_TIME_CLASS_B,
-			       MLX4_CMD_WRAPPED);
-		if (err)
-			pr_warn("set port 1 command failed\n");
-	}
+	struct mlx4_ib_dev *dev =
+		container_of(device, struct mlx4_ib_dev, ib_dev.dev);
+	return sprintf(buf, "%.*s\n", MLX4_BOARD_ID_LEN,
+		       dev->dev->board_id);
+}
 
-	if (mlx4_ib_port_link_layer(&gw->dev->ib_dev, 2) ==
-					IB_LINK_LAYER_ETHERNET &&
-					dev->caps.num_ports > 1) {
-		err = mlx4_cmd(dev, mailbox->dma,
-			       MLX4_SET_PORT_GID_TABLE << 8 | 2,
-			       1, MLX4_CMD_SET_PORT, MLX4_CMD_TIME_CLASS_B,
-			       MLX4_CMD_WRAPPED);
-		if (err)
-			pr_warn("set port 2 command failed\n");
-	}
+static DEVICE_ATTR(hw_rev,   S_IRUGO, show_rev,    NULL);
+static DEVICE_ATTR(fw_ver,   S_IRUGO, show_fw_ver, NULL);
+static DEVICE_ATTR(hca_type, S_IRUGO, show_hca,    NULL);
+static DEVICE_ATTR(board_id, S_IRUGO, show_board,  NULL);
 
-	mlx4_free_cmd_mailbox(dev, mailbox);
-free:
-	kfree(gw);
-}
+static struct device_attribute *mlx4_class_attributes[] = {
+	&dev_attr_hw_rev,
+	&dev_attr_fw_ver,
+	&dev_attr_hca_type,
+	&dev_attr_board_id
+};
 
-static int update_gid_table(struct mlx4_ib_dev *dev, int port,
-		union ib_gid *gid, int clear, int default_gid)
+#define MLX4_IB_INVALID_MAC	((u64)-1)
+static void mlx4_ib_update_qps(struct mlx4_ib_dev *ibdev,
+			       struct net_device *dev,
+			       int port)
 {
-	struct update_gid_work *work;
-	int i;
-	int need_update = 0;
-	int free = -1;
-	int found = -1;
-	int max_gids;
-	int start_index = !default_gid;
-
-	max_gids = dev->dev->caps.gid_table_len[port];
-	for (i = start_index; i < max_gids; ++i) {
-		if (!memcmp(&dev->iboe.gid_table[port - 1][i], gid,
-		    sizeof(*gid)))
-			found = i;
-
-		if (clear) {
-			if (found >= 0) {
-				need_update = 1;
-				dev->iboe.gid_table[port - 1][found] = zgid;
-				break;
-			}
-		} else {
-			if (found >= 0)
-				break;
+	u64 new_smac = 0;
+	u64 release_mac = MLX4_IB_INVALID_MAC;
+	struct mlx4_ib_qp *qp;
 
-			if (free < 0 &&
-			    !memcmp(&dev->iboe.gid_table[port - 1][i],
-				    &zgid, sizeof(*gid)))
-				free = i;
-		}
-	}
-
-	if (found == -1 && !clear && free < 0) {
-		pr_err("GID table of port %d is full. Can't add "GID_PRINT_FMT"\n",
-		       port, GID_PRINT_ARGS(gid));
-		return -ENOMEM;
-	}
-	if (found == -1 && clear) {
-		pr_err(GID_PRINT_FMT" is not in GID table of port %d\n", GID_PRINT_ARGS(gid), port);
-		return -EINVAL;
-	}
-	if (found == -1 && !clear && free >= 0) {
-		dev->iboe.gid_table[port - 1][free] = *gid;
-		need_update = 1;
-	}
+	new_smac = mlx4_mac_to_u64(IF_LLADDR(dev));
 
-	if (!need_update)
-		return 0;
+	atomic64_set(&ibdev->iboe.mac[port - 1], new_smac);
 
-	work = kzalloc(sizeof *work, GFP_ATOMIC);
-	if (!work)
-		return -ENOMEM;
+	/* no need for update QP1 and mac registration in non-SRIOV */
+	if (!mlx4_is_mfunc(ibdev->dev))
+		return;
 
-	memcpy(work->gids, dev->iboe.gid_table[port - 1], sizeof(work->gids));
-	INIT_WORK(&work->work, update_gids_task);
-	work->port = port;
-	work->dev = dev;
-	queue_work(wq, &work->work);
+	mutex_lock(&ibdev->qp1_proxy_lock[port - 1]);
+	qp = ibdev->qp1_proxy[port - 1];
+	if (qp) {
+		int new_smac_index;
+		u64 old_smac;
+		struct mlx4_update_qp_params update_params;
 
-	return 0;
-}
+		mutex_lock(&qp->mutex);
+		old_smac = qp->pri.smac;
+		if (new_smac == old_smac)
+			goto unlock;
 
-static int reset_gid_table(struct mlx4_ib_dev *dev)
-{
-	struct update_gid_work *work;
+		new_smac_index = mlx4_register_mac(ibdev->dev, port, new_smac);
 
+		if (new_smac_index < 0)
+			goto unlock;
 
-	work = kzalloc(sizeof(*work), GFP_ATOMIC);
-	if (!work)
-		return -ENOMEM;
+		update_params.smac_index = new_smac_index;
+		if (mlx4_update_qp(ibdev->dev, qp->mqp.qpn, MLX4_UPDATE_QP_SMAC,
+				   &update_params)) {
+			release_mac = new_smac;
+			goto unlock;
+		}
+		/* if old port was zero, no mac was yet registered for this QP */
+		if (qp->pri.smac_port)
+			release_mac = old_smac;
+		qp->pri.smac = new_smac;
+		qp->pri.smac_port = port;
+		qp->pri.smac_index = new_smac_index;
+	}
 
-	memset(dev->iboe.gid_table, 0, sizeof(dev->iboe.gid_table));
-	memset(work->gids, 0, sizeof(work->gids));
-	INIT_WORK(&work->work, reset_gids_task);
-	work->dev = dev;
-	queue_work(wq, &work->work);
-	return 0;
+unlock:
+	if (release_mac != MLX4_IB_INVALID_MAC)
+		mlx4_unregister_mac(ibdev->dev, port, release_mac);
+	if (qp)
+		mutex_unlock(&qp->mutex);
+	mutex_unlock(&ibdev->qp1_proxy_lock[port - 1]);
 }
 
-/* XXX BOND Related - stub (no support for these flags in FBSD)*/
-static inline int netif_is_bond_master(struct net_device *dev)
+static struct net_device *mlx4_ib_get_netdev(struct ib_device *device, u8 port_num)
 {
-#if 0
-	return (dev->flags & IFF_MASTER) && (dev->priv_flags & IFF_BONDING);
-#endif
-        return 0;
+	struct mlx4_ib_dev *ibdev = to_mdev(device);
+	return mlx4_get_protocol_dev(ibdev->dev, MLX4_PROT_ETH, port_num);
 }
 
-static void mlx4_make_default_gid(struct  net_device *dev, union ib_gid *gid, u8 port)
+static inline enum mlx4_roce_gid_type ib_gid_type_to_mlx4_gid_type(enum ib_gid_type gid_type)
 {
-	gid->global.subnet_prefix = cpu_to_be64(0xfe80000000000000LL);
-	mlx4_addrconf_ifid_eui48(&gid->raw[8], 0xffff, dev, port);
+	switch (gid_type) {
+	case IB_GID_TYPE_IB:
+		return MLX4_ROCE_GID_TYPE_V1;
+	case IB_GID_TYPE_ROCE_V1_5:
+		return MLX4_ROCE_GID_TYPE_V1_5;
+	case IB_GID_TYPE_ROCE_V2:
+		return MLX4_ROCE_GID_TYPE_V2;
+	default:
+		return (enum mlx4_roce_gid_type)IB_GID_TYPE_SIZE;
+	}
 }
 
-static u8 mlx4_ib_get_dev_port(struct net_device *dev, struct mlx4_ib_dev *ibdev)
+static int mlx4_ib_modify_gid(struct ib_device *device,
+		       u8 port_num, unsigned int index,
+		       const union ib_gid *gid,
+		       const struct ib_gid_attr *attr,
+		       void **context)
 {
-	u8 port = 0;
-	struct mlx4_ib_iboe *iboe;
-	struct net_device *real_dev = rdma_vlan_dev_real_dev(dev) ?
-				rdma_vlan_dev_real_dev(dev) : dev;
+	struct mlx4_ib_dev *ibdev = to_mdev(device);
+	struct mlx4_ib_iboe *iboe = &ibdev->iboe;
+	struct mlx4_port_gid_table   *port_gid_table;
+	int findex = -1, found = -1;
+	int ret = 0;
+	int clear = !memcmp(&zgid, gid, sizeof(*gid));
+	int hw_update = 0;
+	int i;
+	struct mlx4_roce_addr_table *addr_table;
 
-	iboe = &ibdev->iboe;
+	if (ib_cache_use_roce_gid_cache(device, port_num))
+		return -EINVAL;
 
-	for (port = 1; port <= MLX4_MAX_PORTS; ++port)
-		if ((netif_is_bond_master(real_dev) && (real_dev == iboe->masters[port - 1])) ||
-		    (!netif_is_bond_master(real_dev) && (real_dev == iboe->netdevs[port - 1])))
-			break;
+	if (port_num > MLX4_MAX_PORTS)
+		return -EINVAL;
 
-	return port > MLX4_MAX_PORTS ? 0 : port;
-}
+	if (!context)
+		return -EINVAL;
 
-static void mlx4_ib_get_dev_addr(struct net_device *dev, struct mlx4_ib_dev *ibdev, u8 port)
-{
-        struct ifaddr *ifa;
-#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
-	struct inet6_dev *in6_dev;
-	union ib_gid  *pgid;
-	struct inet6_ifaddr *ifp;
-#endif
-	union ib_gid gid;
+	write_lock(&iboe->iboe_lock);
+	port_gid_table = &iboe->gid_table[port_num - 1];
 
+	if (clear) {
+		struct gid_cache_context *ctx = *context;
 
-	if ((port == 0) || (port > MLX4_MAX_PORTS))
-		return;
+		if (ctx) {
+			ctx->refcount--;
+			if (!ctx->refcount) {
+				unsigned int index = ctx->real_index;
 
-	/* IPv4 gids */
-        TAILQ_FOREACH(ifa, &dev->if_addrhead, ifa_link) {
-                if (ifa->ifa_addr && ifa->ifa_addr->sa_family == AF_INET){
-                        ipv6_addr_set_v4mapped(
-				((struct sockaddr_in *) ifa->ifa_addr)->sin_addr.s_addr,
-				(struct in6_addr *)&gid);
-                        update_gid_table(ibdev, port, &gid, 0, 0);
-                }
-
-        }
-#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
-	/* IPv6 gids */
-	in6_dev = in6_dev_get(dev);
-	if (in6_dev) {
-		read_lock_bh(&in6_dev->lock);
-		list_for_each_entry(ifp, &in6_dev->addr_list, if_list) {
-			pgid = (union ib_gid *)&ifp->addr;
-				update_gid_table(ibdev, port, pgid, 0, 0);
+				memcpy(&port_gid_table->gids[index].gid, &zgid, sizeof(*gid));
+				kfree(port_gid_table->gids[index].ctx);
+				port_gid_table->gids[index].ctx = NULL;
+				hw_update = 1;
 			}
-		read_unlock_bh(&in6_dev->lock);
-		in6_dev_put(in6_dev);
 		}
-#endif
+	} else {
+		for (i = 0; i < MLX4_MAX_PORT_GIDS; ++i) {
+			if (!memcmp(&port_gid_table->gids[i].gid, gid, sizeof(*gid))) {
+				found = (port_gid_table->gids[i].gid_type == attr->gid_type) ? i : -1;
+				if (found >= 0)
+					break;
+			}
+			if (findex < 0 && !memcmp(&port_gid_table->gids[i].gid, &zgid, sizeof(*gid)))
+				findex = i; /* HW has space */
+		}
+
+		if (found < 0) {
+			if (findex < 0) {
+				ret = -ENOSPC;
+			} else {
+				port_gid_table->gids[findex].ctx = kmalloc(sizeof(*port_gid_table->gids[findex].ctx), GFP_ATOMIC);
+				if (!port_gid_table->gids[findex].ctx) {
+					ret = -ENOMEM;
+				} else {
+					*context = port_gid_table->gids[findex].ctx;
+					memcpy(&port_gid_table->gids[findex].gid, gid, sizeof(*gid));
+					port_gid_table->gids[findex].gid_type = attr->gid_type;
+					port_gid_table->gids[findex].ctx->real_index = findex;
+					port_gid_table->gids[findex].ctx->refcount = 1;
+					hw_update = 1;
+				}
+			}
+		} else {
+			struct gid_cache_context *ctx = port_gid_table->gids[found].ctx;
+			*context = ctx;
+			ctx->refcount++;
+		}
+	}
+	if (!ret && hw_update) {
+		addr_table = kmalloc(sizeof(*addr_table), GFP_ATOMIC);
+		if (!addr_table) {
+			ret = -ENOMEM;
+		} else {
+			for (i = 0; i < MLX4_MAX_PORT_GIDS; i++) {
+				memcpy(addr_table->addr[i].gid,
+				       &port_gid_table->gids[i].gid,
+				       sizeof(union ib_gid));
+				addr_table->addr[i].type = ib_gid_type_to_mlx4_gid_type(
+						port_gid_table->gids[i].gid_type);
+			}
+		}
+	}
+	write_unlock(&iboe->iboe_lock);
+
+	if (!ret && hw_update) {
+		ret = mlx4_update_roce_addr_table(ibdev->dev, port_num, addr_table, MLX4_CMD_WRAPPED);
+		kfree(addr_table);
+	}
+
+	return ret;
 }
 
-static void mlx4_set_default_gid(struct mlx4_ib_dev *ibdev,
-				 struct  net_device *dev, u8 port)
+int mlx4_ib_gid_index_to_real_index(struct mlx4_ib_dev *ibdev,
+				    u8 port_num, int index)
 {
+	struct mlx4_ib_iboe *iboe = &ibdev->iboe;
+	struct gid_cache_context *ctx = NULL;
 	union ib_gid gid;
-	mlx4_make_default_gid(dev, &gid, port);
-	update_gid_table(ibdev, port, &gid, 0, 1);
-}
+	struct mlx4_port_gid_table   *port_gid_table;
+	int real_index = -EINVAL;
+	int i;
+	int ret;
+	struct ib_gid_attr attr;
 
-static int mlx4_ib_init_gid_table(struct mlx4_ib_dev *ibdev)
-{
-	struct	net_device *dev;
+	if (port_num > MLX4_MAX_PORTS)
+		return -EINVAL;
 
-	if (reset_gid_table(ibdev))
-		return -1;
+	if (ib_cache_use_roce_gid_cache(&ibdev->ib_dev, port_num))
+		return index;
 
-        IFNET_RLOCK_NOSLEEP();
-        TAILQ_FOREACH(dev, &V_ifnet, if_link) {
-		u8 port = mlx4_ib_get_dev_port(dev, ibdev);
-		if (port) {
-			if (!rdma_vlan_dev_real_dev(dev) &&
-			    !netif_is_bond_master(dev))
-				mlx4_set_default_gid(ibdev, dev, port);
-			mlx4_ib_get_dev_addr(dev, ibdev, port);
-		}
-	}
+	ret = ib_get_cached_gid(&ibdev->ib_dev, port_num, index, &gid, &attr);
+	if (ret)
+		return ret;
 
-        IFNET_RUNLOCK_NOSLEEP();
+	if (!memcmp(&gid, &zgid, sizeof(gid)))
+		return -EINVAL;
 
-	return 0;
+	read_lock(&iboe->iboe_lock);
+	port_gid_table = &iboe->gid_table[port_num - 1];
+
+	for (i = 0; i < MLX4_MAX_PORT_GIDS; ++i)
+		if (!memcmp(&port_gid_table->gids[i].gid, &gid, sizeof(gid)) &&
+		    (attr.gid_type == port_gid_table->gids[i].gid_type)) {
+			ctx = port_gid_table->gids[i].ctx;
+			break;
+		}
+	if (ctx)
+		real_index = ctx->real_index;
+	read_unlock(&iboe->iboe_lock);
+	return real_index;
 }
 
 static void mlx4_ib_scan_netdevs(struct mlx4_ib_dev *ibdev,
-				 struct net_device *dev, unsigned long event)
+				 struct net_device *dev,
+				 unsigned long event)
+
 {
 	struct mlx4_ib_iboe *iboe;
+	int update_qps_port = -1;
 	int port;
-	int init = 0;
-	unsigned long flags;
 
 	iboe = &ibdev->iboe;
 
-	spin_lock_irqsave(&iboe->lock, flags);
+	write_lock(&iboe->iboe_lock);
 	mlx4_foreach_ib_transport_port(port, ibdev->dev) {
-		struct net_device *old_netdev = iboe->netdevs[port - 1];
-/* XXX BOND related */
-#if 0
-		struct net_device *old_master = iboe->masters[port - 1];
-#endif
-		iboe->masters[port - 1] = NULL;
+
 		iboe->netdevs[port - 1] =
 			mlx4_get_protocol_dev(ibdev->dev, MLX4_PROT_ETH, port);
 
-
-		if (old_netdev != iboe->netdevs[port - 1])
-			init = 1;
 		if (dev == iboe->netdevs[port - 1] &&
-		    event == NETDEV_CHANGEADDR)
-			init = 1;
-/* XXX BOND related */
-#if 0
-                if (iboe->netdevs[port - 1] && netif_is_bond_slave(iboe->netdevs[port - 1]))
-			iboe->masters[port - 1] = iboe->netdevs[port - 1]->master;
+		    (event == NETDEV_CHANGEADDR || event == NETDEV_REGISTER ||
+		     event == NETDEV_UP || event == NETDEV_CHANGE))
+			update_qps_port = port;
 
-		/* if bonding is used it is possible that we add it to masters only after
-		   IP address is assigned to the net bonding interface */
-		if (old_master != iboe->masters[port - 1])
-			init = 1;
-#endif
 	}
 
-	spin_unlock_irqrestore(&iboe->lock, flags);
+	write_unlock(&iboe->iboe_lock);
 
-	if (init)
-		if (mlx4_ib_init_gid_table(ibdev))
-			pr_warn("Fail to reset gid table\n");
+	if (update_qps_port > 0)
+		mlx4_ib_update_qps(ibdev, dev, update_qps_port);
 }
 
-static int mlx4_ib_netdev_event(struct notifier_block *this, unsigned long event,
-				void *ptr)
+static int mlx4_ib_netdev_event(struct notifier_block *this,
+				unsigned long event, void *ptr)
 {
-	struct net_device *dev = ptr;
+	struct net_device *dev = netdev_notifier_info_to_dev(ptr);
 	struct mlx4_ib_dev *ibdev;
 
-	ibdev = container_of(this, struct mlx4_ib_dev, iboe.nb);
+	if (!net_eq(dev_net(dev), &init_net))
+		return NOTIFY_DONE;
 
+	ibdev = container_of(this, struct mlx4_ib_dev, iboe.nb);
 	mlx4_ib_scan_netdevs(ibdev, dev, event);
 
 	return NOTIFY_DONE;
 }
 
-/* This function initializes the gid table only if the event_netdev real device is an iboe
- * device, will be invoked by the inet/inet6 events */
-static int mlx4_ib_inet_event(struct notifier_block *this, unsigned long event,
-                                void *ptr)
-{
-        struct net_device *event_netdev = ptr;
-        struct mlx4_ib_dev *ibdev;
-        struct mlx4_ib_iboe *ibdev_iboe;
-        int port = 0;
-
-        ibdev = container_of(this, struct mlx4_ib_dev, iboe.nb_inet);
-
-        struct net_device *real_dev = rdma_vlan_dev_real_dev(event_netdev) ?
-                        rdma_vlan_dev_real_dev(event_netdev) :
-                        event_netdev;
-
-        ibdev_iboe = &ibdev->iboe;
-
-        port = mlx4_ib_get_dev_port(real_dev, ibdev);
-
-        /* Perform init_gid_table if the event real_dev is the net_device which represents this port,
-         * otherwise this event is not related and would be ignored.*/
-        if(port && (real_dev == ibdev_iboe->netdevs[port - 1]))
-                if (mlx4_ib_init_gid_table(ibdev))
-                        pr_warn("Fail to reset gid table\n");
-
-        return NOTIFY_DONE;
-}
-
-
 static void init_pkeys(struct mlx4_ib_dev *ibdev)
 {
 	int port;
 	int slave;
 	int i;
 
 	if (mlx4_is_master(ibdev->dev)) {
-		for (slave = 0; slave <= ibdev->dev->num_vfs; ++slave) {
+		for (slave = 0; slave <= ibdev->dev->persist->num_vfs;
+		     ++slave) {
 			for (port = 1; port <= ibdev->dev->caps.num_ports; ++port) {
 				for (i = 0;
 				     i < ibdev->dev->phys_caps.pkey_phys_table_len[port];
@@ -2352,24 +2850,29 @@
 	ibdev->ib_dev.req_notify_cq	= mlx4_ib_arm_cq;
 	ibdev->ib_dev.get_dma_mr	= mlx4_ib_get_dma_mr;
 	ibdev->ib_dev.reg_user_mr	= mlx4_ib_reg_user_mr;
+	ibdev->ib_dev.rereg_user_mr	= mlx4_ib_rereg_user_mr;
 	ibdev->ib_dev.dereg_mr		= mlx4_ib_dereg_mr;
+	ibdev->ib_dev.query_values      = mlx4_ib_query_values;
 	ibdev->ib_dev.alloc_fast_reg_mr = mlx4_ib_alloc_fast_reg_mr;
+	ibdev->ib_dev.ioctl		= mlx4_ib_ioctl;
 	ibdev->ib_dev.alloc_fast_reg_page_list = mlx4_ib_alloc_fast_reg_page_list;
 	ibdev->ib_dev.free_fast_reg_page_list  = mlx4_ib_free_fast_reg_page_list;
 	ibdev->ib_dev.attach_mcast	= mlx4_ib_mcg_attach;
 	ibdev->ib_dev.detach_mcast	= mlx4_ib_mcg_detach;
 	ibdev->ib_dev.process_mad	= mlx4_ib_process_mad;
-	ibdev->ib_dev.ioctl		= mlx4_ib_ioctl;
-	ibdev->ib_dev.query_values	= mlx4_ib_query_values;
+	ibdev->ib_dev.get_netdev	= mlx4_ib_get_netdev;
+	ibdev->ib_dev.modify_gid	= mlx4_ib_modify_gid;
+	ibdev->ib_dev.disassociate_ucontext = mlx4_ib_disassociate_ucontext;
 
 	if (!mlx4_is_slave(ibdev->dev)) {
 		ibdev->ib_dev.alloc_fmr		= mlx4_ib_fmr_alloc;
 		ibdev->ib_dev.map_phys_fmr	= mlx4_ib_map_phys_fmr;
 		ibdev->ib_dev.unmap_fmr		= mlx4_ib_unmap_fmr;
 		ibdev->ib_dev.dealloc_fmr	= mlx4_ib_fmr_dealloc;
 	}
 
-	if (dev->caps.flags & MLX4_DEV_CAP_FLAG_MEM_WINDOW) {
+	if (dev->caps.flags & MLX4_DEV_CAP_FLAG_MEM_WINDOW ||
+	    dev->caps.bmme_flags & MLX4_BMME_FLAG_TYPE_2_WIN) {
 		ibdev->ib_dev.alloc_mw = mlx4_ib_alloc_mw;
 		ibdev->ib_dev.bind_mw = mlx4_ib_bind_mw;
 		ibdev->ib_dev.dealloc_mw = mlx4_ib_dealloc_mw;

--Apple-Mail=_81524E70-C381-42F8-AEB2-30266F029757
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
	charset=utf-8




|Index: sys/ofed/drivers/infiniband/hw/mlx4/main.c
|=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
|--- sys/ofed/drivers/infiniband/hw/mlx4/main.c
|+++ sys/ofed/drivers/infiniband/hw/mlx4/main.c
--------------------------
Patching file sys/ofed/drivers/infiniband/hw/mlx4/main.c using Plan A...
Hunk #1 succeeded at 34.
Hunk #2 succeeded at 62.
Hunk #3 succeeded at 109.
Hunk #4 succeeded at 123.
Hunk #5 succeeded at 136.
Hunk #6 succeeded at 150.
Hunk #7 succeeded at 198.
Hunk #8 succeeded at 212.
Hunk #9 succeeded at 232.
Hunk #10 succeeded at 282.
Hunk #11 succeeded at 407.
Hunk #12 succeeded at 420.
Hunk #13 succeeded at 557.
Hunk #14 succeeded at 699.
Hunk #15 succeeded at 708.
Hunk #16 succeeded at 780.
Hunk #17 succeeded at 801.
Hunk #18 succeeded at 811.
Hunk #19 succeeded at 823.
Hunk #20 succeeded at 843.
Hunk #21 succeeded at 1040.
Hunk #22 succeeded at 1236.
Hunk #23 succeeded at 1262.
Hunk #24 succeeded at 1394.
Hunk #25 succeeded at 1437.
Hunk #26 succeeded at 1463.
Hunk #27 succeeded at 1478.
Hunk #28 succeeded at 1778.
Hunk #29 succeeded at 1842.
Hunk #30 succeeded at 1954.
Hunk #31 succeeded at 1965.
Hunk #32 succeeded at 2039.
Hunk #33 succeeded at 2071.
Hunk #34 succeeded at 2123.
Hunk #35 failed at 2144.
Hunk #36 succeeded at 2464 (offset 6 lines).
Hunk #37 succeeded at 2703 (offset 6 lines).
Hunk #38 succeeded at 2723 (offset 6 lines).
Hunk #39 succeeded at 2743 (offset 6 lines).
Hunk #40 succeeded at 2765 (offset 6 lines).
Hunk #41 succeeded at 2793 (offset 6 lines).
Hunk #42 failed at 2850.
Hunk #43 succeeded at 2889 (offset 1 line).
Hunk #44 succeeded at 2972 (offset 6 lines).
Hunk #45 succeeded at 3045 (offset 1 line).
Hunk #46 succeeded at 3070 (offset 6 lines).
Hunk #47 succeeded at 3112 (offset 1 line).
Hunk #48 succeeded at 3147 (offset 6 lines).
Hunk #49 succeeded at 3181 (offset 1 line).
Hunk #50 succeeded at 3224 (offset 6 lines).
Hunk #51 succeeded at 3248 (offset 1 line).
Hunk #52 succeeded at 3265 (offset 6 lines).
Hunk #53 succeeded at 3412 (offset 1 line).
Hunk #54 succeeded at 3438 (offset 6 lines).
Hunk #55 succeeded at 3477 (offset 1 line).
Hunk #56 succeeded at 3516 (offset 6 lines).
Hunk #57 succeeded at 3532 (offset 1 line).
Hunk #58 succeeded at 3553 (offset 6 lines).
2 out of 58 hunks failed--saving rejects to =
sys/ofed/drivers/infiniband/hw/mlx4/main.c.rej



-
David P. Discher
http://davidpdischer.com/
AIM: DavidDPD | Y!M: daviddpdz
Mobile: 408.368.3725



> On Apr 23, 2016, at 11:36 AM, Hans Petter Selasky <hps@selasky.org> =
wrote:
>=20
> On 04/23/16 10:26, Hans Petter Selasky wrote:
>> On 04/23/16 01:08, David P. Discher wrote:
>>> Hans and Chris -
>>>=20
>>> Any chance of getting an updated diff for the OFED 3.2 patches?  I
>>> love to see if I can reproduce Chris=E2=80=99s IPOIB performance.  I =
got a
>>> couple MT25208 InfiniHost III Ex I=E2=80=99d like to start using.
>>>=20
>>> I grabbed the D5790-9 freebsd reviews diffs, and attempted to =
applied
>>> to -head at r298494 :
>>>=20
>>>=20
>>=20
>> Yes, I'll update the patchset later today. It is broken because of =
some
>> changes I pushed upstream.
>>=20
>> --HPS
>=20
> Hi,
>=20
> You'll need to refetch D5790, D5791 and D5797. Let me know if =
something still doesn't apply cleanly.
>=20
> --HPS
>=20


--Apple-Mail=_81524E70-C381-42F8-AEB2-30266F029757--

--Apple-Mail=_11D7EE31-E231-4C64-801D-5222CD654299
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
	filename=signature.asc
Content-Type: application/pgp-signature;
	name=signature.asc
Content-Description: Message signed with OpenPGP using GPGMail

-----BEGIN PGP SIGNATURE-----
Comment: GPGTools - https://gpgtools.org

iQEcBAEBCgAGBQJXG8m3AAoJEEmwU6XuhYWOxnsH/AxEg1mbkj520ohLRgUKNmt4
43MpR9E0paJ7VS/F9/PyvXI4kDcjdfyHZt2GwAAQYmhw8XSNbMpSPWJaKiNOqess
7Bo3SSIpiegh7tdDjKTbdujr/4CwXF7QHvtmuBZw7Q3DlvchM0SwuHdDL68SMuLb
9gv8+r7ma7k1xyLPrEstCrNNwWUAuN+PUZl6rqulsj+nszxYhU68m6rA5hmiMJaO
F+FVACNBWzOS2zoGVUXcILVA6kYmR62E+2Oaf2T9sTjrs868h4DikDA7vmd7IOlu
oVXpLPO7ve+amt8z8MnUIEYOdhGqlAuyrTe4jv7RPL5F0MmfZh6u2338AU5wgSo=
=lVGe
-----END PGP SIGNATURE-----

--Apple-Mail=_11D7EE31-E231-4C64-801D-5222CD654299--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?5A0F033C-32E0-4F44-8835-2C079581EE32>