Commit 8f604a03 authored by Arnd Bergmann's avatar Arnd Bergmann Committed by Martin K. Petersen

scsi: bfa: use proper time accessor for stats_reset_time

We use the deprecated do_gettimeofday() function to read the current
time when resetting the statistics in both bfa_port and bfa_svc. This
works fine because overflow is handled correctly, but we want to get rid
of do_gettimeofday() and using a non-monotonic time suffers from
concurrent settimeofday calls and other problems.

This uses the ktime_get_seconds() function instead, which does what we
need here.
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Acked-by: default avatarAnil Gurumurthy <Anil.Gurumurthy@cavium.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 7e75f607
...@@ -96,14 +96,11 @@ bfa_port_get_stats_isr(struct bfa_port_s *port, bfa_status_t status) ...@@ -96,14 +96,11 @@ bfa_port_get_stats_isr(struct bfa_port_s *port, bfa_status_t status)
port->stats_busy = BFA_FALSE; port->stats_busy = BFA_FALSE;
if (status == BFA_STATUS_OK) { if (status == BFA_STATUS_OK) {
struct timeval tv;
memcpy(port->stats, port->stats_dma.kva, memcpy(port->stats, port->stats_dma.kva,
sizeof(union bfa_port_stats_u)); sizeof(union bfa_port_stats_u));
bfa_port_stats_swap(port, port->stats); bfa_port_stats_swap(port, port->stats);
do_gettimeofday(&tv); port->stats->fc.secs_reset = ktime_get_seconds() - port->stats_reset_time;
port->stats->fc.secs_reset = tv.tv_sec - port->stats_reset_time;
} }
if (port->stats_cbfn) { if (port->stats_cbfn) {
...@@ -124,16 +121,13 @@ bfa_port_get_stats_isr(struct bfa_port_s *port, bfa_status_t status) ...@@ -124,16 +121,13 @@ bfa_port_get_stats_isr(struct bfa_port_s *port, bfa_status_t status)
static void static void
bfa_port_clear_stats_isr(struct bfa_port_s *port, bfa_status_t status) bfa_port_clear_stats_isr(struct bfa_port_s *port, bfa_status_t status)
{ {
struct timeval tv;
port->stats_status = status; port->stats_status = status;
port->stats_busy = BFA_FALSE; port->stats_busy = BFA_FALSE;
/* /*
* re-initialize time stamp for stats reset * re-initialize time stamp for stats reset
*/ */
do_gettimeofday(&tv); port->stats_reset_time = ktime_get_seconds();
port->stats_reset_time = tv.tv_sec;
if (port->stats_cbfn) { if (port->stats_cbfn) {
port->stats_cbfn(port->stats_cbarg, status); port->stats_cbfn(port->stats_cbarg, status);
...@@ -471,8 +465,6 @@ void ...@@ -471,8 +465,6 @@ void
bfa_port_attach(struct bfa_port_s *port, struct bfa_ioc_s *ioc, bfa_port_attach(struct bfa_port_s *port, struct bfa_ioc_s *ioc,
void *dev, struct bfa_trc_mod_s *trcmod) void *dev, struct bfa_trc_mod_s *trcmod)
{ {
struct timeval tv;
WARN_ON(!port); WARN_ON(!port);
port->dev = dev; port->dev = dev;
...@@ -494,8 +486,7 @@ bfa_port_attach(struct bfa_port_s *port, struct bfa_ioc_s *ioc, ...@@ -494,8 +486,7 @@ bfa_port_attach(struct bfa_port_s *port, struct bfa_ioc_s *ioc,
/* /*
* initialize time stamp for stats reset * initialize time stamp for stats reset
*/ */
do_gettimeofday(&tv); port->stats_reset_time = ktime_get_seconds();
port->stats_reset_time = tv.tv_sec;
bfa_trc(port, 0); bfa_trc(port, 0);
} }
......
...@@ -36,7 +36,7 @@ struct bfa_port_s { ...@@ -36,7 +36,7 @@ struct bfa_port_s {
bfa_port_stats_cbfn_t stats_cbfn; bfa_port_stats_cbfn_t stats_cbfn;
void *stats_cbarg; void *stats_cbarg;
bfa_status_t stats_status; bfa_status_t stats_status;
u32 stats_reset_time; time64_t stats_reset_time;
union bfa_port_stats_u *stats; union bfa_port_stats_u *stats;
struct bfa_dma_s stats_dma; struct bfa_dma_s stats_dma;
bfa_boolean_t endis_pending; bfa_boolean_t endis_pending;
......
...@@ -3047,7 +3047,6 @@ bfa_fcport_attach(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg, ...@@ -3047,7 +3047,6 @@ bfa_fcport_attach(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg,
struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa);
struct bfa_port_cfg_s *port_cfg = &fcport->cfg; struct bfa_port_cfg_s *port_cfg = &fcport->cfg;
struct bfa_fcport_ln_s *ln = &fcport->ln; struct bfa_fcport_ln_s *ln = &fcport->ln;
struct timeval tv;
fcport->bfa = bfa; fcport->bfa = bfa;
ln->fcport = fcport; ln->fcport = fcport;
...@@ -3060,8 +3059,7 @@ bfa_fcport_attach(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg, ...@@ -3060,8 +3059,7 @@ bfa_fcport_attach(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg,
/* /*
* initialize time stamp for stats reset * initialize time stamp for stats reset
*/ */
do_gettimeofday(&tv); fcport->stats_reset_time = ktime_get_seconds();
fcport->stats_reset_time = tv.tv_sec;
fcport->stats_dma_ready = BFA_FALSE; fcport->stats_dma_ready = BFA_FALSE;
/* /*
...@@ -3295,9 +3293,7 @@ __bfa_cb_fcport_stats_get(void *cbarg, bfa_boolean_t complete) ...@@ -3295,9 +3293,7 @@ __bfa_cb_fcport_stats_get(void *cbarg, bfa_boolean_t complete)
union bfa_fcport_stats_u *ret; union bfa_fcport_stats_u *ret;
if (complete) { if (complete) {
struct timeval tv; time64_t time = ktime_get_seconds();
if (fcport->stats_status == BFA_STATUS_OK)
do_gettimeofday(&tv);
list_for_each_safe(qe, qen, &fcport->stats_pending_q) { list_for_each_safe(qe, qen, &fcport->stats_pending_q) {
bfa_q_deq(&fcport->stats_pending_q, &qe); bfa_q_deq(&fcport->stats_pending_q, &qe);
...@@ -3312,7 +3308,7 @@ __bfa_cb_fcport_stats_get(void *cbarg, bfa_boolean_t complete) ...@@ -3312,7 +3308,7 @@ __bfa_cb_fcport_stats_get(void *cbarg, bfa_boolean_t complete)
bfa_fcport_fcoe_stats_swap(&ret->fcoe, bfa_fcport_fcoe_stats_swap(&ret->fcoe,
&fcport->stats->fcoe); &fcport->stats->fcoe);
ret->fcoe.secs_reset = ret->fcoe.secs_reset =
tv.tv_sec - fcport->stats_reset_time; time - fcport->stats_reset_time;
} }
} }
bfa_cb_queue_status(fcport->bfa, &cb->hcb_qe, bfa_cb_queue_status(fcport->bfa, &cb->hcb_qe,
...@@ -3373,13 +3369,10 @@ __bfa_cb_fcport_stats_clr(void *cbarg, bfa_boolean_t complete) ...@@ -3373,13 +3369,10 @@ __bfa_cb_fcport_stats_clr(void *cbarg, bfa_boolean_t complete)
struct list_head *qe, *qen; struct list_head *qe, *qen;
if (complete) { if (complete) {
struct timeval tv;
/* /*
* re-initialize time stamp for stats reset * re-initialize time stamp for stats reset
*/ */
do_gettimeofday(&tv); fcport->stats_reset_time = ktime_get_seconds();
fcport->stats_reset_time = tv.tv_sec;
list_for_each_safe(qe, qen, &fcport->statsclr_pending_q) { list_for_each_safe(qe, qen, &fcport->statsclr_pending_q) {
bfa_q_deq(&fcport->statsclr_pending_q, &qe); bfa_q_deq(&fcport->statsclr_pending_q, &qe);
cb = (struct bfa_cb_pending_q_s *)qe; cb = (struct bfa_cb_pending_q_s *)qe;
......
...@@ -505,7 +505,7 @@ struct bfa_fcport_s { ...@@ -505,7 +505,7 @@ struct bfa_fcport_s {
struct list_head stats_pending_q; struct list_head stats_pending_q;
struct list_head statsclr_pending_q; struct list_head statsclr_pending_q;
bfa_boolean_t stats_qfull; bfa_boolean_t stats_qfull;
u32 stats_reset_time; /* stats reset time stamp */ time64_t stats_reset_time; /* stats reset time stamp */
bfa_boolean_t diag_busy; /* diag busy status */ bfa_boolean_t diag_busy; /* diag busy status */
bfa_boolean_t beacon; /* port beacon status */ bfa_boolean_t beacon; /* port beacon status */
bfa_boolean_t link_e2e_beacon; /* link beacon status */ bfa_boolean_t link_e2e_beacon; /* link beacon status */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment