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

Commit 1da9b6b4 authored by Roland Dreier's avatar Roland Dreier
Browse files

Merge branches 'cma', 'ipoib', 'ocrdma' and 'qib' into for-next

Loading
Loading
Loading
Loading
+3 −1
Original line number Original line Diff line number Diff line
@@ -893,7 +893,9 @@ static int ocrdma_check_qp_params(struct ib_pd *ibpd, struct ocrdma_dev *dev,
	/* verify consumer QPs are not trying to use GSI QP's CQ */
	/* verify consumer QPs are not trying to use GSI QP's CQ */
	if ((attrs->qp_type != IB_QPT_GSI) && (dev->gsi_qp_created)) {
	if ((attrs->qp_type != IB_QPT_GSI) && (dev->gsi_qp_created)) {
		if ((dev->gsi_sqcq == get_ocrdma_cq(attrs->send_cq)) ||
		if ((dev->gsi_sqcq == get_ocrdma_cq(attrs->send_cq)) ||
		    (dev->gsi_sqcq == get_ocrdma_cq(attrs->send_cq))) {
		    (dev->gsi_sqcq == get_ocrdma_cq(attrs->recv_cq)) ||
		    (dev->gsi_rqcq == get_ocrdma_cq(attrs->send_cq)) ||
		    (dev->gsi_rqcq == get_ocrdma_cq(attrs->recv_cq))) {
			ocrdma_err("%s(%d) Consumer QP cannot use GSI CQs.\n",
			ocrdma_err("%s(%d) Consumer QP cannot use GSI CQs.\n",
				   __func__, dev->id);
				   __func__, dev->id);
			return -EINVAL;
			return -EINVAL;
+5 −5
Original line number Original line Diff line number Diff line
@@ -656,6 +656,11 @@ struct qib_pportdata {
	/* 16 congestion entries with each entry corresponding to a SL */
	/* 16 congestion entries with each entry corresponding to a SL */
	struct ib_cc_congestion_entry_shadow *congestion_entries;
	struct ib_cc_congestion_entry_shadow *congestion_entries;


	/* Maximum number of congestion control entries that the agent expects
	 * the manager to send.
	 */
	u16 cc_supported_table_entries;

	/* Total number of congestion control table entries */
	/* Total number of congestion control table entries */
	u16 total_cct_entry;
	u16 total_cct_entry;


@@ -667,11 +672,6 @@ struct qib_pportdata {


	/* CA's max number of 64 entry units in the congestion control table */
	/* CA's max number of 64 entry units in the congestion control table */
	u8 cc_max_table_entries;
	u8 cc_max_table_entries;

	/* Maximum number of congestion control entries that the agent expects
	 * the manager to send.
	 */
	u8 cc_supported_table_entries;
};
};


/* Observers. Not to be taken lightly, possibly not to ship. */
/* Observers. Not to be taken lightly, possibly not to ship. */
+36 −20
Original line number Original line Diff line number Diff line
@@ -92,6 +92,8 @@ enum {
	IPOIB_STOP_REAPER	  = 7,
	IPOIB_STOP_REAPER	  = 7,
	IPOIB_FLAG_ADMIN_CM	  = 9,
	IPOIB_FLAG_ADMIN_CM	  = 9,
	IPOIB_FLAG_UMCAST	  = 10,
	IPOIB_FLAG_UMCAST	  = 10,
	IPOIB_STOP_NEIGH_GC	  = 11,
	IPOIB_NEIGH_TBL_FLUSH	  = 12,


	IPOIB_MAX_BACKOFF_SECONDS = 16,
	IPOIB_MAX_BACKOFF_SECONDS = 16,


@@ -260,6 +262,20 @@ struct ipoib_ethtool_st {
	u16     max_coalesced_frames;
	u16     max_coalesced_frames;
};
};


struct ipoib_neigh_hash {
	struct ipoib_neigh __rcu      **buckets;
	struct rcu_head			rcu;
	u32				mask;
	u32				size;
};

struct ipoib_neigh_table {
	struct ipoib_neigh_hash __rcu  *htbl;
	rwlock_t			rwlock;
	atomic_t			entries;
	struct completion		flushed;
};

/*
/*
 * Device private locking: network stack tx_lock protects members used
 * Device private locking: network stack tx_lock protects members used
 * in TX fast path, lock protects everything else.  lock nests inside
 * in TX fast path, lock protects everything else.  lock nests inside
@@ -279,6 +295,8 @@ struct ipoib_dev_priv {
	struct rb_root  path_tree;
	struct rb_root  path_tree;
	struct list_head path_list;
	struct list_head path_list;


	struct ipoib_neigh_table ntbl;

	struct ipoib_mcast *broadcast;
	struct ipoib_mcast *broadcast;
	struct list_head multicast_list;
	struct list_head multicast_list;
	struct rb_root multicast_tree;
	struct rb_root multicast_tree;
@@ -291,7 +309,7 @@ struct ipoib_dev_priv {
	struct work_struct flush_heavy;
	struct work_struct flush_heavy;
	struct work_struct restart_task;
	struct work_struct restart_task;
	struct delayed_work ah_reap_task;
	struct delayed_work ah_reap_task;

	struct delayed_work neigh_reap_task;
	struct ib_device *ca;
	struct ib_device *ca;
	u8		  port;
	u8		  port;
	u16		  pkey;
	u16		  pkey;
@@ -377,13 +395,16 @@ struct ipoib_neigh {
#ifdef CONFIG_INFINIBAND_IPOIB_CM
#ifdef CONFIG_INFINIBAND_IPOIB_CM
	struct ipoib_cm_tx *cm;
	struct ipoib_cm_tx *cm;
#endif
#endif
	union ib_gid	    dgid;
	u8     daddr[INFINIBAND_ALEN];
	struct sk_buff_head queue;
	struct sk_buff_head queue;


	struct neighbour   *neighbour;
	struct net_device *dev;
	struct net_device *dev;


	struct list_head    list;
	struct list_head    list;
	struct ipoib_neigh __rcu *hnext;
	struct rcu_head     rcu;
	atomic_t	    refcnt;
	unsigned long       alive;
};
};


#define IPOIB_UD_MTU(ib_mtu)		(ib_mtu - IPOIB_ENCAP_LEN)
#define IPOIB_UD_MTU(ib_mtu)		(ib_mtu - IPOIB_ENCAP_LEN)
@@ -394,21 +415,17 @@ static inline int ipoib_ud_need_sg(unsigned int ib_mtu)
	return IPOIB_UD_BUF_SIZE(ib_mtu) > PAGE_SIZE;
	return IPOIB_UD_BUF_SIZE(ib_mtu) > PAGE_SIZE;
}
}


/*
void ipoib_neigh_dtor(struct ipoib_neigh *neigh);
 * We stash a pointer to our private neighbour information after our
static inline void ipoib_neigh_put(struct ipoib_neigh *neigh)
 * hardware address in neigh->ha.  The ALIGN() expression here makes
 * sure that this pointer is stored aligned so that an unaligned
 * load is not needed to dereference it.
 */
static inline struct ipoib_neigh **to_ipoib_neigh(struct neighbour *neigh)
{
{
	return (void*) neigh + ALIGN(offsetof(struct neighbour, ha) +
	if (atomic_dec_and_test(&neigh->refcnt))
				     INFINIBAND_ALEN, sizeof(void *));
		ipoib_neigh_dtor(neigh);
}
}

struct ipoib_neigh *ipoib_neigh_get(struct net_device *dev, u8 *daddr);
struct ipoib_neigh *ipoib_neigh_alloc(struct neighbour *neigh,
struct ipoib_neigh *ipoib_neigh_alloc(u8 *daddr,
				      struct net_device *dev);
				      struct net_device *dev);
void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh);
void ipoib_neigh_free(struct ipoib_neigh *neigh);
void ipoib_del_neighs_by_gid(struct net_device *dev, u8 *gid);


extern struct workqueue_struct *ipoib_workqueue;
extern struct workqueue_struct *ipoib_workqueue;


@@ -425,7 +442,6 @@ static inline void ipoib_put_ah(struct ipoib_ah *ah)
{
{
	kref_put(&ah->ref, ipoib_free_ah);
	kref_put(&ah->ref, ipoib_free_ah);
}
}

int ipoib_open(struct net_device *dev);
int ipoib_open(struct net_device *dev);
int ipoib_add_pkey_attr(struct net_device *dev);
int ipoib_add_pkey_attr(struct net_device *dev);
int ipoib_add_umcast_attr(struct net_device *dev);
int ipoib_add_umcast_attr(struct net_device *dev);
@@ -455,7 +471,7 @@ void ipoib_dev_cleanup(struct net_device *dev);


void ipoib_mcast_join_task(struct work_struct *work);
void ipoib_mcast_join_task(struct work_struct *work);
void ipoib_mcast_carrier_on_task(struct work_struct *work);
void ipoib_mcast_carrier_on_task(struct work_struct *work);
void ipoib_mcast_send(struct net_device *dev, void *mgid, struct sk_buff *skb);
void ipoib_mcast_send(struct net_device *dev, u8 *daddr, struct sk_buff *skb);


void ipoib_mcast_restart_task(struct work_struct *work);
void ipoib_mcast_restart_task(struct work_struct *work);
int ipoib_mcast_start_thread(struct net_device *dev);
int ipoib_mcast_start_thread(struct net_device *dev);
@@ -517,10 +533,10 @@ static inline int ipoib_cm_admin_enabled(struct net_device *dev)
		test_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags);
		test_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags);
}
}


static inline int ipoib_cm_enabled(struct net_device *dev, struct neighbour *n)
static inline int ipoib_cm_enabled(struct net_device *dev, u8 *hwaddr)
{
{
	struct ipoib_dev_priv *priv = netdev_priv(dev);
	struct ipoib_dev_priv *priv = netdev_priv(dev);
	return IPOIB_CM_SUPPORTED(n->ha) &&
	return IPOIB_CM_SUPPORTED(hwaddr) &&
		test_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags);
		test_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags);
}
}


@@ -575,7 +591,7 @@ static inline int ipoib_cm_admin_enabled(struct net_device *dev)
{
{
	return 0;
	return 0;
}
}
static inline int ipoib_cm_enabled(struct net_device *dev, struct neighbour *n)
static inline int ipoib_cm_enabled(struct net_device *dev, u8 *hwaddr)


{
{
	return 0;
	return 0;
+5 −11
Original line number Original line Diff line number Diff line
@@ -811,9 +811,7 @@ void ipoib_cm_handle_tx_wc(struct net_device *dev, struct ib_wc *wc)
		if (neigh) {
		if (neigh) {
			neigh->cm = NULL;
			neigh->cm = NULL;
			list_del(&neigh->list);
			list_del(&neigh->list);
			if (neigh->ah)
			ipoib_neigh_free(neigh);
				ipoib_put_ah(neigh->ah);
			ipoib_neigh_free(dev, neigh);


			tx->neigh = NULL;
			tx->neigh = NULL;
		}
		}
@@ -1230,9 +1228,7 @@ static int ipoib_cm_tx_handler(struct ib_cm_id *cm_id,
		if (neigh) {
		if (neigh) {
			neigh->cm = NULL;
			neigh->cm = NULL;
			list_del(&neigh->list);
			list_del(&neigh->list);
			if (neigh->ah)
			ipoib_neigh_free(neigh);
				ipoib_put_ah(neigh->ah);
			ipoib_neigh_free(dev, neigh);


			tx->neigh = NULL;
			tx->neigh = NULL;
		}
		}
@@ -1279,7 +1275,7 @@ void ipoib_cm_destroy_tx(struct ipoib_cm_tx *tx)
		list_move(&tx->list, &priv->cm.reap_list);
		list_move(&tx->list, &priv->cm.reap_list);
		queue_work(ipoib_workqueue, &priv->cm.reap_task);
		queue_work(ipoib_workqueue, &priv->cm.reap_task);
		ipoib_dbg(priv, "Reap connection for gid %pI6\n",
		ipoib_dbg(priv, "Reap connection for gid %pI6\n",
			  tx->neigh->dgid.raw);
			  tx->neigh->daddr + 4);
		tx->neigh = NULL;
		tx->neigh = NULL;
	}
	}
}
}
@@ -1304,7 +1300,7 @@ static void ipoib_cm_tx_start(struct work_struct *work)
		p = list_entry(priv->cm.start_list.next, typeof(*p), list);
		p = list_entry(priv->cm.start_list.next, typeof(*p), list);
		list_del_init(&p->list);
		list_del_init(&p->list);
		neigh = p->neigh;
		neigh = p->neigh;
		qpn = IPOIB_QPN(neigh->neighbour->ha);
		qpn = IPOIB_QPN(neigh->daddr);
		memcpy(&pathrec, &p->path->pathrec, sizeof pathrec);
		memcpy(&pathrec, &p->path->pathrec, sizeof pathrec);


		spin_unlock_irqrestore(&priv->lock, flags);
		spin_unlock_irqrestore(&priv->lock, flags);
@@ -1320,9 +1316,7 @@ static void ipoib_cm_tx_start(struct work_struct *work)
			if (neigh) {
			if (neigh) {
				neigh->cm = NULL;
				neigh->cm = NULL;
				list_del(&neigh->list);
				list_del(&neigh->list);
				if (neigh->ah)
				ipoib_neigh_free(neigh);
					ipoib_put_ah(neigh->ah);
				ipoib_neigh_free(dev, neigh);
			}
			}
			list_del(&p->list);
			list_del(&p->list);
			kfree(p);
			kfree(p);
Loading