Commit 00d50001 authored by Karol Kolacinski's avatar Karol Kolacinski Committed by Tony Nguyen

ice: Schedule service task in IRQ top half

Schedule service task and EXTTS in the top half to avoid bottom half
scheduling if possible, which significantly reduces timestamping delay.
Co-developed-by: default avatarMichal Michalik <michal.michalik@intel.com>
Signed-off-by: default avatarMichal Michalik <michal.michalik@intel.com>
Reviewed-by: default avatarPrzemek Kitszel <przemyslaw.kitszel@intel.com>
Signed-off-by: default avatarKarol Kolacinski <karol.kolacinski@intel.com>
Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@intel.com> (A Contingent worker at Intel)
Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
parent 954fb2d2
...@@ -518,7 +518,6 @@ enum ice_pf_flags { ...@@ -518,7 +518,6 @@ enum ice_pf_flags {
}; };
enum ice_misc_thread_tasks { enum ice_misc_thread_tasks {
ICE_MISC_THREAD_EXTTS_EVENT,
ICE_MISC_THREAD_TX_TSTAMP, ICE_MISC_THREAD_TX_TSTAMP,
ICE_MISC_THREAD_NBITS /* must be last */ ICE_MISC_THREAD_NBITS /* must be last */
}; };
......
...@@ -3084,6 +3084,7 @@ static void ice_ena_misc_vector(struct ice_pf *pf) ...@@ -3084,6 +3084,7 @@ static void ice_ena_misc_vector(struct ice_pf *pf)
static irqreturn_t ice_misc_intr(int __always_unused irq, void *data) static irqreturn_t ice_misc_intr(int __always_unused irq, void *data)
{ {
struct ice_pf *pf = (struct ice_pf *)data; struct ice_pf *pf = (struct ice_pf *)data;
irqreturn_t ret = IRQ_HANDLED;
struct ice_hw *hw = &pf->hw; struct ice_hw *hw = &pf->hw;
struct device *dev; struct device *dev;
u32 oicr, ena_mask; u32 oicr, ena_mask;
...@@ -3165,8 +3166,10 @@ static irqreturn_t ice_misc_intr(int __always_unused irq, void *data) ...@@ -3165,8 +3166,10 @@ static irqreturn_t ice_misc_intr(int __always_unused irq, void *data)
if (oicr & PFINT_OICR_TSYN_TX_M) { if (oicr & PFINT_OICR_TSYN_TX_M) {
ena_mask &= ~PFINT_OICR_TSYN_TX_M; ena_mask &= ~PFINT_OICR_TSYN_TX_M;
if (ice_ptp_pf_handles_tx_interrupt(pf)) if (ice_ptp_pf_handles_tx_interrupt(pf)) {
set_bit(ICE_MISC_THREAD_TX_TSTAMP, pf->misc_thread); set_bit(ICE_MISC_THREAD_TX_TSTAMP, pf->misc_thread);
ret = IRQ_WAKE_THREAD;
}
} }
if (oicr & PFINT_OICR_TSYN_EVNT_M) { if (oicr & PFINT_OICR_TSYN_EVNT_M) {
...@@ -3182,7 +3185,7 @@ static irqreturn_t ice_misc_intr(int __always_unused irq, void *data) ...@@ -3182,7 +3185,7 @@ static irqreturn_t ice_misc_intr(int __always_unused irq, void *data)
GLTSYN_STAT_EVENT1_M | GLTSYN_STAT_EVENT1_M |
GLTSYN_STAT_EVENT2_M); GLTSYN_STAT_EVENT2_M);
set_bit(ICE_MISC_THREAD_EXTTS_EVENT, pf->misc_thread); ice_ptp_extts_event(pf);
} }
} }
...@@ -3205,8 +3208,11 @@ static irqreturn_t ice_misc_intr(int __always_unused irq, void *data) ...@@ -3205,8 +3208,11 @@ static irqreturn_t ice_misc_intr(int __always_unused irq, void *data)
set_bit(ICE_PFR_REQ, pf->state); set_bit(ICE_PFR_REQ, pf->state);
} }
} }
ice_service_task_schedule(pf);
if (ret == IRQ_HANDLED)
ice_irq_dynamic_ena(hw, NULL, NULL);
return IRQ_WAKE_THREAD; return ret;
} }
/** /**
...@@ -3222,12 +3228,7 @@ static irqreturn_t ice_misc_intr_thread_fn(int __always_unused irq, void *data) ...@@ -3222,12 +3228,7 @@ static irqreturn_t ice_misc_intr_thread_fn(int __always_unused irq, void *data)
hw = &pf->hw; hw = &pf->hw;
if (ice_is_reset_in_progress(pf->state)) if (ice_is_reset_in_progress(pf->state))
return IRQ_HANDLED; goto skip_irq;
ice_service_task_schedule(pf);
if (test_and_clear_bit(ICE_MISC_THREAD_EXTTS_EVENT, pf->misc_thread))
ice_ptp_extts_event(pf);
if (test_and_clear_bit(ICE_MISC_THREAD_TX_TSTAMP, pf->misc_thread)) { if (test_and_clear_bit(ICE_MISC_THREAD_TX_TSTAMP, pf->misc_thread)) {
/* Process outstanding Tx timestamps. If there is more work, /* Process outstanding Tx timestamps. If there is more work,
...@@ -3239,6 +3240,7 @@ static irqreturn_t ice_misc_intr_thread_fn(int __always_unused irq, void *data) ...@@ -3239,6 +3240,7 @@ static irqreturn_t ice_misc_intr_thread_fn(int __always_unused irq, void *data)
} }
} }
skip_irq:
ice_irq_dynamic_ena(hw, NULL, NULL); ice_irq_dynamic_ena(hw, NULL, NULL);
return IRQ_HANDLED; return IRQ_HANDLED;
......
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