Skip to content

Commit d237411

Browse files
gerd-rauschjfvogel
authored andcommitted
net/rds: Switch to the Linux-5.15 API
All of the RDS commits starting with "uek-rpm: Disable CONFIG_RDS for UEK7" all the way to the commit preceeding this one are based on the Linux-5.4 API. As such they won't even compile on Linux-5.15. With this commit we adjust the RDS code-base to compile and work on Linux-5.15. Changes: * FMR support has been removed through a number of upstream-commits, e.g.: >3a578152a920 ("RDMA/core: Remove FMR device ops") So we follow the upstream-lead and get rid of FMR from UEK/RDS as well. Please note that after this change, there's some dead leftover code that needs to be cleaned up, e.g. "fmr_max_remaps". * Change function prototypes and calls to "copy_from_user" to "copy_from_sockptr" to adhere to the changes introduced by: >a7b75c5a8c41 ("net: pass a sockptr_t into ->setsockopt") * Replaced "get_seconds" by "ktime_get_real_seconds", since "get_seconds" was removed by: >aba428a0c612 ("timekeeping: Remove unused get_seconds()") * Function "ib_check_mr_access" now needs to know the IB device: >adac4cb3c1ff ("RDMA/uverbs: Check ODP in ib_check_mr_access() as well") * The "add" callback of "struct rds_ib_client" now returns an error: >11a0ae4c4bff9 ("RDMA: Allow ib_client's to fail when add() is called") Function "rds_ib_add_one" changed accordingly. * Function "ibdev_to_node" now has become a part of the RDMA API: >8ecfca68dc4c ("RDMA: Lift ibdev_to_node from rds to common code") * Function "ib_dma_alloc_coherent" disappeared: >2af29468e3b3 ("RDMA/core: Remove ib_dma_{alloc,free}_coherent") Replaced by "kzalloc_node" + "ib_dma_map_single" * Function "rdma_reject" now requires a reason: >8094ba0ace7f ("RDMA/cma: Provide ECE reject reason") * Without FMR support, there is no "struct ib_fmr_attr". All we care about for now (until cleanup) is "max_pages". * Function "ib_destroy_srq" no longer has a return value: >119181d1d432 ("RDMA: Restore ability to fail on SRQ destroy") * For RDMA, "pin_user_pages" is the new method to lock pages: >dbfe7d74376e ("rds: convert get_user_pages() --> pin_user_pages()") * Replace "__kernel_time_t" with "__s64" because "__kernel_time_t" has now become "__kernel_old_time_t", as of >2a785996cc5e2 ("y2038: uapi: change __kernel_time_t to __kernel_old_time_t" and "__kernel_old_time_t" is not available in user-land. Luckily, incompatibility with user-land (uapi) is not permitted and we know that "time64_t" has been defined as "__s64" since: >361a3bf005824 ("time64: Add time64.h header and define struct timespec64") * Use new(er) sock/TCP helpers: >ce3d9544ceca ("net: add sock_set_keepalive") >c433594c0745 ("net: add sock_no_linger") >12abc5ee7873 ("tcp: add tcp_sock_set_nodelay") >480aeb9639d6 ("tcp: add tcp_sock_set_keepcnt") >71c48eb81c9e ("tcp: add tcp_sock_set_keepidle") >d41ecaac903c ("tcp: add tcp_sock_set_keepintvl") >db10538a4b99 ("tcp: add tcp_sock_set_cork") * Support for "---help---" in Kconfig has been removed with: >f70f74d15ca8 kconfig: remove '---help---' support So we use "help" instead. Orabug: 33590097 Signed-off-by: Gerd Rausch <[email protected]> Reviewed-by: William Kucharski <[email protected]>
1 parent ca773a7 commit d237411

File tree

18 files changed

+145
-320
lines changed

18 files changed

+145
-320
lines changed

include/uapi/linux/rds.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -324,9 +324,9 @@ struct rds6_info_rdma_connection {
324324
};
325325

326326
struct rds_path_info {
327-
__kernel_time_t attempt_time;
328-
__kernel_time_t connect_time;
329-
__kernel_time_t reset_time;
327+
__s64 attempt_time;
328+
__s64 connect_time;
329+
__s64 reset_time;
330330
__u32 disconnect_reason;
331331
__u32 connect_attempts;
332332
unsigned int index;

net/rds/Kconfig

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
config RDS
22
tristate "The RDS Protocol"
33
depends on INET
4-
---help---
4+
help
55
The RDS (Reliable Datagram Sockets) protocol provides reliable,
66
sequenced delivery of datagrams over Infiniband or TCP.
77

88
config RDS_RDMA
99
tristate "RDS over Infiniband and iWARP"
1010
depends on RDS && INFINIBAND && INFINIBAND_ADDR_TRANS
11-
---help---
11+
help
1212
Allow RDS to use Infiniband as a transport.
1313
This transport supports RDMA operations.
1414

1515
config RDS_TCP
1616
tristate "RDS over TCP"
1717
depends on RDS
18-
---help---
18+
help
1919
Allow RDS to use TCP as a transport.
2020
This transport does not support RDMA operations.
2121

net/rds/af_rds.c

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,7 @@ static int rds_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
435435
return 0;
436436
}
437437

438-
static int rds_cancel_sent_to(struct rds_sock *rs, char __user *optval,
438+
static int rds_cancel_sent_to(struct rds_sock *rs, sockptr_t optval,
439439
int len)
440440
{
441441
struct sockaddr_in6 sin6;
@@ -456,7 +456,7 @@ static int rds_cancel_sent_to(struct rds_sock *rs, char __user *optval,
456456

457457
/* Lets restrict copying to at most sizeof(sin6) */
458458
cpy_len = min_t(int, (int)sizeof(sin6), len);
459-
if (copy_from_user(&sin6, optval, cpy_len)) {
459+
if (copy_from_sockptr(&sin6, optval, cpy_len)) {
460460
ret = -EFAULT;
461461
goto out;
462462
}
@@ -490,20 +490,20 @@ static int rds_cancel_sent_to(struct rds_sock *rs, char __user *optval,
490490
return ret;
491491
}
492492

493-
static int rds_set_bool_option(unsigned char *optvar, char __user *optval,
493+
static int rds_set_bool_option(unsigned char *optvar, sockptr_t optval,
494494
int optlen)
495495
{
496496
int value;
497497

498498
if (optlen < sizeof(int))
499499
return -EINVAL;
500-
if (get_user(value, (int __user *) optval))
500+
if (copy_from_sockptr(&value, optval, sizeof(int)))
501501
return -EFAULT;
502502
*optvar = !!value;
503503
return 0;
504504
}
505505

506-
static int rds_cong_monitor(struct rds_sock *rs, char __user *optval,
506+
static int rds_cong_monitor(struct rds_sock *rs, sockptr_t optval,
507507
int optlen)
508508
{
509509
int ret;
@@ -539,7 +539,7 @@ static void rds_user_conn_paths_drop(struct rds_connection *conn)
539539
}
540540
}
541541

542-
static int rds_user_reset(struct rds_sock *rs, char __user *optval, int optlen)
542+
static int rds_user_reset(struct rds_sock *rs, sockptr_t optval, int optlen)
543543
{
544544
struct rds_reset reset;
545545
struct rds_connection *conn;
@@ -549,7 +549,7 @@ static int rds_user_reset(struct rds_sock *rs, char __user *optval, int optlen)
549549
if (optlen != sizeof(struct rds_reset))
550550
return -EINVAL;
551551

552-
if (copy_from_user(&reset, (struct rds_reset __user *)optval,
552+
if (copy_from_sockptr(&reset, optval,
553553
sizeof(struct rds_reset)))
554554
return -EFAULT;
555555

@@ -589,7 +589,7 @@ static int rds_user_reset(struct rds_sock *rs, char __user *optval, int optlen)
589589
}
590590

591591
#if IS_ENABLED(CONFIG_IPV6)
592-
static int rds6_user_reset(struct rds_sock *rs, char __user *optval, int optlen)
592+
static int rds6_user_reset(struct rds_sock *rs, sockptr_t optval, int optlen)
593593
{
594594
struct rds6_reset reset;
595595
struct rds_connection *conn;
@@ -598,8 +598,8 @@ static int rds6_user_reset(struct rds_sock *rs, char __user *optval, int optlen)
598598
if (optlen != sizeof(struct rds6_reset))
599599
return -EINVAL;
600600

601-
if (copy_from_user(&reset, (struct rds6_reset __user *)optval,
602-
sizeof(struct rds6_reset)))
601+
if (copy_from_sockptr(&reset, optval,
602+
sizeof(struct rds6_reset)))
603603
return -EFAULT;
604604

605605
/* Reset all conns associated with source addr */
@@ -635,7 +635,7 @@ static int rds6_user_reset(struct rds_sock *rs, char __user *optval, int optlen)
635635
}
636636
#endif
637637

638-
static int rds_set_transport(struct rds_sock *rs, char __user *optval,
638+
static int rds_set_transport(struct rds_sock *rs, sockptr_t optval,
639639
int optlen)
640640
{
641641
int t_type;
@@ -646,7 +646,7 @@ static int rds_set_transport(struct rds_sock *rs, char __user *optval,
646646
if (optlen != sizeof(int))
647647
return -EINVAL;
648648

649-
if (copy_from_user(&t_type, (int __user *)optval, sizeof(t_type)))
649+
if (copy_from_sockptr(&t_type, optval, sizeof(t_type)))
650650
return -EFAULT;
651651

652652
if (t_type < 0 || t_type >= RDS_TRANS_COUNT)
@@ -657,15 +657,15 @@ static int rds_set_transport(struct rds_sock *rs, char __user *optval,
657657
return rs->rs_transport ? 0 : -ENOPROTOOPT;
658658
}
659659

660-
static int rds_enable_recvtstamp(struct sock *sk, char __user *optval,
660+
static int rds_enable_recvtstamp(struct sock *sk, sockptr_t optval,
661661
int optlen)
662662
{
663663
int val, valbool;
664664

665665
if (optlen != sizeof(int))
666666
return -EFAULT;
667667

668-
if (get_user(val, (int __user *)optval))
668+
if (copy_from_sockptr(&val, optval, sizeof(int)))
669669
return -EFAULT;
670670

671671
valbool = val ? 1 : 0;
@@ -678,16 +678,16 @@ static int rds_enable_recvtstamp(struct sock *sk, char __user *optval,
678678
return 0;
679679
}
680680

681-
static int rds_recv_track_latency(struct rds_sock *rs, char __user *optval,
682-
int optlen)
681+
static int rds_recv_track_latency(struct rds_sock *rs, sockptr_t optval,
682+
int optlen)
683683
{
684684
struct rds_rx_trace_so trace;
685685
int i;
686686

687687
if (optlen != sizeof(struct rds_rx_trace_so))
688688
return -EFAULT;
689689

690-
if (copy_from_user(&trace, optval, sizeof(trace)))
690+
if (copy_from_sockptr(&trace, optval, sizeof(trace)))
691691
return -EFAULT;
692692

693693
if (trace.rx_traces > RDS_MSG_RX_DGRAM_TRACE_MAX)
@@ -707,7 +707,7 @@ static int rds_recv_track_latency(struct rds_sock *rs, char __user *optval,
707707

708708

709709
static int rds_setsockopt(struct socket *sock, int level, int optname,
710-
char __user *optval, unsigned int optlen)
710+
sockptr_t optval, unsigned int optlen)
711711
{
712712
struct rds_sock *rs = rds_sk_to_rs(sock->sk);
713713
struct net *net = sock_net(sock->sk);

net/rds/connection.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ static void __rds_conn_path_init(struct rds_connection *conn,
191191

192192
cp->cp_conn = conn;
193193
rds_conn_path_state_change(cp, RDS_CONN_DOWN, DR_DEFAULT, 0);
194-
cp->cp_reconnect_start = get_seconds();
194+
cp->cp_reconnect_start = ktime_get_real_seconds();
195195
cp->cp_reconnect_warn = 1;
196196
cp->cp_conn->c_proposed_version = RDS_PROTOCOL_VERSION;
197197

@@ -1237,7 +1237,7 @@ EXPORT_SYMBOL_GPL(rds_conn_path_trace_state_change);
12371237
void rds_conn_path_drop(struct rds_conn_path *cp, int reason, int err)
12381238
{
12391239
struct rds_connection *conn = cp->cp_conn;
1240-
unsigned long now = get_seconds();
1240+
unsigned long now = ktime_get_real_seconds();
12411241

12421242
if (conn->c_trans->conn_path_reset) {
12431243
unsigned flags = RDS_CONN_PATH_RESET_WATCHDOG;

net/rds/ib.c

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ static struct ib_mr *rds_ib_get_dma_mr(struct ib_pd *pd, int mr_access_flags)
8484
struct ib_mr *mr;
8585
int err;
8686

87-
err = ib_check_mr_access(mr_access_flags);
87+
err = ib_check_mr_access(pd->device, mr_access_flags);
8888
if (err)
8989
return ERR_PTR(err);
9090

@@ -948,6 +948,7 @@ static int rds6_ib_conn_info_visitor(struct rds_connection *conn,
948948

949949
rdma_read_gids(ic->i_cm_id, (union ib_gid *)&iinfo6->src_gid,
950950
(union ib_gid *)&iinfo6->dst_gid);
951+
951952
rds_ibdev = ic->rds_ibdev;
952953
iinfo6->max_send_wr = ic->i_send_ring.w_nr;
953954
iinfo6->max_recv_wr = ic->i_recv_ring.w_nr;
@@ -1131,8 +1132,9 @@ static void rds_dev_removal_worker(struct work_struct *work)
11311132
rds_ib_remove_one(rds_ibdev->dev, rds_ibdev);
11321133
}
11331134

1134-
void rds_ib_add_one(struct ib_device *device)
1135+
int rds_ib_add_one(struct ib_device *device)
11351136
{
1137+
int error = 0;
11361138
struct rds_ib_device *rds_ibdev;
11371139
struct ib_device_attr *dev_attr;
11381140
bool has_frwr, has_fmr;
@@ -1141,26 +1143,29 @@ void rds_ib_add_one(struct ib_device *device)
11411143

11421144
/* Only handle IB (no iWARP) devices */
11431145
if (device->node_type != RDMA_NODE_IB_CA)
1144-
return;
1146+
return -EOPNOTSUPP;
11451147

11461148
trace_rds_ib_add_device(device, NULL, NULL, NULL,
11471149
"adding IB device", 0);
11481150

11491151
dev_attr = kmalloc(sizeof(*dev_attr), GFP_KERNEL);
11501152
if (!dev_attr) {
1153+
error = -ENOMEM;
11511154
reason = "could not allocate dev_attr";
11521155
goto trace_err;
11531156
}
11541157

11551158
memset(&uhw, 0, sizeof(uhw));
11561159
if ((*device->ops.query_device)(device, dev_attr, &uhw)) {
1160+
error = -ENOSYS;
11571161
reason = "query device failed";
11581162
goto free_attr;
11591163
}
11601164

11611165
rds_ibdev = kzalloc_node(sizeof(*rds_ibdev), GFP_KERNEL,
11621166
ibdev_to_node(device));
11631167
if (!rds_ibdev) {
1168+
error = -ENOMEM;
11641169
reason = "could not allocate rds_ibdev";
11651170
goto free_attr;
11661171
}
@@ -1186,7 +1191,7 @@ void rds_ib_add_one(struct ib_device *device)
11861191
rds_ibdev->max_sge = RDS_IB_MAX_SGE;
11871192

11881193
WARN_ON(rds_ibdev->max_sge < 2);
1189-
rds_ibdev->fmr_max_remaps = dev_attr->max_map_per_fmr ?: 32;
1194+
rds_ibdev->fmr_max_remaps = 32;
11901195

11911196
rds_ibdev->max_1m_fmrs = dev_attr->max_mr ?
11921197
min_t(unsigned int, dev_attr->max_mr,
@@ -1206,6 +1211,7 @@ void rds_ib_add_one(struct ib_device *device)
12061211
rds_ibdev->dev = device;
12071212
rds_ibdev->pd = ib_alloc_pd(device, 0);
12081213
if (IS_ERR(rds_ibdev->pd)) {
1214+
error = PTR_ERR(rds_ibdev->pd);
12091215
rds_ibdev->pd = NULL;
12101216
reason = "ib_alloc_pd failed";
12111217
goto put_dev;
@@ -1214,6 +1220,7 @@ void rds_ib_add_one(struct ib_device *device)
12141220
rds_ibdev->rid_dev_wq = alloc_workqueue("rds_%s_wq", WQ_UNBOUND, 0,
12151221
device->name);
12161222
if (!rds_ibdev->rid_dev_wq) {
1223+
error = -ENOMEM;
12171224
reason = "no wq";
12181225
goto put_dev;
12191226
}
@@ -1222,29 +1229,29 @@ void rds_ib_add_one(struct ib_device *device)
12221229
device->num_comp_vectors, GFP_KERNEL);
12231230
if (!rds_ibdev->vector_load) {
12241231
pr_err("RDS/IB: failed to allocate vector memory\n");
1232+
error = -ENOMEM;
12251233
reason = "failed to allocate vector memory";
12261234
goto put_dev;
12271235
}
12281236
mutex_init(&rds_ibdev->vector_load_lock);
12291237

12301238
rds_ibdev->mr = rds_ib_get_dma_mr(rds_ibdev->pd, IB_ACCESS_LOCAL_WRITE);
12311239
if (IS_ERR(rds_ibdev->mr)) {
1240+
error = PTR_ERR(rds_ibdev->mr);
12321241
rds_ibdev->mr = NULL;
12331242
reason = "rds_ib_get_dma_mr failed";
12341243
goto put_dev;
12351244
}
12361245

12371246
has_frwr = (dev_attr->device_cap_flags & IB_DEVICE_MEM_MGT_EXTENSIONS);
1238-
has_fmr = device->ops.alloc_fmr &&
1239-
device->ops.dealloc_fmr &&
1240-
device->ops.map_phys_fmr &&
1241-
device->ops.unmap_fmr;
1247+
has_fmr = false;
12421248

12431249
if (has_frwr && (!has_fmr || prefer_frwr)) {
12441250
INIT_WORK(&rds_ibdev->fastreg_reset_w, rds_ib_reset_fastreg);
12451251
init_rwsem(&rds_ibdev->fastreg_lock);
12461252
atomic_set(&rds_ibdev->fastreg_wrs, RDS_IB_DEFAULT_FREG_WR);
1247-
if (rds_ib_setup_fastreg(rds_ibdev)) {
1253+
error = rds_ib_setup_fastreg(rds_ibdev);
1254+
if (error) {
12481255
pr_err("RDS/IB: Failed to setup fastreg resources\n");
12491256
reason = "rds_ib_setup_fastreg failed";
12501257
goto put_dev;
@@ -1261,6 +1268,7 @@ void rds_ib_add_one(struct ib_device *device)
12611268
rds_ibdev->mr_1m_pool =
12621269
rds_ib_create_mr_pool(rds_ibdev, RDS_IB_MR_1M_POOL);
12631270
if (IS_ERR(rds_ibdev->mr_1m_pool)) {
1271+
error = PTR_ERR(rds_ibdev->mr_1m_pool);
12641272
rds_ibdev->mr_1m_pool = NULL;
12651273
reason = "rds_ib_create_mr_pool (1k) failed";
12661274
goto put_dev;
@@ -1269,17 +1277,20 @@ void rds_ib_add_one(struct ib_device *device)
12691277
rds_ibdev->mr_8k_pool =
12701278
rds_ib_create_mr_pool(rds_ibdev, RDS_IB_MR_8K_POOL);
12711279
if (IS_ERR(rds_ibdev->mr_8k_pool)) {
1280+
error = PTR_ERR(rds_ibdev->mr_8k_pool);
12721281
rds_ibdev->mr_8k_pool = NULL;
12731282
reason = "reds_ib_create_mr_pool (8k) failed";
12741283
goto put_dev;
12751284
}
12761285

12771286
if (rds_ib_srq_init(rds_ibdev)) {
1287+
error = -EIO;
12781288
reason = "rds_ib_srq_init failed";
12791289
goto put_dev;
12801290
}
12811291

1282-
if (rds_ib_alloc_caches(rds_ibdev)) {
1292+
error = rds_ib_alloc_caches(rds_ibdev);
1293+
if (error) {
12831294
reason = "rds_ib_alloc_caches failed";
12841295
goto put_dev;
12851296
}
@@ -1308,7 +1319,9 @@ void rds_ib_add_one(struct ib_device *device)
13081319
trace_err:
13091320
if (reason)
13101321
trace_rds_ib_add_device_err(device, NULL, NULL, NULL,
1311-
reason, 0);
1322+
reason, error);
1323+
1324+
return error;
13121325
}
13131326

13141327
static void rds_ib_unregister_client(void)

net/rds/ib.h

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -484,13 +484,6 @@ struct rds_ib_device {
484484
struct completion *rid_dev_rem_complete;
485485
};
486486

487-
static inline int ibdev_to_node(struct ib_device *ibdev)
488-
{
489-
struct device *parent;
490-
491-
parent = ibdev->dev.parent;
492-
return parent ? dev_to_node(parent) : NUMA_NO_NODE;
493-
}
494487
#define rdsibdev_to_node(rdsibdev) ibdev_to_node(rdsibdev->dev)
495488

496489
/* bits for i_ack_flags */
@@ -617,7 +610,7 @@ static inline __s32 rds_qp_num(struct rds_connection *conn, int dst)
617610
/* ib.c */
618611
extern struct workqueue_struct *rds_aux_wq;
619612
extern struct rds_transport rds_ib_transport;
620-
extern void rds_ib_add_one(struct ib_device *device);
613+
extern int rds_ib_add_one(struct ib_device *device);
621614
extern void rds_ib_remove_one(struct ib_device *device, void *client_data);
622615
void rds_ib_srq_exit(struct rds_ib_device *rds_ibdev);
623616
int rds_ib_srq_init(struct rds_ib_device *rds_ibdev);

0 commit comments

Comments
 (0)