Skip to content

Commit 25edbc3

Browse files
committed
Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma
Pull rdma updates from Jason Gunthorpe: "A typical collection of patches this cycle, mostly fixing with a few new features: - Fixes from static tools. clang warnings, dead code, unused variable, coccinelle sweeps, etc - Driver bug fixes and minor improvements in rxe, bnxt_re, hfi1, mlx5, irdma, qedr - rtrs ULP bug fixes an improvments - Additional counters for bnxt_re - Support verbs CQ notifications in EFA - Continued reworking and fixing of rxe - netlink control to enable/disable optional device counters - rxe now can use AH objects for its UD path, fixing various bugs in the process - Add DMABUF support to EFA" * tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma: (103 commits) RDMA/core: Require the driver to set the IOVA correctly during rereg_mr RDMA/bnxt_re: Remove unsupported bnxt_re_modify_ah callback RDMA/irdma: optimize rx path by removing unnecessary copy RDMA/qed: Use helper function to set GUIDs RDMA/hns: Use the core code to manage the fixed mmap entries IB/opa_vnic: Rebranding of OPA VNIC driver to Cornelis Networks IB/qib: Rebranding of qib driver to Cornelis Networks IB/hfi1: Rebranding of hfi1 driver to Cornelis Networks RDMA/bnxt_re: Use helper function to set GUIDs RDMA/bnxt_re: Fix kernel panic when trying to access bnxt_re_stat_descs RDMA/qedr: Fix NULL deref for query_qp on the GSI QP RDMA/hns: Modify the value of MAX_LP_MSG_LEN to meet hardware compatibility RDMA/hns: Fix initial arm_st of CQ RDMA/rxe: Make rxe_type_info static const RDMA/rxe: Use 'bitmap_zalloc()' when applicable RDMA/rxe: Save a few bytes from struct rxe_pool RDMA/irdma: Remove the unused variable local_qp RDMA/core: Fix missed initialization of rdma_hw_stats::lock RDMA/efa: Add support for dmabuf memory regions RDMA/umem: Allow pinned dmabuf umem usage ...
2 parents ff0700f + f1a090f commit 25edbc3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

127 files changed

+3603
-1894
lines changed

drivers/infiniband/core/cma.c

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -453,7 +453,7 @@ static void _cma_attach_to_dev(struct rdma_id_private *id_priv,
453453
id_priv->id.device = cma_dev->device;
454454
id_priv->id.route.addr.dev_addr.transport =
455455
rdma_node_get_transport(cma_dev->device->node_type);
456-
list_add_tail(&id_priv->list, &cma_dev->id_list);
456+
list_add_tail(&id_priv->device_item, &cma_dev->id_list);
457457

458458
trace_cm_id_attach(id_priv, cma_dev->device);
459459
}
@@ -470,7 +470,7 @@ static void cma_attach_to_dev(struct rdma_id_private *id_priv,
470470
static void cma_release_dev(struct rdma_id_private *id_priv)
471471
{
472472
mutex_lock(&lock);
473-
list_del(&id_priv->list);
473+
list_del_init(&id_priv->device_item);
474474
cma_dev_put(id_priv->cma_dev);
475475
id_priv->cma_dev = NULL;
476476
id_priv->id.device = NULL;
@@ -854,6 +854,7 @@ __rdma_create_id(struct net *net, rdma_cm_event_handler event_handler,
854854
init_completion(&id_priv->comp);
855855
refcount_set(&id_priv->refcount, 1);
856856
mutex_init(&id_priv->handler_mutex);
857+
INIT_LIST_HEAD(&id_priv->device_item);
857858
INIT_LIST_HEAD(&id_priv->listen_list);
858859
INIT_LIST_HEAD(&id_priv->mc_list);
859860
get_random_bytes(&id_priv->seq_num, sizeof id_priv->seq_num);
@@ -1647,7 +1648,7 @@ static struct rdma_id_private *cma_find_listener(
16471648
return id_priv;
16481649
list_for_each_entry(id_priv_dev,
16491650
&id_priv->listen_list,
1650-
listen_list) {
1651+
listen_item) {
16511652
if (id_priv_dev->id.device == cm_id->device &&
16521653
cma_match_net_dev(&id_priv_dev->id,
16531654
net_dev, req))
@@ -1756,14 +1757,15 @@ static void _cma_cancel_listens(struct rdma_id_private *id_priv)
17561757
* Remove from listen_any_list to prevent added devices from spawning
17571758
* additional listen requests.
17581759
*/
1759-
list_del(&id_priv->list);
1760+
list_del_init(&id_priv->listen_any_item);
17601761

17611762
while (!list_empty(&id_priv->listen_list)) {
1762-
dev_id_priv = list_entry(id_priv->listen_list.next,
1763-
struct rdma_id_private, listen_list);
1763+
dev_id_priv =
1764+
list_first_entry(&id_priv->listen_list,
1765+
struct rdma_id_private, listen_item);
17641766
/* sync with device removal to avoid duplicate destruction */
1765-
list_del_init(&dev_id_priv->list);
1766-
list_del(&dev_id_priv->listen_list);
1767+
list_del_init(&dev_id_priv->device_item);
1768+
list_del_init(&dev_id_priv->listen_item);
17671769
mutex_unlock(&lock);
17681770

17691771
rdma_destroy_id(&dev_id_priv->id);
@@ -2564,7 +2566,7 @@ static int cma_listen_on_dev(struct rdma_id_private *id_priv,
25642566
ret = rdma_listen(&dev_id_priv->id, id_priv->backlog);
25652567
if (ret)
25662568
goto err_listen;
2567-
list_add_tail(&dev_id_priv->listen_list, &id_priv->listen_list);
2569+
list_add_tail(&dev_id_priv->listen_item, &id_priv->listen_list);
25682570
return 0;
25692571
err_listen:
25702572
/* Caller must destroy this after releasing lock */
@@ -2580,13 +2582,13 @@ static int cma_listen_on_all(struct rdma_id_private *id_priv)
25802582
int ret;
25812583

25822584
mutex_lock(&lock);
2583-
list_add_tail(&id_priv->list, &listen_any_list);
2585+
list_add_tail(&id_priv->listen_any_item, &listen_any_list);
25842586
list_for_each_entry(cma_dev, &dev_list, list) {
25852587
ret = cma_listen_on_dev(id_priv, cma_dev, &to_destroy);
25862588
if (ret) {
25872589
/* Prevent racing with cma_process_remove() */
25882590
if (to_destroy)
2589-
list_del_init(&to_destroy->list);
2591+
list_del_init(&to_destroy->device_item);
25902592
goto err_listen;
25912593
}
25922594
}
@@ -4895,7 +4897,7 @@ static int cma_netdev_callback(struct notifier_block *self, unsigned long event,
48954897

48964898
mutex_lock(&lock);
48974899
list_for_each_entry(cma_dev, &dev_list, list)
4898-
list_for_each_entry(id_priv, &cma_dev->id_list, list) {
4900+
list_for_each_entry(id_priv, &cma_dev->id_list, device_item) {
48994901
ret = cma_netdev_change(ndev, id_priv);
49004902
if (ret)
49014903
goto out;
@@ -4955,10 +4957,10 @@ static void cma_process_remove(struct cma_device *cma_dev)
49554957
mutex_lock(&lock);
49564958
while (!list_empty(&cma_dev->id_list)) {
49574959
struct rdma_id_private *id_priv = list_first_entry(
4958-
&cma_dev->id_list, struct rdma_id_private, list);
4960+
&cma_dev->id_list, struct rdma_id_private, device_item);
49594961

4960-
list_del(&id_priv->listen_list);
4961-
list_del_init(&id_priv->list);
4962+
list_del_init(&id_priv->listen_item);
4963+
list_del_init(&id_priv->device_item);
49624964
cma_id_get(id_priv);
49634965
mutex_unlock(&lock);
49644966

@@ -5035,7 +5037,7 @@ static int cma_add_one(struct ib_device *device)
50355037

50365038
mutex_lock(&lock);
50375039
list_add_tail(&cma_dev->list, &dev_list);
5038-
list_for_each_entry(id_priv, &listen_any_list, list) {
5040+
list_for_each_entry(id_priv, &listen_any_list, listen_any_item) {
50395041
ret = cma_listen_on_dev(id_priv, cma_dev, &to_destroy);
50405042
if (ret)
50415043
goto free_listen;

drivers/infiniband/core/cma_priv.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,15 @@ struct rdma_id_private {
5555

5656
struct rdma_bind_list *bind_list;
5757
struct hlist_node node;
58-
struct list_head list; /* listen_any_list or cma_device.list */
59-
struct list_head listen_list; /* per device listens */
58+
union {
59+
struct list_head device_item; /* On cma_device->id_list */
60+
struct list_head listen_any_item; /* On listen_any_list */
61+
};
62+
union {
63+
/* On rdma_id_private->listen_list */
64+
struct list_head listen_item;
65+
struct list_head listen_list;
66+
};
6067
struct cma_device *cma_dev;
6168
struct list_head mc_list;
6269

drivers/infiniband/core/counters.c

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,38 @@ static int __rdma_counter_bind_qp(struct rdma_counter *counter,
106106
return ret;
107107
}
108108

109+
int rdma_counter_modify(struct ib_device *dev, u32 port,
110+
unsigned int index, bool enable)
111+
{
112+
struct rdma_hw_stats *stats;
113+
int ret = 0;
114+
115+
if (!dev->ops.modify_hw_stat)
116+
return -EOPNOTSUPP;
117+
118+
stats = ib_get_hw_stats_port(dev, port);
119+
if (!stats || index >= stats->num_counters ||
120+
!(stats->descs[index].flags & IB_STAT_FLAG_OPTIONAL))
121+
return -EINVAL;
122+
123+
mutex_lock(&stats->lock);
124+
125+
if (enable != test_bit(index, stats->is_disabled))
126+
goto out;
127+
128+
ret = dev->ops.modify_hw_stat(dev, port, index, enable);
129+
if (ret)
130+
goto out;
131+
132+
if (enable)
133+
clear_bit(index, stats->is_disabled);
134+
else
135+
set_bit(index, stats->is_disabled);
136+
out:
137+
mutex_unlock(&stats->lock);
138+
return ret;
139+
}
140+
109141
static struct rdma_counter *alloc_and_bind(struct ib_device *dev, u32 port,
110142
struct ib_qp *qp,
111143
enum rdma_nl_counter_mode mode)
@@ -165,7 +197,7 @@ static struct rdma_counter *alloc_and_bind(struct ib_device *dev, u32 port,
165197
return counter;
166198

167199
err_mode:
168-
kfree(counter->stats);
200+
rdma_free_hw_stats_struct(counter->stats);
169201
err_stats:
170202
rdma_restrack_put(&counter->res);
171203
kfree(counter);
@@ -186,7 +218,7 @@ static void rdma_counter_free(struct rdma_counter *counter)
186218
mutex_unlock(&port_counter->lock);
187219

188220
rdma_restrack_del(&counter->res);
189-
kfree(counter->stats);
221+
rdma_free_hw_stats_struct(counter->stats);
190222
kfree(counter);
191223
}
192224

@@ -618,7 +650,7 @@ void rdma_counter_init(struct ib_device *dev)
618650
fail:
619651
for (i = port; i >= rdma_start_port(dev); i--) {
620652
port_counter = &dev->port_data[port].port_counter;
621-
kfree(port_counter->hstats);
653+
rdma_free_hw_stats_struct(port_counter->hstats);
622654
port_counter->hstats = NULL;
623655
mutex_destroy(&port_counter->lock);
624656
}
@@ -631,7 +663,7 @@ void rdma_counter_release(struct ib_device *dev)
631663

632664
rdma_for_each_port(dev, port) {
633665
port_counter = &dev->port_data[port].port_counter;
634-
kfree(port_counter->hstats);
666+
rdma_free_hw_stats_struct(port_counter->hstats);
635667
mutex_destroy(&port_counter->lock);
636668
}
637669
}

drivers/infiniband/core/device.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2676,6 +2676,7 @@ void ib_set_device_ops(struct ib_device *dev, const struct ib_device_ops *ops)
26762676
SET_DEVICE_OP(dev_ops, modify_cq);
26772677
SET_DEVICE_OP(dev_ops, modify_device);
26782678
SET_DEVICE_OP(dev_ops, modify_flow_action_esp);
2679+
SET_DEVICE_OP(dev_ops, modify_hw_stat);
26792680
SET_DEVICE_OP(dev_ops, modify_port);
26802681
SET_DEVICE_OP(dev_ops, modify_qp);
26812682
SET_DEVICE_OP(dev_ops, modify_srq);

drivers/infiniband/core/iwpm_util.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -762,7 +762,7 @@ int iwpm_send_hello(u8 nl_client, int iwpm_pid, u16 abi_version)
762762
{
763763
struct sk_buff *skb = NULL;
764764
struct nlmsghdr *nlh;
765-
const char *err_str = "";
765+
const char *err_str;
766766
int ret = -EINVAL;
767767

768768
skb = iwpm_create_nlmsg(RDMA_NL_IWPM_HELLO, &nlh, nl_client);

0 commit comments

Comments
 (0)