mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-04-13 09:40:36 -04:00
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: Michal Michalik <michal.michalik@intel.com> Signed-off-by: Michal Michalik <michal.michalik@intel.com> Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com> Signed-off-by: Karol Kolacinski <karol.kolacinski@intel.com> Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@intel.com> (A Contingent worker at Intel) Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
This commit is contained in:
committed by
Tony Nguyen
parent
954fb2d2d4
commit
00d5000144
@@ -518,7 +518,6 @@ enum ice_pf_flags {
|
||||
};
|
||||
|
||||
enum ice_misc_thread_tasks {
|
||||
ICE_MISC_THREAD_EXTTS_EVENT,
|
||||
ICE_MISC_THREAD_TX_TSTAMP,
|
||||
ICE_MISC_THREAD_NBITS /* must be last */
|
||||
};
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
struct ice_pf *pf = (struct ice_pf *)data;
|
||||
irqreturn_t ret = IRQ_HANDLED;
|
||||
struct ice_hw *hw = &pf->hw;
|
||||
struct device *dev;
|
||||
u32 oicr, ena_mask;
|
||||
@@ -3165,8 +3166,10 @@ static irqreturn_t ice_misc_intr(int __always_unused irq, void *data)
|
||||
|
||||
if (oicr & 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);
|
||||
ret = IRQ_WAKE_THREAD;
|
||||
}
|
||||
}
|
||||
|
||||
if (oicr & PFINT_OICR_TSYN_EVNT_M) {
|
||||
@@ -3182,7 +3185,7 @@ static irqreturn_t ice_misc_intr(int __always_unused irq, void *data)
|
||||
GLTSYN_STAT_EVENT1_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)
|
||||
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)
|
||||
hw = &pf->hw;
|
||||
|
||||
if (ice_is_reset_in_progress(pf->state))
|
||||
return IRQ_HANDLED;
|
||||
|
||||
ice_service_task_schedule(pf);
|
||||
|
||||
if (test_and_clear_bit(ICE_MISC_THREAD_EXTTS_EVENT, pf->misc_thread))
|
||||
ice_ptp_extts_event(pf);
|
||||
goto skip_irq;
|
||||
|
||||
if (test_and_clear_bit(ICE_MISC_THREAD_TX_TSTAMP, pf->misc_thread)) {
|
||||
/* 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)
|
||||
}
|
||||
}
|
||||
|
||||
skip_irq:
|
||||
ice_irq_dynamic_ena(hw, NULL, NULL);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
|
||||
Reference in New Issue
Block a user