Skip to content

Commit 4c173f5

Browse files
committed
RDMA/rxe: Use ib_device_get_by_netdev() instead of open coding
The core API handles the locking correctly and is faster if there are multiple devices. Signed-off-by: Jason Gunthorpe <[email protected]>
1 parent 324e227 commit 4c173f5

File tree

4 files changed

+38
-47
lines changed

4 files changed

+38
-47
lines changed

drivers/infiniband/sw/rxe/rxe.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,19 @@ static inline void rxe_dev_put(struct rxe_dev *rxe)
105105
{
106106
kref_put(&rxe->ref_cnt, rxe_release);
107107
}
108-
struct rxe_dev *net_to_rxe(struct net_device *ndev);
109108
struct rxe_dev *get_rxe_by_name(const char *name);
110109

110+
/* The caller must do a matching ib_device_put(&dev->ib_dev) */
111+
static inline struct rxe_dev *rxe_get_dev_from_net(struct net_device *ndev)
112+
{
113+
struct ib_device *ibdev =
114+
ib_device_get_by_netdev(ndev, RDMA_DRIVER_RXE);
115+
116+
if (!ibdev)
117+
return NULL;
118+
return container_of(ibdev, struct rxe_dev, ib_dev);
119+
}
120+
111121
void rxe_port_up(struct rxe_dev *rxe);
112122
void rxe_port_down(struct rxe_dev *rxe);
113123
void rxe_set_port_state(struct rxe_dev *rxe);

drivers/infiniband/sw/rxe/rxe_net.c

Lines changed: 15 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -48,23 +48,6 @@
4848
static LIST_HEAD(rxe_dev_list);
4949
static DEFINE_SPINLOCK(dev_list_lock); /* spinlock for device list */
5050

51-
struct rxe_dev *net_to_rxe(struct net_device *ndev)
52-
{
53-
struct rxe_dev *rxe;
54-
struct rxe_dev *found = NULL;
55-
56-
spin_lock_bh(&dev_list_lock);
57-
list_for_each_entry(rxe, &rxe_dev_list, list) {
58-
if (rxe->ndev == ndev) {
59-
found = rxe;
60-
break;
61-
}
62-
}
63-
spin_unlock_bh(&dev_list_lock);
64-
65-
return found;
66-
}
67-
6851
struct rxe_dev *get_rxe_by_name(const char *name)
6952
{
7053
struct rxe_dev *rxe;
@@ -81,7 +64,6 @@ struct rxe_dev *get_rxe_by_name(const char *name)
8164
return found;
8265
}
8366

84-
8567
static struct rxe_recv_sockets recv_sockets;
8668

8769
struct device *rxe_dma_device(struct rxe_dev *rxe)
@@ -229,18 +211,19 @@ static int rxe_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
229211
struct udphdr *udph;
230212
struct net_device *ndev = skb->dev;
231213
struct net_device *rdev = ndev;
232-
struct rxe_dev *rxe = net_to_rxe(ndev);
214+
struct rxe_dev *rxe = rxe_get_dev_from_net(ndev);
233215
struct rxe_pkt_info *pkt = SKB_TO_PKT(skb);
234216

235217
if (!rxe && is_vlan_dev(rdev)) {
236218
rdev = vlan_dev_real_dev(ndev);
237-
rxe = net_to_rxe(rdev);
219+
rxe = rxe_get_dev_from_net(rdev);
238220
}
239221
if (!rxe)
240222
goto drop;
241223

242224
if (skb_linearize(skb)) {
243225
pr_err("skb_linearize failed\n");
226+
ib_device_put(&rxe->ib_dev);
244227
goto drop;
245228
}
246229

@@ -253,6 +236,12 @@ static int rxe_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
253236

254237
rxe_rcv(skb);
255238

239+
/*
240+
* FIXME: this is in the wrong place, it needs to be done when pkt is
241+
* destroyed
242+
*/
243+
ib_device_put(&rxe->ib_dev);
244+
256245
return 0;
257246
drop:
258247
kfree_skb(skb);
@@ -635,16 +624,17 @@ static int rxe_notify(struct notifier_block *not_blk,
635624
void *arg)
636625
{
637626
struct net_device *ndev = netdev_notifier_info_to_dev(arg);
638-
struct rxe_dev *rxe = net_to_rxe(ndev);
627+
struct rxe_dev *rxe = rxe_get_dev_from_net(ndev);
639628

640629
if (!rxe)
641-
goto out;
630+
return NOTIFY_OK;
642631

643632
switch (event) {
644633
case NETDEV_UNREGISTER:
645634
list_del(&rxe->list);
635+
ib_device_put(&rxe->ib_dev);
646636
rxe_remove(rxe);
647-
break;
637+
return NOTIFY_OK;
648638
case NETDEV_UP:
649639
rxe_port_up(rxe);
650640
break;
@@ -668,7 +658,8 @@ static int rxe_notify(struct notifier_block *not_blk,
668658
event, ndev->name);
669659
break;
670660
}
671-
out:
661+
662+
ib_device_put(&rxe->ib_dev);
672663
return NOTIFY_OK;
673664
}
674665

drivers/infiniband/sw/rxe/rxe_sysfs.c

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -58,24 +58,25 @@ static int rxe_param_set_add(const char *val, const struct kernel_param *kp)
5858
int len;
5959
int err = 0;
6060
char intf[32];
61-
struct net_device *ndev = NULL;
61+
struct net_device *ndev;
62+
struct rxe_dev *exists;
6263
struct rxe_dev *rxe;
6364

6465
len = sanitize_arg(val, intf, sizeof(intf));
6566
if (!len) {
6667
pr_err("add: invalid interface name\n");
67-
err = -EINVAL;
68-
goto err;
68+
return -EINVAL;
6969
}
7070

7171
ndev = dev_get_by_name(&init_net, intf);
7272
if (!ndev) {
7373
pr_err("interface %s not found\n", intf);
74-
err = -EINVAL;
75-
goto err;
74+
return -EINVAL;
7675
}
7776

78-
if (net_to_rxe(ndev)) {
77+
exists = rxe_get_dev_from_net(ndev);
78+
if (exists) {
79+
ib_device_put(&exists->ib_dev);
7980
pr_err("already configured on %s\n", intf);
8081
err = -EINVAL;
8182
goto err;
@@ -90,9 +91,9 @@ static int rxe_param_set_add(const char *val, const struct kernel_param *kp)
9091

9192
rxe_set_port_state(rxe);
9293
dev_info(&rxe->ib_dev.dev, "added %s\n", intf);
94+
9395
err:
94-
if (ndev)
95-
dev_put(ndev);
96+
dev_put(ndev);
9697
return err;
9798
}
9899

drivers/infiniband/sw/rxe/rxe_verbs.c

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -80,19 +80,6 @@ static int rxe_query_port(struct ib_device *dev,
8080
return rc;
8181
}
8282

83-
static struct net_device *rxe_get_netdev(struct ib_device *device,
84-
u8 port_num)
85-
{
86-
struct rxe_dev *rxe = to_rdev(device);
87-
88-
if (rxe->ndev) {
89-
dev_hold(rxe->ndev);
90-
return rxe->ndev;
91-
}
92-
93-
return NULL;
94-
}
95-
9683
static int rxe_query_pkey(struct ib_device *device,
9784
u8 port_num, u16 index, u16 *pkey)
9885
{
@@ -1159,7 +1146,6 @@ static const struct ib_device_ops rxe_dev_ops = {
11591146
.get_dma_mr = rxe_get_dma_mr,
11601147
.get_hw_stats = rxe_ib_get_hw_stats,
11611148
.get_link_layer = rxe_get_link_layer,
1162-
.get_netdev = rxe_get_netdev,
11631149
.get_port_immutable = rxe_port_immutable,
11641150
.map_mr_sg = rxe_map_mr_sg,
11651151
.mmap = rxe_mmap,
@@ -1240,6 +1226,9 @@ int rxe_register_device(struct rxe_dev *rxe)
12401226
;
12411227

12421228
ib_set_device_ops(dev, &rxe_dev_ops);
1229+
err = ib_device_set_netdev(&rxe->ib_dev, rxe->ndev, 1);
1230+
if (err)
1231+
return err;
12431232

12441233
tfm = crypto_alloc_shash("crc32", 0, 0);
12451234
if (IS_ERR(tfm)) {

0 commit comments

Comments
 (0)