Commit b29a4f30 authored by Vasu Dev's avatar Vasu Dev Committed by James Bottomley

[SCSI] libfc: add exch timer debug info

Add exch timeout info to have debug log with exch timeout
value to match with retries, also add debug info
on exch timer cancel.

Added common fc_exch_timer_cancel() func and grouped this
along with fc_exch_timer_set() function, so that
added debug code is not repeated.
Signed-off-by: default avatarVasu Dev <vasu.dev@intel.com>
Signed-off-by: default avatarRobert Love <robert.w.love@intel.com>
Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
parent 33a2285d
...@@ -333,6 +333,52 @@ static void fc_exch_release(struct fc_exch *ep) ...@@ -333,6 +333,52 @@ static void fc_exch_release(struct fc_exch *ep)
} }
} }
/**
* fc_exch_timer_cancel() - cancel exch timer
* @ep: The exchange whose timer to be canceled
*/
static inline void fc_exch_timer_cancel(struct fc_exch *ep)
{
if (cancel_delayed_work(&ep->timeout_work)) {
FC_EXCH_DBG(ep, "Exchange timer canceled\n");
atomic_dec(&ep->ex_refcnt); /* drop hold for timer */
}
}
/**
* fc_exch_timer_set_locked() - Start a timer for an exchange w/ the
* the exchange lock held
* @ep: The exchange whose timer will start
* @timer_msec: The timeout period
*
* Used for upper level protocols to time out the exchange.
* The timer is cancelled when it fires or when the exchange completes.
*/
static inline void fc_exch_timer_set_locked(struct fc_exch *ep,
unsigned int timer_msec)
{
if (ep->state & (FC_EX_RST_CLEANUP | FC_EX_DONE))
return;
FC_EXCH_DBG(ep, "Exchange timer armed : %d msecs\n", timer_msec);
if (queue_delayed_work(fc_exch_workqueue, &ep->timeout_work,
msecs_to_jiffies(timer_msec)))
fc_exch_hold(ep); /* hold for timer */
}
/**
* fc_exch_timer_set() - Lock the exchange and set the timer
* @ep: The exchange whose timer will start
* @timer_msec: The timeout period
*/
static void fc_exch_timer_set(struct fc_exch *ep, unsigned int timer_msec)
{
spin_lock_bh(&ep->ex_lock);
fc_exch_timer_set_locked(ep, timer_msec);
spin_unlock_bh(&ep->ex_lock);
}
/** /**
* fc_exch_done_locked() - Complete an exchange with the exchange lock held * fc_exch_done_locked() - Complete an exchange with the exchange lock held
* @ep: The exchange that is complete * @ep: The exchange that is complete
...@@ -354,8 +400,7 @@ static int fc_exch_done_locked(struct fc_exch *ep) ...@@ -354,8 +400,7 @@ static int fc_exch_done_locked(struct fc_exch *ep)
if (!(ep->esb_stat & ESB_ST_REC_QUAL)) { if (!(ep->esb_stat & ESB_ST_REC_QUAL)) {
ep->state |= FC_EX_DONE; ep->state |= FC_EX_DONE;
if (cancel_delayed_work(&ep->timeout_work)) fc_exch_timer_cancel(ep);
atomic_dec(&ep->ex_refcnt); /* drop hold for timer */
rc = 0; rc = 0;
} }
return rc; return rc;
...@@ -418,40 +463,6 @@ static void fc_exch_delete(struct fc_exch *ep) ...@@ -418,40 +463,6 @@ static void fc_exch_delete(struct fc_exch *ep)
fc_exch_release(ep); /* drop hold for exch in mp */ fc_exch_release(ep); /* drop hold for exch in mp */
} }
/**
* fc_exch_timer_set_locked() - Start a timer for an exchange w/ the
* the exchange lock held
* @ep: The exchange whose timer will start
* @timer_msec: The timeout period
*
* Used for upper level protocols to time out the exchange.
* The timer is cancelled when it fires or when the exchange completes.
*/
static inline void fc_exch_timer_set_locked(struct fc_exch *ep,
unsigned int timer_msec)
{
if (ep->state & (FC_EX_RST_CLEANUP | FC_EX_DONE))
return;
FC_EXCH_DBG(ep, "Exchange timer armed\n");
if (queue_delayed_work(fc_exch_workqueue, &ep->timeout_work,
msecs_to_jiffies(timer_msec)))
fc_exch_hold(ep); /* hold for timer */
}
/**
* fc_exch_timer_set() - Lock the exchange and set the timer
* @ep: The exchange whose timer will start
* @timer_msec: The timeout period
*/
static void fc_exch_timer_set(struct fc_exch *ep, unsigned int timer_msec)
{
spin_lock_bh(&ep->ex_lock);
fc_exch_timer_set_locked(ep, timer_msec);
spin_unlock_bh(&ep->ex_lock);
}
/** /**
* fc_seq_send() - Send a frame using existing sequence/exchange pair * fc_seq_send() - Send a frame using existing sequence/exchange pair
* @lport: The local port that the exchange will be sent on * @lport: The local port that the exchange will be sent on
...@@ -1544,8 +1555,10 @@ static void fc_exch_abts_resp(struct fc_exch *ep, struct fc_frame *fp) ...@@ -1544,8 +1555,10 @@ static void fc_exch_abts_resp(struct fc_exch *ep, struct fc_frame *fp)
FC_EXCH_DBG(ep, "exch: BLS rctl %x - %s\n", fh->fh_r_ctl, FC_EXCH_DBG(ep, "exch: BLS rctl %x - %s\n", fh->fh_r_ctl,
fc_exch_rctl_name(fh->fh_r_ctl)); fc_exch_rctl_name(fh->fh_r_ctl));
if (cancel_delayed_work_sync(&ep->timeout_work)) if (cancel_delayed_work_sync(&ep->timeout_work)) {
FC_EXCH_DBG(ep, "Exchange timer canceled\n");
fc_exch_release(ep); /* release from pending timer hold */ fc_exch_release(ep); /* release from pending timer hold */
}
spin_lock_bh(&ep->ex_lock); spin_lock_bh(&ep->ex_lock);
switch (fh->fh_r_ctl) { switch (fh->fh_r_ctl) {
...@@ -1732,8 +1745,7 @@ static void fc_exch_reset(struct fc_exch *ep) ...@@ -1732,8 +1745,7 @@ static void fc_exch_reset(struct fc_exch *ep)
spin_lock_bh(&ep->ex_lock); spin_lock_bh(&ep->ex_lock);
fc_exch_abort_locked(ep, 0); fc_exch_abort_locked(ep, 0);
ep->state |= FC_EX_RST_CLEANUP; ep->state |= FC_EX_RST_CLEANUP;
if (cancel_delayed_work(&ep->timeout_work)) fc_exch_timer_cancel(ep);
atomic_dec(&ep->ex_refcnt); /* drop hold for timer */
resp = ep->resp; resp = ep->resp;
ep->resp = NULL; ep->resp = NULL;
if (ep->esb_stat & ESB_ST_REC_QUAL) if (ep->esb_stat & ESB_ST_REC_QUAL)
...@@ -2128,10 +2140,8 @@ static void fc_exch_els_rrq(struct fc_frame *fp) ...@@ -2128,10 +2140,8 @@ static void fc_exch_els_rrq(struct fc_frame *fp)
ep->esb_stat &= ~ESB_ST_REC_QUAL; ep->esb_stat &= ~ESB_ST_REC_QUAL;
atomic_dec(&ep->ex_refcnt); /* drop hold for rec qual */ atomic_dec(&ep->ex_refcnt); /* drop hold for rec qual */
} }
if (ep->esb_stat & ESB_ST_COMPLETE) { if (ep->esb_stat & ESB_ST_COMPLETE)
if (cancel_delayed_work(&ep->timeout_work)) fc_exch_timer_cancel(ep);
atomic_dec(&ep->ex_refcnt); /* drop timer hold */
}
spin_unlock_bh(&ep->ex_lock); spin_unlock_bh(&ep->ex_lock);
......
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