hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/net/rds/recv.c
....@@ -43,18 +43,14 @@
4343 void rds_inc_init(struct rds_incoming *inc, struct rds_connection *conn,
4444 struct in6_addr *saddr)
4545 {
46
- int i;
47
-
4846 refcount_set(&inc->i_refcount, 1);
4947 INIT_LIST_HEAD(&inc->i_item);
5048 inc->i_conn = conn;
5149 inc->i_saddr = *saddr;
52
- inc->i_rdma_cookie = 0;
53
- inc->i_rx_tstamp.tv_sec = 0;
54
- inc->i_rx_tstamp.tv_usec = 0;
50
+ inc->i_usercopy.rdma_cookie = 0;
51
+ inc->i_usercopy.rx_tstamp = ktime_set(0, 0);
5552
56
- for (i = 0; i < RDS_RX_MAX_TRACES; i++)
57
- inc->i_rx_lat_trace[i] = 0;
53
+ memset(inc->i_rx_lat_trace, 0, sizeof(inc->i_rx_lat_trace));
5854 }
5955 EXPORT_SYMBOL_GPL(rds_inc_init);
6056
....@@ -66,9 +62,8 @@
6662 inc->i_conn = cp->cp_conn;
6763 inc->i_conn_path = cp;
6864 inc->i_saddr = *saddr;
69
- inc->i_rdma_cookie = 0;
70
- inc->i_rx_tstamp.tv_sec = 0;
71
- inc->i_rx_tstamp.tv_usec = 0;
65
+ inc->i_usercopy.rdma_cookie = 0;
66
+ inc->i_usercopy.rx_tstamp = ktime_set(0, 0);
7267 }
7368 EXPORT_SYMBOL_GPL(rds_inc_path_init);
7469
....@@ -191,7 +186,7 @@
191186 case RDS_EXTHDR_RDMA_DEST:
192187 /* We ignore the size for now. We could stash it
193188 * somewhere and use it for error checking. */
194
- inc->i_rdma_cookie = rds_rdma_make_cookie(
189
+ inc->i_usercopy.rdma_cookie = rds_rdma_make_cookie(
195190 be32_to_cpu(buffer.rdma_dest.h_rdma_rkey),
196191 be32_to_cpu(buffer.rdma_dest.h_rdma_offset));
197192
....@@ -385,7 +380,7 @@
385380 be32_to_cpu(inc->i_hdr.h_len),
386381 inc->i_hdr.h_dport);
387382 if (sock_flag(sk, SOCK_RCVTSTAMP))
388
- do_gettimeofday(&inc->i_rx_tstamp);
383
+ inc->i_usercopy.rx_tstamp = ktime_get_real();
389384 rds_inc_addref(inc);
390385 inc->i_rx_lat_trace[RDS_MSG_RX_END] = local_clock();
391386 list_add_tail(&inc->i_item, &rs->rs_recv_queue);
....@@ -546,18 +541,32 @@
546541 {
547542 int ret = 0;
548543
549
- if (inc->i_rdma_cookie) {
544
+ if (inc->i_usercopy.rdma_cookie) {
550545 ret = put_cmsg(msg, SOL_RDS, RDS_CMSG_RDMA_DEST,
551
- sizeof(inc->i_rdma_cookie), &inc->i_rdma_cookie);
546
+ sizeof(inc->i_usercopy.rdma_cookie),
547
+ &inc->i_usercopy.rdma_cookie);
552548 if (ret)
553549 goto out;
554550 }
555551
556
- if ((inc->i_rx_tstamp.tv_sec != 0) &&
552
+ if ((inc->i_usercopy.rx_tstamp != 0) &&
557553 sock_flag(rds_rs_to_sk(rs), SOCK_RCVTSTAMP)) {
558
- ret = put_cmsg(msg, SOL_SOCKET, SCM_TIMESTAMP,
559
- sizeof(struct timeval),
560
- &inc->i_rx_tstamp);
554
+ struct __kernel_old_timeval tv =
555
+ ns_to_kernel_old_timeval(inc->i_usercopy.rx_tstamp);
556
+
557
+ if (!sock_flag(rds_rs_to_sk(rs), SOCK_TSTAMP_NEW)) {
558
+ ret = put_cmsg(msg, SOL_SOCKET, SO_TIMESTAMP_OLD,
559
+ sizeof(tv), &tv);
560
+ } else {
561
+ struct __kernel_sock_timeval sk_tv;
562
+
563
+ sk_tv.tv_sec = tv.tv_sec;
564
+ sk_tv.tv_usec = tv.tv_usec;
565
+
566
+ ret = put_cmsg(msg, SOL_SOCKET, SO_TIMESTAMP_NEW,
567
+ sizeof(sk_tv), &sk_tv);
568
+ }
569
+
561570 if (ret)
562571 goto out;
563572 }
....@@ -776,6 +785,7 @@
776785
777786 minfo.seq = be64_to_cpu(inc->i_hdr.h_sequence);
778787 minfo.len = be32_to_cpu(inc->i_hdr.h_len);
788
+ minfo.tos = inc->i_conn->c_tos;
779789
780790 if (flip) {
781791 minfo.laddr = daddr;
....@@ -804,7 +814,7 @@
804814
805815 minfo6.seq = be64_to_cpu(inc->i_hdr.h_sequence);
806816 minfo6.len = be32_to_cpu(inc->i_hdr.h_len);
807
- minfo6.tos = 0;
817
+ minfo6.tos = inc->i_conn->c_tos;
808818
809819 if (flip) {
810820 minfo6.laddr = *daddr;