Whamcloud - gitweb
LU-7733 ptlrpc: print times in microseconds
[fs/lustre-release.git] / lustre / ptlrpc / lproc_ptlrpc.c
index 739560a..82fe468 100644 (file)
@@ -27,7 +27,7 @@
  * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2011, 2014, Intel Corporation.
+ * Copyright (c) 2011, 2015, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -70,6 +70,7 @@ static struct ll_rpc_opcode {
         { OST_QUOTACHECK,   "ost_quotacheck" },
         { OST_QUOTACTL,     "ost_quotactl" },
         { OST_QUOTA_ADJUST_QUNIT, "ost_quota_adjust_qunit" },
+       { OST_LADVISE,      "ost_ladvise" },
         { MDS_GETATTR,      "mds_getattr" },
         { MDS_GETATTR_NAME, "mds_getattr_lock" },
         { MDS_CLOSE,        "mds_close" },
@@ -77,7 +78,7 @@ static struct ll_rpc_opcode {
         { MDS_READPAGE,     "mds_readpage" },
         { MDS_CONNECT,      "mds_connect" },
         { MDS_DISCONNECT,   "mds_disconnect" },
-        { MDS_GETSTATUS,    "mds_getstatus" },
+       { MDS_GET_ROOT,     "mds_get_root" },
         { MDS_STATFS,       "mds_statfs" },
         { MDS_PIN,          "mds_pin" },
         { MDS_UNPIN,        "mds_unpin" },
@@ -268,7 +269,8 @@ ptlrpc_lprocfs_req_history_len_seq_show(struct seq_file *m, void *v)
        ptlrpc_service_for_each_part(svcpt, i, svc)
                total += svcpt->scp_hist_nrqbds;
 
-       return seq_printf(m, "%d\n", total);
+       seq_printf(m, "%d\n", total);
+       return 0;
 }
 LPROC_SEQ_FOPS_RO(ptlrpc_lprocfs_req_history_len);
 
@@ -283,7 +285,8 @@ ptlrpc_lprocfs_req_history_max_seq_show(struct seq_file *m, void *n)
        ptlrpc_service_for_each_part(svcpt, i, svc)
                total += svc->srv_hist_nrqbds_cpt_max;
 
-       return seq_printf(m, "%d\n", total);
+       seq_printf(m, "%d\n", total);
+       return 0;
 }
 
 static ssize_t
@@ -291,33 +294,34 @@ ptlrpc_lprocfs_req_history_max_seq_write(struct file *file,
                                         const char __user *buffer,
                                         size_t count, loff_t *off)
 {
-       struct seq_file         *m = file->private_data;
-       struct ptlrpc_service   *svc = m->private;
-       int                     bufpages;
-       int                     val;
-       int                     rc;
+       struct seq_file *m = file->private_data;
+       struct ptlrpc_service *svc = m->private;
+       int bufpages;
+       __s64 val;
+       int rc;
 
-       rc = lprocfs_write_helper(buffer, count, &val);
-        if (rc < 0)
-                return rc;
+       rc = lprocfs_str_to_s64(buffer, count, &val);
+       if (rc < 0)
+               return rc;
 
-        if (val < 0)
-                return -ERANGE;
+       if (val < 0 || val > INT_MAX)
+               return -ERANGE;
 
-        /* This sanity check is more of an insanity check; we can still
-         * hose a kernel by allowing the request history to grow too
-         * far. */
+       /* This sanity check is more of an insanity check; we can still
+        * hose a kernel by allowing the request history to grow too
+        * far. */
        bufpages = (svc->srv_buf_size + PAGE_CACHE_SIZE - 1) >>
                                                        PAGE_CACHE_SHIFT;
        if (val > totalram_pages/(2 * bufpages))
-                return -ERANGE;
+               return -ERANGE;
 
        spin_lock(&svc->srv_lock);
 
        if (val == 0)
                svc->srv_hist_nrqbds_cpt_max = 0;
        else
-               svc->srv_hist_nrqbds_cpt_max = max(1, (val / svc->srv_ncpts));
+               svc->srv_hist_nrqbds_cpt_max =
+                       max(1, ((int)val / svc->srv_ncpts));
 
        spin_unlock(&svc->srv_lock);
 
@@ -330,8 +334,9 @@ ptlrpc_lprocfs_threads_min_seq_show(struct seq_file *m, void *n)
 {
        struct ptlrpc_service *svc = m->private;
 
-       return seq_printf(m, "%d\n",
-                         svc->srv_nthrs_cpt_init * svc->srv_ncpts);
+       seq_printf(m, "%d\n",
+                  svc->srv_nthrs_cpt_init * svc->srv_ncpts);
+       return 0;
 }
 
 static ssize_t
@@ -339,10 +344,10 @@ ptlrpc_lprocfs_threads_min_seq_write(struct file *file,
                                     const char __user *buffer,
                                     size_t count, loff_t *off)
 {
-       struct seq_file         *m = file->private_data;
-       struct ptlrpc_service   *svc = m->private;
-       int     val;
-       int     rc = lprocfs_write_helper(buffer, count, &val);
+       struct seq_file *m = file->private_data;
+       struct ptlrpc_service *svc = m->private;
+       __s64 val;
+       int rc = lprocfs_str_to_s64(buffer, count, &val);
 
        if (rc < 0)
                return rc;
@@ -356,7 +361,7 @@ ptlrpc_lprocfs_threads_min_seq_write(struct file *file,
                return -ERANGE;
        }
 
-       svc->srv_nthrs_cpt_init = val / svc->srv_ncpts;
+       svc->srv_nthrs_cpt_init = (int)val / svc->srv_ncpts;
 
        spin_unlock(&svc->srv_lock);
 
@@ -375,7 +380,8 @@ ptlrpc_lprocfs_threads_started_seq_show(struct seq_file *m, void *n)
        ptlrpc_service_for_each_part(svcpt, i, svc)
                total += svcpt->scp_nthrs_running;
 
-       return seq_printf(m, "%d\n", total);
+       seq_printf(m, "%d\n", total);
+       return 0;
 }
 LPROC_SEQ_FOPS_RO(ptlrpc_lprocfs_threads_started);
 
@@ -384,8 +390,9 @@ ptlrpc_lprocfs_threads_max_seq_show(struct seq_file *m, void *n)
 {
        struct ptlrpc_service *svc = m->private;
 
-       return seq_printf(m, "%d\n",
-                         svc->srv_nthrs_cpt_limit * svc->srv_ncpts);
+       seq_printf(m, "%d\n",
+                  svc->srv_nthrs_cpt_limit * svc->srv_ncpts);
+       return 0;
 }
 
 static ssize_t
@@ -393,10 +400,10 @@ ptlrpc_lprocfs_threads_max_seq_write(struct file *file,
                                     const char __user *buffer,
                                     size_t count, loff_t *off)
 {
-       struct seq_file         *m = file->private_data;
-       struct ptlrpc_service   *svc = m->private;
-       int     val;
-       int     rc = lprocfs_write_helper(buffer, count, &val);
+       struct seq_file *m = file->private_data;
+       struct ptlrpc_service *svc = m->private;
+       __s64 val;
+       int rc = lprocfs_str_to_s64(buffer, count, &val);
 
        if (rc < 0)
                return rc;
@@ -410,7 +417,7 @@ ptlrpc_lprocfs_threads_max_seq_write(struct file *file,
                return -ERANGE;
        }
 
-       svc->srv_nthrs_cpt_limit = val / svc->srv_ncpts;
+       svc->srv_nthrs_cpt_limit = (int)val / svc->srv_ncpts;
 
        spin_unlock(&svc->srv_lock);
 
@@ -599,21 +606,21 @@ again:
        for (pol_idx = 0; pol_idx < num_pols; pol_idx++) {
                if (strlen(infos[pol_idx].pi_arg) > 0)
                        seq_printf(m, "  - name: %s %s\n",
-                                     infos[pol_idx].pi_name,
-                                     infos[pol_idx].pi_arg);
+                                  infos[pol_idx].pi_name,
+                                  infos[pol_idx].pi_arg);
                else
                        seq_printf(m, "  - name: %s\n",
-                                     infos[pol_idx].pi_name);
+                                  infos[pol_idx].pi_name);
 
 
                seq_printf(m, "    state: %s\n"
-                             "    fallback: %s\n"
-                             "    queued: %-20d\n"
-                             "    active: %-20d\n\n",
-                             nrs_state2str(infos[pol_idx].pi_state),
-                             infos[pol_idx].pi_fallback ? "yes" : "no",
-                             (int)infos[pol_idx].pi_req_queued,
-                             (int)infos[pol_idx].pi_req_started);
+                          "    fallback: %s\n"
+                          "    queued: %-20d\n"
+                          "    active: %-20d\n\n",
+                          nrs_state2str(infos[pol_idx].pi_state),
+                          infos[pol_idx].pi_fallback ? "yes" : "no",
+                          (int)infos[pol_idx].pi_req_queued,
+                          (int)infos[pol_idx].pi_req_started);
        }
 
        if (!hp && nrs_svc_has_hp(svc)) {
@@ -957,23 +964,34 @@ static int ptlrpc_lprocfs_svc_req_history_show(struct seq_file *s, void *iter)
        rc = ptlrpc_lprocfs_svc_req_history_seek(svcpt, srhi, srhi->srhi_seq);
 
        if (rc == 0) {
+               struct timespec arrival, sent, arrivaldiff;
                char nidstr[LNET_NIDSTR_SIZE];
 
                req = srhi->srhi_req;
 
                libcfs_nid2str_r(req->rq_self, nidstr, sizeof(nidstr));
+               arrival.tv_sec = req->rq_arrival_time.tv_sec;
+               arrival.tv_nsec =
+                       req->rq_arrival_time.tv_usec * NSEC_PER_USEC;
+               sent.tv_sec = req->rq_sent;
+               sent.tv_nsec = 0;
+               arrivaldiff = timespec_sub(sent, arrival);
+
                /* Print common req fields.
                 * CAVEAT EMPTOR: we're racing with the service handler
                 * here.  The request could contain any old crap, so you
                 * must be just as careful as the service's request
                 * parser. Currently I only print stuff here I know is OK
                 * to look at coz it was set up in request_in_callback()!!! */
-               seq_printf(s, LPD64":%s:%s:x"LPU64":%d:%s:%ld:%lds(%+lds) ",
+               seq_printf(s, LPD64":%s:%s:x"LPU64":%d:%s:"
+                          "%ld.%06ld:%ld.%06lds(%+ld.0s) ",
                           req->rq_history_seq, nidstr,
                           libcfs_id2str(req->rq_peer), req->rq_xid,
                           req->rq_reqlen, ptlrpc_rqphase2str(req),
                           req->rq_arrival_time.tv_sec,
-                          req->rq_sent - req->rq_arrival_time.tv_sec,
+                          req->rq_arrival_time.tv_usec,
+                          arrivaldiff.tv_sec,
+                          arrivaldiff.tv_nsec / NSEC_PER_USEC,
                           req->rq_sent - req->rq_deadline);
                if (svc->srv_ops.so_req_printer == NULL)
                        seq_printf(s, "\n");
@@ -1047,23 +1065,24 @@ LPROC_SEQ_FOPS_RO(ptlrpc_lprocfs_timeouts);
 static int ptlrpc_lprocfs_hp_ratio_seq_show(struct seq_file *m, void *v)
 {
        struct ptlrpc_service *svc = m->private;
-       return seq_printf(m, "%d\n", svc->srv_hpreq_ratio);
+       seq_printf(m, "%d\n", svc->srv_hpreq_ratio);
+       return 0;
 }
 
 static ssize_t
 ptlrpc_lprocfs_hp_ratio_seq_write(struct file *file, const char __user *buffer,
                                  size_t count, loff_t *off)
 {
-       struct seq_file         *m = file->private_data;
-       struct ptlrpc_service   *svc = m->private;
-       int     rc;
-       int     val;
+       struct seq_file *m = file->private_data;
+       struct ptlrpc_service *svc = m->private;
+       int rc;
+       __s64 val;
 
-       rc = lprocfs_write_helper(buffer, count, &val);
+       rc = lprocfs_str_to_s64(buffer, count, &val);
        if (rc < 0)
                return rc;
 
-       if (val < 0)
+       if (val < 0 || val > INT_MAX)
                return -ERANGE;
 
        spin_lock(&svc->srv_lock);
@@ -1198,7 +1217,7 @@ void ptlrpc_lprocfs_unregister_obd(struct obd_device *obd)
 EXPORT_SYMBOL(ptlrpc_lprocfs_unregister_obd);
 
 ssize_t
-lprocfs_ping_seq_write(struct file *file, const char *buffer,
+lprocfs_ping_seq_write(struct file *file, const char __user *buffer,
                       size_t count, loff_t *off)
 {
        struct seq_file         *m = file->private_data;
@@ -1296,26 +1315,26 @@ int lprocfs_pinger_recov_seq_show(struct seq_file *m, void *n)
 {
        struct obd_device *obd = m->private;
        struct obd_import *imp = obd->u.cli.cl_import;
-       int rc;
 
        LPROCFS_CLIMP_CHECK(obd);
-       rc = seq_printf(m, "%d\n", !imp->imp_no_pinger_recover);
+       seq_printf(m, "%d\n", !imp->imp_no_pinger_recover);
        LPROCFS_CLIMP_EXIT(obd);
-       return rc;
+       return 0;
 }
 EXPORT_SYMBOL(lprocfs_pinger_recov_seq_show);
 
 ssize_t
-lprocfs_pinger_recov_seq_write(struct file *file, const char *buffer,
+lprocfs_pinger_recov_seq_write(struct file *file, const char __user *buffer,
                               size_t count, loff_t *off)
 {
-       struct seq_file   *m    = file->private_data;
-       struct obd_device *obd  = m->private;
-       struct client_obd *cli  = &obd->u.cli;
-       struct obd_import *imp  = cli->cl_import;
-       int rc, val;
+       struct seq_file *m = file->private_data;
+       struct obd_device *obd = m->private;
+       struct client_obd *cli = &obd->u.cli;
+       struct obd_import *imp = cli->cl_import;
+       int rc;
+       __s64 val;
 
-       rc = lprocfs_write_helper(buffer, count, &val);
+       rc = lprocfs_str_to_s64(buffer, count, &val);
        if (rc < 0)
                return rc;