Loading drivers/infiniband/hw/ocrdma/ocrdma_verbs.c +3 −1 Original line number Diff line number Diff line Loading @@ -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 */ if ((attrs->qp_type != IB_QPT_GSI) && (dev->gsi_qp_created)) { 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", __func__, dev->id); return -EINVAL; Loading drivers/infiniband/hw/qib/qib.h +5 −5 Original line number Diff line number Diff line Loading @@ -656,6 +656,11 @@ struct qib_pportdata { /* 16 congestion entries with each entry corresponding to a SL */ 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 */ u16 total_cct_entry; Loading @@ -667,11 +672,6 @@ struct qib_pportdata { /* CA's max number of 64 entry units in the congestion control table */ 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. */ Loading drivers/infiniband/ulp/ipoib/ipoib.h +36 −20 Original line number Diff line number Diff line Loading @@ -92,6 +92,8 @@ enum { IPOIB_STOP_REAPER = 7, IPOIB_FLAG_ADMIN_CM = 9, IPOIB_FLAG_UMCAST = 10, IPOIB_STOP_NEIGH_GC = 11, IPOIB_NEIGH_TBL_FLUSH = 12, IPOIB_MAX_BACKOFF_SECONDS = 16, Loading Loading @@ -260,6 +262,20 @@ struct ipoib_ethtool_st { 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 * in TX fast path, lock protects everything else. lock nests inside Loading @@ -279,6 +295,8 @@ struct ipoib_dev_priv { struct rb_root path_tree; struct list_head path_list; struct ipoib_neigh_table ntbl; struct ipoib_mcast *broadcast; struct list_head multicast_list; struct rb_root multicast_tree; Loading @@ -291,7 +309,7 @@ struct ipoib_dev_priv { struct work_struct flush_heavy; struct work_struct restart_task; struct delayed_work ah_reap_task; struct delayed_work neigh_reap_task; struct ib_device *ca; u8 port; u16 pkey; Loading Loading @@ -377,13 +395,16 @@ struct ipoib_neigh { #ifdef CONFIG_INFINIBAND_IPOIB_CM struct ipoib_cm_tx *cm; #endif union ib_gid dgid; u8 daddr[INFINIBAND_ALEN]; struct sk_buff_head queue; struct neighbour *neighbour; struct net_device *dev; 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) Loading @@ -394,21 +415,17 @@ static inline int ipoib_ud_need_sg(unsigned int ib_mtu) return IPOIB_UD_BUF_SIZE(ib_mtu) > PAGE_SIZE; } /* * We stash a pointer to our private neighbour information after our * 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) void ipoib_neigh_dtor(struct ipoib_neigh *neigh); static inline void ipoib_neigh_put(struct ipoib_neigh *neigh) { return (void*) neigh + ALIGN(offsetof(struct neighbour, ha) + INFINIBAND_ALEN, sizeof(void *)); if (atomic_dec_and_test(&neigh->refcnt)) ipoib_neigh_dtor(neigh); } struct ipoib_neigh *ipoib_neigh_alloc(struct neighbour *neigh, struct ipoib_neigh *ipoib_neigh_get(struct net_device *dev, u8 *daddr); struct ipoib_neigh *ipoib_neigh_alloc(u8 *daddr, 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; Loading @@ -425,7 +442,6 @@ static inline void ipoib_put_ah(struct ipoib_ah *ah) { kref_put(&ah->ref, ipoib_free_ah); } int ipoib_open(struct net_device *dev); int ipoib_add_pkey_attr(struct net_device *dev); int ipoib_add_umcast_attr(struct net_device *dev); Loading Loading @@ -455,7 +471,7 @@ void ipoib_dev_cleanup(struct net_device *dev); void ipoib_mcast_join_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); int ipoib_mcast_start_thread(struct net_device *dev); Loading Loading @@ -517,10 +533,10 @@ static inline int ipoib_cm_admin_enabled(struct net_device *dev) 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); return IPOIB_CM_SUPPORTED(n->ha) && return IPOIB_CM_SUPPORTED(hwaddr) && test_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags); } Loading Loading @@ -575,7 +591,7 @@ static inline int ipoib_cm_admin_enabled(struct net_device *dev) { 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; Loading drivers/infiniband/ulp/ipoib/ipoib_cm.c +5 −11 Original line number Diff line number Diff line Loading @@ -811,9 +811,7 @@ void ipoib_cm_handle_tx_wc(struct net_device *dev, struct ib_wc *wc) if (neigh) { neigh->cm = NULL; list_del(&neigh->list); if (neigh->ah) ipoib_put_ah(neigh->ah); ipoib_neigh_free(dev, neigh); ipoib_neigh_free(neigh); tx->neigh = NULL; } Loading Loading @@ -1230,9 +1228,7 @@ static int ipoib_cm_tx_handler(struct ib_cm_id *cm_id, if (neigh) { neigh->cm = NULL; list_del(&neigh->list); if (neigh->ah) ipoib_put_ah(neigh->ah); ipoib_neigh_free(dev, neigh); ipoib_neigh_free(neigh); tx->neigh = NULL; } Loading Loading @@ -1279,7 +1275,7 @@ void ipoib_cm_destroy_tx(struct ipoib_cm_tx *tx) list_move(&tx->list, &priv->cm.reap_list); queue_work(ipoib_workqueue, &priv->cm.reap_task); ipoib_dbg(priv, "Reap connection for gid %pI6\n", tx->neigh->dgid.raw); tx->neigh->daddr + 4); tx->neigh = NULL; } } Loading @@ -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); list_del_init(&p->list); neigh = p->neigh; qpn = IPOIB_QPN(neigh->neighbour->ha); qpn = IPOIB_QPN(neigh->daddr); memcpy(&pathrec, &p->path->pathrec, sizeof pathrec); spin_unlock_irqrestore(&priv->lock, flags); Loading @@ -1320,9 +1316,7 @@ static void ipoib_cm_tx_start(struct work_struct *work) if (neigh) { neigh->cm = NULL; list_del(&neigh->list); if (neigh->ah) ipoib_put_ah(neigh->ah); ipoib_neigh_free(dev, neigh); ipoib_neigh_free(neigh); } list_del(&p->list); kfree(p); Loading drivers/infiniband/ulp/ipoib/ipoib_main.c +479 −167 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
drivers/infiniband/hw/ocrdma/ocrdma_verbs.c +3 −1 Original line number Diff line number Diff line Loading @@ -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 */ if ((attrs->qp_type != IB_QPT_GSI) && (dev->gsi_qp_created)) { 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", __func__, dev->id); return -EINVAL; Loading
drivers/infiniband/hw/qib/qib.h +5 −5 Original line number Diff line number Diff line Loading @@ -656,6 +656,11 @@ struct qib_pportdata { /* 16 congestion entries with each entry corresponding to a SL */ 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 */ u16 total_cct_entry; Loading @@ -667,11 +672,6 @@ struct qib_pportdata { /* CA's max number of 64 entry units in the congestion control table */ 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. */ Loading
drivers/infiniband/ulp/ipoib/ipoib.h +36 −20 Original line number Diff line number Diff line Loading @@ -92,6 +92,8 @@ enum { IPOIB_STOP_REAPER = 7, IPOIB_FLAG_ADMIN_CM = 9, IPOIB_FLAG_UMCAST = 10, IPOIB_STOP_NEIGH_GC = 11, IPOIB_NEIGH_TBL_FLUSH = 12, IPOIB_MAX_BACKOFF_SECONDS = 16, Loading Loading @@ -260,6 +262,20 @@ struct ipoib_ethtool_st { 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 * in TX fast path, lock protects everything else. lock nests inside Loading @@ -279,6 +295,8 @@ struct ipoib_dev_priv { struct rb_root path_tree; struct list_head path_list; struct ipoib_neigh_table ntbl; struct ipoib_mcast *broadcast; struct list_head multicast_list; struct rb_root multicast_tree; Loading @@ -291,7 +309,7 @@ struct ipoib_dev_priv { struct work_struct flush_heavy; struct work_struct restart_task; struct delayed_work ah_reap_task; struct delayed_work neigh_reap_task; struct ib_device *ca; u8 port; u16 pkey; Loading Loading @@ -377,13 +395,16 @@ struct ipoib_neigh { #ifdef CONFIG_INFINIBAND_IPOIB_CM struct ipoib_cm_tx *cm; #endif union ib_gid dgid; u8 daddr[INFINIBAND_ALEN]; struct sk_buff_head queue; struct neighbour *neighbour; struct net_device *dev; 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) Loading @@ -394,21 +415,17 @@ static inline int ipoib_ud_need_sg(unsigned int ib_mtu) return IPOIB_UD_BUF_SIZE(ib_mtu) > PAGE_SIZE; } /* * We stash a pointer to our private neighbour information after our * 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) void ipoib_neigh_dtor(struct ipoib_neigh *neigh); static inline void ipoib_neigh_put(struct ipoib_neigh *neigh) { return (void*) neigh + ALIGN(offsetof(struct neighbour, ha) + INFINIBAND_ALEN, sizeof(void *)); if (atomic_dec_and_test(&neigh->refcnt)) ipoib_neigh_dtor(neigh); } struct ipoib_neigh *ipoib_neigh_alloc(struct neighbour *neigh, struct ipoib_neigh *ipoib_neigh_get(struct net_device *dev, u8 *daddr); struct ipoib_neigh *ipoib_neigh_alloc(u8 *daddr, 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; Loading @@ -425,7 +442,6 @@ static inline void ipoib_put_ah(struct ipoib_ah *ah) { kref_put(&ah->ref, ipoib_free_ah); } int ipoib_open(struct net_device *dev); int ipoib_add_pkey_attr(struct net_device *dev); int ipoib_add_umcast_attr(struct net_device *dev); Loading Loading @@ -455,7 +471,7 @@ void ipoib_dev_cleanup(struct net_device *dev); void ipoib_mcast_join_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); int ipoib_mcast_start_thread(struct net_device *dev); Loading Loading @@ -517,10 +533,10 @@ static inline int ipoib_cm_admin_enabled(struct net_device *dev) 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); return IPOIB_CM_SUPPORTED(n->ha) && return IPOIB_CM_SUPPORTED(hwaddr) && test_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags); } Loading Loading @@ -575,7 +591,7 @@ static inline int ipoib_cm_admin_enabled(struct net_device *dev) { 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; Loading
drivers/infiniband/ulp/ipoib/ipoib_cm.c +5 −11 Original line number Diff line number Diff line Loading @@ -811,9 +811,7 @@ void ipoib_cm_handle_tx_wc(struct net_device *dev, struct ib_wc *wc) if (neigh) { neigh->cm = NULL; list_del(&neigh->list); if (neigh->ah) ipoib_put_ah(neigh->ah); ipoib_neigh_free(dev, neigh); ipoib_neigh_free(neigh); tx->neigh = NULL; } Loading Loading @@ -1230,9 +1228,7 @@ static int ipoib_cm_tx_handler(struct ib_cm_id *cm_id, if (neigh) { neigh->cm = NULL; list_del(&neigh->list); if (neigh->ah) ipoib_put_ah(neigh->ah); ipoib_neigh_free(dev, neigh); ipoib_neigh_free(neigh); tx->neigh = NULL; } Loading Loading @@ -1279,7 +1275,7 @@ void ipoib_cm_destroy_tx(struct ipoib_cm_tx *tx) list_move(&tx->list, &priv->cm.reap_list); queue_work(ipoib_workqueue, &priv->cm.reap_task); ipoib_dbg(priv, "Reap connection for gid %pI6\n", tx->neigh->dgid.raw); tx->neigh->daddr + 4); tx->neigh = NULL; } } Loading @@ -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); list_del_init(&p->list); neigh = p->neigh; qpn = IPOIB_QPN(neigh->neighbour->ha); qpn = IPOIB_QPN(neigh->daddr); memcpy(&pathrec, &p->path->pathrec, sizeof pathrec); spin_unlock_irqrestore(&priv->lock, flags); Loading @@ -1320,9 +1316,7 @@ static void ipoib_cm_tx_start(struct work_struct *work) if (neigh) { neigh->cm = NULL; list_del(&neigh->list); if (neigh->ah) ipoib_put_ah(neigh->ah); ipoib_neigh_free(dev, neigh); ipoib_neigh_free(neigh); } list_del(&p->list); kfree(p); Loading
drivers/infiniband/ulp/ipoib/ipoib_main.c +479 −167 File changed.Preview size limit exceeded, changes collapsed. Show changes