hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/net/rds/send.c
....@@ -145,6 +145,7 @@
145145 LIST_HEAD(to_be_dropped);
146146 int batch_count;
147147 unsigned long send_gen = 0;
148
+ int same_rm = 0;
148149
149150 restart:
150151 batch_count = 0;
....@@ -199,6 +200,17 @@
199200 while (1) {
200201
201202 rm = cp->cp_xmit_rm;
203
+
204
+ if (!rm) {
205
+ same_rm = 0;
206
+ } else {
207
+ same_rm++;
208
+ if (same_rm >= 4096) {
209
+ rds_stats_inc(s_send_stuck_rm);
210
+ ret = -EAGAIN;
211
+ break;
212
+ }
213
+ }
202214
203215 /*
204216 * If between sending messages, we can send a pending congestion
....@@ -491,14 +503,12 @@
491503 struct rm_rdma_op *ro;
492504 struct rds_notifier *notifier;
493505 unsigned long flags;
494
- unsigned int notify = 0;
495506
496507 spin_lock_irqsave(&rm->m_rs_lock, flags);
497508
498
- notify = rm->rdma.op_notify | rm->data.op_notify;
499509 ro = &rm->rdma;
500510 if (test_bit(RDS_MSG_ON_SOCK, &rm->m_flags) &&
501
- ro->op_active && notify && ro->op_notifier) {
511
+ ro->op_active && ro->op_notify && ro->op_notifier) {
502512 notifier = ro->op_notifier;
503513 rs = rm->m_rs;
504514 sock_hold(rds_rs_to_sk(rs));
....@@ -886,6 +896,9 @@
886896 bool zcopy_cookie = false;
887897 struct rds_iov_vector *iov, *tmp_iov;
888898
899
+ if (num_sgs < 0)
900
+ return -EINVAL;
901
+
889902 for_each_cmsghdr(cmsg, msg) {
890903 if (!CMSG_OK(msg, cmsg))
891904 return -EINVAL;
....@@ -921,7 +934,7 @@
921934
922935 case RDS_CMSG_ZCOPY_COOKIE:
923936 zcopy_cookie = true;
924
- /* fall through */
937
+ fallthrough;
925938
926939 case RDS_CMSG_RDMA_DEST:
927940 case RDS_CMSG_RDMA_MAP:
....@@ -1104,7 +1117,7 @@
11041117 size_t total_payload_len = payload_len, rdma_payload_len = 0;
11051118 bool zcopy = ((msg->msg_flags & MSG_ZEROCOPY) &&
11061119 sock_flag(rds_rs_to_sk(rs), SOCK_ZEROCOPY));
1107
- int num_sgs = ceil(payload_len, PAGE_SIZE);
1120
+ int num_sgs = DIV_ROUND_UP(payload_len, PAGE_SIZE);
11081121 int namelen;
11091122 struct rds_iov_vector_arr vct;
11101123 int ind;
....@@ -1131,7 +1144,7 @@
11311144 case AF_INET:
11321145 if (usin->sin_addr.s_addr == htonl(INADDR_ANY) ||
11331146 usin->sin_addr.s_addr == htonl(INADDR_BROADCAST) ||
1134
- IN_MULTICAST(ntohl(usin->sin_addr.s_addr))) {
1147
+ ipv4_is_multicast(usin->sin_addr.s_addr)) {
11351148 ret = -EINVAL;
11361149 goto out;
11371150 }
....@@ -1162,7 +1175,7 @@
11621175 addr4 = sin6->sin6_addr.s6_addr32[3];
11631176 if (addr4 == htonl(INADDR_ANY) ||
11641177 addr4 == htonl(INADDR_BROADCAST) ||
1165
- IN_MULTICAST(ntohl(addr4))) {
1178
+ ipv4_is_multicast(addr4)) {
11661179 ret = -EINVAL;
11671180 goto out;
11681181 }
....@@ -1262,8 +1275,8 @@
12621275 /* Attach data to the rm */
12631276 if (payload_len) {
12641277 rm->data.op_sg = rds_message_alloc_sgs(rm, num_sgs);
1265
- if (!rm->data.op_sg) {
1266
- ret = -ENOMEM;
1278
+ if (IS_ERR(rm->data.op_sg)) {
1279
+ ret = PTR_ERR(rm->data.op_sg);
12671280 goto out;
12681281 }
12691282 ret = rds_message_copy_from_user(rm, &msg->msg_iter, zcopy);
....@@ -1276,12 +1289,13 @@
12761289
12771290 /* rds_conn_create has a spinlock that runs with IRQ off.
12781291 * Caching the conn in the socket helps a lot. */
1279
- if (rs->rs_conn && ipv6_addr_equal(&rs->rs_conn->c_faddr, &daddr))
1292
+ if (rs->rs_conn && ipv6_addr_equal(&rs->rs_conn->c_faddr, &daddr) &&
1293
+ rs->rs_tos == rs->rs_conn->c_tos) {
12801294 conn = rs->rs_conn;
1281
- else {
1295
+ } else {
12821296 conn = rds_conn_create_outgoing(sock_net(sock->sk),
12831297 &rs->rs_bound_addr, &daddr,
1284
- rs->rs_transport,
1298
+ rs->rs_transport, rs->rs_tos,
12851299 sock->sk->sk_allocation,
12861300 scope_id);
12871301 if (IS_ERR(conn)) {
....@@ -1326,7 +1340,8 @@
13261340 goto out;
13271341 }
13281342
1329
- rds_conn_path_connect_if_down(cpath);
1343
+ if (rds_conn_path_down(cpath))
1344
+ rds_check_all_paths(conn);
13301345
13311346 ret = rds_cong_wait(conn->c_fcong, dport, nonblock, rs);
13321347 if (ret) {