rds: store socket timestamps as ktime_t
authorArnd Bergmann <arnd@arndb.de>
Wed, 29 Aug 2018 15:47:19 +0000 (17:47 +0200)
committerDavid S. Miller <davem@davemloft.net>
Sun, 2 Sep 2018 02:52:50 +0000 (19:52 -0700)
rds is the last in-kernel user of the old do_gettimeofday()
function. Convert it over to ktime_get_real() to make it
work more like the generic socket timestamps, and to let
us kill off do_gettimeofday().

A follow-up patch will have to change the user space interface
to deal better with 32-bit tasks, which may use an incompatible
layout for 'struct timespec'.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Acked-by: Santosh Shilimkar <santosh.shilimkar@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/rds/rds.h
net/rds/recv.c

index c4dcf654d8fed2338031ffdc470167d4a2d80269..6bfaf05b63b21efddec1b9fd03e80bc196276c3d 100644 (file)
@@ -278,7 +278,7 @@ struct rds_incoming {
        struct in6_addr         i_saddr;
 
        rds_rdma_cookie_t       i_rdma_cookie;
-       struct timeval          i_rx_tstamp;
+       ktime_t                 i_rx_tstamp;
        u64                     i_rx_lat_trace[RDS_RX_MAX_TRACES];
 };
 
index 504cd6bcc54c5ed4d6e151d176761899d5a25d91..12719653188a300d5b5812a3997451dfe61aa826 100644 (file)
@@ -50,8 +50,7 @@ void rds_inc_init(struct rds_incoming *inc, struct rds_connection *conn,
        inc->i_conn = conn;
        inc->i_saddr = *saddr;
        inc->i_rdma_cookie = 0;
-       inc->i_rx_tstamp.tv_sec = 0;
-       inc->i_rx_tstamp.tv_usec = 0;
+       inc->i_rx_tstamp = ktime_set(0, 0);
 
        for (i = 0; i < RDS_RX_MAX_TRACES; i++)
                inc->i_rx_lat_trace[i] = 0;
@@ -67,8 +66,7 @@ void rds_inc_path_init(struct rds_incoming *inc, struct rds_conn_path *cp,
        inc->i_conn_path = cp;
        inc->i_saddr = *saddr;
        inc->i_rdma_cookie = 0;
-       inc->i_rx_tstamp.tv_sec = 0;
-       inc->i_rx_tstamp.tv_usec = 0;
+       inc->i_rx_tstamp = ktime_set(0, 0);
 }
 EXPORT_SYMBOL_GPL(rds_inc_path_init);
 
@@ -385,7 +383,7 @@ void rds_recv_incoming(struct rds_connection *conn, struct in6_addr *saddr,
                                      be32_to_cpu(inc->i_hdr.h_len),
                                      inc->i_hdr.h_dport);
                if (sock_flag(sk, SOCK_RCVTSTAMP))
-                       do_gettimeofday(&inc->i_rx_tstamp);
+                       inc->i_rx_tstamp = ktime_get_real();
                rds_inc_addref(inc);
                inc->i_rx_lat_trace[RDS_MSG_RX_END] = local_clock();
                list_add_tail(&inc->i_item, &rs->rs_recv_queue);
@@ -552,11 +550,11 @@ static int rds_cmsg_recv(struct rds_incoming *inc, struct msghdr *msg,
                        goto out;
        }
 
-       if ((inc->i_rx_tstamp.tv_sec != 0) &&
+       if ((inc->i_rx_tstamp != 0) &&
            sock_flag(rds_rs_to_sk(rs), SOCK_RCVTSTAMP)) {
+               struct timeval tv = ktime_to_timeval(inc->i_rx_tstamp);
                ret = put_cmsg(msg, SOL_SOCKET, SCM_TIMESTAMP,
-                              sizeof(struct timeval),
-                              &inc->i_rx_tstamp);
+                              sizeof(tv), &tv);
                if (ret)
                        goto out;
        }