Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f8457d58 authored by Doug Ledford's avatar Doug Ledford
Browse files

Merge branch 'bart-srpt-for-next' into k.o/wip/dl-for-next



Merging in 12 patch series from Bart that required changes in the
current for-rc branch in order to apply cleanly.

Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parents c4b76d8d 2d67017c
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -293,7 +293,7 @@ static inline int ib_mad_enforce_security(struct ib_mad_agent_private *map,
}
}
#endif
#endif


struct ib_device *__ib_device_get_by_index(u32 ifindex);
struct ib_device *ib_device_get_by_index(u32 ifindex);
/* RDMA device netlink */
/* RDMA device netlink */
void nldev_init(void);
void nldev_init(void);
void nldev_exit(void);
void nldev_exit(void);
+17 −1
Original line number Original line Diff line number Diff line
@@ -134,7 +134,7 @@ static int ib_device_check_mandatory(struct ib_device *device)
	return 0;
	return 0;
}
}


struct ib_device *__ib_device_get_by_index(u32 index)
static struct ib_device *__ib_device_get_by_index(u32 index)
{
{
	struct ib_device *device;
	struct ib_device *device;


@@ -145,6 +145,22 @@ struct ib_device *__ib_device_get_by_index(u32 index)
	return NULL;
	return NULL;
}
}


/*
 * Caller is responsible to return refrerence count by calling put_device()
 */
struct ib_device *ib_device_get_by_index(u32 index)
{
	struct ib_device *device;

	down_read(&lists_rwsem);
	device = __ib_device_get_by_index(index);
	if (device)
		get_device(&device->dev);

	up_read(&lists_rwsem);
	return device;
}

static struct ib_device *__ib_device_get_by_name(const char *name)
static struct ib_device *__ib_device_get_by_name(const char *name)
{
{
	struct ib_device *device;
	struct ib_device *device;
+36 −18
Original line number Original line Diff line number Diff line
@@ -150,27 +150,34 @@ static int nldev_get_doit(struct sk_buff *skb, struct nlmsghdr *nlh,


	index = nla_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]);
	index = nla_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]);


	device = __ib_device_get_by_index(index);
	device = ib_device_get_by_index(index);
	if (!device)
	if (!device)
		return -EINVAL;
		return -EINVAL;


	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
	if (!msg)
	if (!msg) {
		return -ENOMEM;
		err = -ENOMEM;
		goto err;
	}


	nlh = nlmsg_put(msg, NETLINK_CB(skb).portid, nlh->nlmsg_seq,
	nlh = nlmsg_put(msg, NETLINK_CB(skb).portid, nlh->nlmsg_seq,
			RDMA_NL_GET_TYPE(RDMA_NL_NLDEV, RDMA_NLDEV_CMD_GET),
			RDMA_NL_GET_TYPE(RDMA_NL_NLDEV, RDMA_NLDEV_CMD_GET),
			0, 0);
			0, 0);


	err = fill_dev_info(msg, device);
	err = fill_dev_info(msg, device);
	if (err) {
	if (err)
		nlmsg_free(msg);
		goto err_free;
		return err;
	}


	nlmsg_end(msg, nlh);
	nlmsg_end(msg, nlh);


	put_device(&device->dev);
	return rdma_nl_unicast(msg, NETLINK_CB(skb).portid);
	return rdma_nl_unicast(msg, NETLINK_CB(skb).portid);

err_free:
	nlmsg_free(msg);
err:
	put_device(&device->dev);
	return err;
}
}


static int _nldev_get_dumpit(struct ib_device *device,
static int _nldev_get_dumpit(struct ib_device *device,
@@ -228,31 +235,40 @@ static int nldev_port_get_doit(struct sk_buff *skb, struct nlmsghdr *nlh,
		return -EINVAL;
		return -EINVAL;


	index = nla_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]);
	index = nla_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]);
	device = __ib_device_get_by_index(index);
	device = ib_device_get_by_index(index);
	if (!device)
	if (!device)
		return -EINVAL;
		return -EINVAL;


	port = nla_get_u32(tb[RDMA_NLDEV_ATTR_PORT_INDEX]);
	port = nla_get_u32(tb[RDMA_NLDEV_ATTR_PORT_INDEX]);
	if (!rdma_is_port_valid(device, port))
	if (!rdma_is_port_valid(device, port)) {
		return -EINVAL;
		err = -EINVAL;
		goto err;
	}


	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
	if (!msg)
	if (!msg) {
		return -ENOMEM;
		err = -ENOMEM;
		goto err;
	}


	nlh = nlmsg_put(msg, NETLINK_CB(skb).portid, nlh->nlmsg_seq,
	nlh = nlmsg_put(msg, NETLINK_CB(skb).portid, nlh->nlmsg_seq,
			RDMA_NL_GET_TYPE(RDMA_NL_NLDEV, RDMA_NLDEV_CMD_GET),
			RDMA_NL_GET_TYPE(RDMA_NL_NLDEV, RDMA_NLDEV_CMD_GET),
			0, 0);
			0, 0);


	err = fill_port_info(msg, device, port);
	err = fill_port_info(msg, device, port);
	if (err) {
	if (err)
		nlmsg_free(msg);
		goto err_free;
		return err;
	}


	nlmsg_end(msg, nlh);
	nlmsg_end(msg, nlh);
	put_device(&device->dev);


	return rdma_nl_unicast(msg, NETLINK_CB(skb).portid);
	return rdma_nl_unicast(msg, NETLINK_CB(skb).portid);

err_free:
	nlmsg_free(msg);
err:
	put_device(&device->dev);
	return err;
}
}


static int nldev_port_get_dumpit(struct sk_buff *skb,
static int nldev_port_get_dumpit(struct sk_buff *skb,
@@ -273,7 +289,7 @@ static int nldev_port_get_dumpit(struct sk_buff *skb,
		return -EINVAL;
		return -EINVAL;


	ifindex = nla_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]);
	ifindex = nla_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]);
	device = __ib_device_get_by_index(ifindex);
	device = ib_device_get_by_index(ifindex);
	if (!device)
	if (!device)
		return -EINVAL;
		return -EINVAL;


@@ -307,7 +323,9 @@ static int nldev_port_get_dumpit(struct sk_buff *skb,
		nlmsg_end(skb, nlh);
		nlmsg_end(skb, nlh);
	}
	}


out:	cb->args[0] = idx;
out:
	put_device(&device->dev);
	cb->args[0] = idx;
	return skb->len;
	return skb->len;
}
}


+1 −1
Original line number Original line Diff line number Diff line
@@ -642,7 +642,6 @@ struct ib_mr *mlx4_ib_alloc_mr(struct ib_pd *pd,
		goto err_free_mr;
		goto err_free_mr;


	mr->max_pages = max_num_sg;
	mr->max_pages = max_num_sg;

	err = mlx4_mr_enable(dev->dev, &mr->mmr);
	err = mlx4_mr_enable(dev->dev, &mr->mmr);
	if (err)
	if (err)
		goto err_free_pl;
		goto err_free_pl;
@@ -653,6 +652,7 @@ struct ib_mr *mlx4_ib_alloc_mr(struct ib_pd *pd,
	return &mr->ibmr;
	return &mr->ibmr;


err_free_pl:
err_free_pl:
	mr->ibmr.device = pd->device;
	mlx4_free_priv_pages(mr);
	mlx4_free_priv_pages(mr);
err_free_mr:
err_free_mr:
	(void) mlx4_mr_free(dev->dev, &mr->mmr);
	(void) mlx4_mr_free(dev->dev, &mr->mmr);
+18 −7
Original line number Original line Diff line number Diff line
@@ -926,7 +926,7 @@ static int path_rec_start(struct net_device *dev,
	return 0;
	return 0;
}
}


static void neigh_add_path(struct sk_buff *skb, u8 *daddr,
static struct ipoib_neigh *neigh_add_path(struct sk_buff *skb, u8 *daddr,
					  struct net_device *dev)
					  struct net_device *dev)
{
{
	struct ipoib_dev_priv *priv = ipoib_priv(dev);
	struct ipoib_dev_priv *priv = ipoib_priv(dev);
@@ -941,7 +941,15 @@ static void neigh_add_path(struct sk_buff *skb, u8 *daddr,
		spin_unlock_irqrestore(&priv->lock, flags);
		spin_unlock_irqrestore(&priv->lock, flags);
		++dev->stats.tx_dropped;
		++dev->stats.tx_dropped;
		dev_kfree_skb_any(skb);
		dev_kfree_skb_any(skb);
		return;
		return NULL;
	}

	/* To avoid race condition, make sure that the
	 * neigh will be added only once.
	 */
	if (unlikely(!list_empty(&neigh->list))) {
		spin_unlock_irqrestore(&priv->lock, flags);
		return neigh;
	}
	}


	path = __path_find(dev, daddr + 4);
	path = __path_find(dev, daddr + 4);
@@ -980,7 +988,7 @@ static void neigh_add_path(struct sk_buff *skb, u8 *daddr,
			path->ah->last_send = rn->send(dev, skb, path->ah->ah,
			path->ah->last_send = rn->send(dev, skb, path->ah->ah,
						       IPOIB_QPN(daddr));
						       IPOIB_QPN(daddr));
			ipoib_neigh_put(neigh);
			ipoib_neigh_put(neigh);
			return;
			return NULL;
		}
		}
	} else {
	} else {
		neigh->ah  = NULL;
		neigh->ah  = NULL;
@@ -997,7 +1005,7 @@ static void neigh_add_path(struct sk_buff *skb, u8 *daddr,


	spin_unlock_irqrestore(&priv->lock, flags);
	spin_unlock_irqrestore(&priv->lock, flags);
	ipoib_neigh_put(neigh);
	ipoib_neigh_put(neigh);
	return;
	return NULL;


err_path:
err_path:
	ipoib_neigh_free(neigh);
	ipoib_neigh_free(neigh);
@@ -1007,6 +1015,8 @@ static void neigh_add_path(struct sk_buff *skb, u8 *daddr,


	spin_unlock_irqrestore(&priv->lock, flags);
	spin_unlock_irqrestore(&priv->lock, flags);
	ipoib_neigh_put(neigh);
	ipoib_neigh_put(neigh);

	return NULL;
}
}


static void unicast_arp_send(struct sk_buff *skb, struct net_device *dev,
static void unicast_arp_send(struct sk_buff *skb, struct net_device *dev,
@@ -1127,7 +1137,8 @@ static int ipoib_start_xmit(struct sk_buff *skb, struct net_device *dev)
	case htons(ETH_P_TIPC):
	case htons(ETH_P_TIPC):
		neigh = ipoib_neigh_get(dev, phdr->hwaddr);
		neigh = ipoib_neigh_get(dev, phdr->hwaddr);
		if (unlikely(!neigh)) {
		if (unlikely(!neigh)) {
			neigh_add_path(skb, phdr->hwaddr, dev);
			neigh = neigh_add_path(skb, phdr->hwaddr, dev);
			if (likely(!neigh))
				return NETDEV_TX_OK;
				return NETDEV_TX_OK;
		}
		}
		break;
		break;
Loading