Message ID | 20231124114155.251360-1-karol.kolacinski@intel.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [iwl-next,1/2] ice: Schedule service task in IRQ top half | expand |
Context | Check | Description |
---|---|---|
netdev/tree_selection | success | Guessing tree name failed - patch did not apply |
On 11/24/23 12:41, Karol Kolacinski wrote: > 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> > Signed-off-by: Karol Kolacinski <karol.kolacinski@intel.com> > --- > drivers/net/ethernet/intel/ice/ice.h | 1 - > drivers/net/ethernet/intel/ice/ice_main.c | 18 ++++++++++-------- > 2 files changed, 10 insertions(+), 9 deletions(-) > Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
On Fri, Nov 24, 2023 at 12:41:54PM +0100, Karol Kolacinski wrote: > 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> > Signed-off-by: Karol Kolacinski <karol.kolacinski@intel.com> > --- > drivers/net/ethernet/intel/ice/ice.h | 1 - > drivers/net/ethernet/intel/ice/ice_main.c | 18 ++++++++++-------- > 2 files changed, 10 insertions(+), 9 deletions(-) > > diff --git a/drivers/net/ethernet/intel/ice/ice.h b/drivers/net/ethernet/intel/ice/ice.h > index 3ea33947b878..d5a8da0c02c3 100644 > --- a/drivers/net/ethernet/intel/ice/ice.h > +++ b/drivers/net/ethernet/intel/ice/ice.h > @@ -517,7 +517,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 */ > }; > diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c > index 1f159b4362ec..6b91ec6f420d 100644 > --- a/drivers/net/ethernet/intel/ice/ice_main.c > +++ b/drivers/net/ethernet/intel/ice/ice_main.c > @@ -3078,6 +3078,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; > @@ -3161,6 +3162,8 @@ static irqreturn_t ice_misc_intr(int __always_unused irq, void *data) > ena_mask &= ~PFINT_OICR_TSYN_TX_M; > if (ice_ptp_pf_handles_tx_interrupt(pf)) Hi Karol, it seems that a trailing '{' is missing from the line above. > set_bit(ICE_MISC_THREAD_TX_TSTAMP, pf->misc_thread); > + ret = IRQ_WAKE_THREAD; > + } > } > > if (oicr & PFINT_OICR_TSYN_EVNT_M) { ...
diff --git a/drivers/net/ethernet/intel/ice/ice.h b/drivers/net/ethernet/intel/ice/ice.h index 3ea33947b878..d5a8da0c02c3 100644 --- a/drivers/net/ethernet/intel/ice/ice.h +++ b/drivers/net/ethernet/intel/ice/ice.h @@ -517,7 +517,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 */ }; diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c index 1f159b4362ec..6b91ec6f420d 100644 --- a/drivers/net/ethernet/intel/ice/ice_main.c +++ b/drivers/net/ethernet/intel/ice/ice_main.c @@ -3078,6 +3078,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; @@ -3161,6 +3162,8 @@ static irqreturn_t ice_misc_intr(int __always_unused irq, void *data) ena_mask &= ~PFINT_OICR_TSYN_TX_M; 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) { @@ -3176,7 +3179,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); } } @@ -3199,8 +3202,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; } /** @@ -3216,12 +3222,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, @@ -3233,6 +3234,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;