Message ID | 20180723231348.14838-14-anirudh.venkataramanan@intel.com |
---|---|
State | Superseded |
Delegated to: | Jeff Kirsher |
Headers | show |
Series | Feature updates for ice | expand |
ACK > -----Original Message----- > From: Venkataramanan, Anirudh > Sent: Monday, July 23, 2018 4:14 PM > To: intel-wired-lan@lists.osuosl.org > Cc: Abodunrin, Akeem G <akeem.g.abodunrin@intel.com> > Subject: [PATCH 13/13] ice: Introduce SERVICE_DIS flag and service routine > functions > > From: Akeem G Abodunrin <akeem.g.abodunrin@intel.com> > > This patch introduces SERVICE_DIS flag to use for stopping service task. > This flag will be checked before scheduling new tasks. Also add new functions > ice_service_task_stop to stop service task. > > Signed-off-by: Akeem G Abodunrin <akeem.g.abodunrin@intel.com> > Signed-off-by: Anirudh Venkataramanan <anirudh.venkataramanan@intel.com> > --- > drivers/net/ethernet/intel/ice/ice.h | 1 + > drivers/net/ethernet/intel/ice/ice_main.c | 34 ++++++++++++++++++++++++---- > --- > 2 files changed, 28 insertions(+), 7 deletions(-) > > diff --git a/drivers/net/ethernet/intel/ice/ice.h > b/drivers/net/ethernet/intel/ice/ice.h > index 6f44a850c4b2..9cf233d085d8 100644 > --- a/drivers/net/ethernet/intel/ice/ice.h > +++ b/drivers/net/ethernet/intel/ice/ice.h > @@ -138,6 +138,7 @@ enum ice_state { > __ICE_FLTR_OVERFLOW_PROMISC, > __ICE_CFG_BUSY, > __ICE_SERVICE_SCHED, > + __ICE_SERVICE_DIS, > __ICE_STATE_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 cb1145515f98..3a77812e4be7 100644 > --- a/drivers/net/ethernet/intel/ice/ice_main.c > +++ b/drivers/net/ethernet/intel/ice/ice_main.c > @@ -1107,7 +1107,7 @@ static void ice_clean_adminq_subtask(struct ice_pf > *pf) > */ > static void ice_service_task_schedule(struct ice_pf *pf) { > - if (!test_bit(__ICE_DOWN, pf->state) && > + if (!test_bit(__ICE_SERVICE_DIS, pf->state) && > !test_and_set_bit(__ICE_SERVICE_SCHED, pf->state) && > !test_bit(__ICE_NEEDS_RESTART, pf->state)) > queue_work(ice_wq, &pf->serv_task); > @@ -1126,6 +1126,22 @@ static void ice_service_task_complete(struct ice_pf > *pf) > clear_bit(__ICE_SERVICE_SCHED, pf->state); } > > +/** > + * ice_service_task_stop - stop service task and cancel works > + * @pf: board private structure > + */ > +static void ice_service_task_stop(struct ice_pf *pf) { > + set_bit(__ICE_SERVICE_DIS, pf->state); > + > + if (pf->serv_tmr.function) > + del_timer_sync(&pf->serv_tmr); > + if (pf->serv_task.func) > + cancel_work_sync(&pf->serv_task); > + > + clear_bit(__ICE_SERVICE_SCHED, pf->state); } > + > /** > * ice_service_timer - timer callback to schedule service task > * @t: pointer to timer_list > @@ -3391,10 +3407,7 @@ static void ice_determine_q_usage(struct ice_pf *pf) > */ > static void ice_deinit_pf(struct ice_pf *pf) { > - if (pf->serv_tmr.function) > - del_timer_sync(&pf->serv_tmr); > - if (pf->serv_task.func) > - cancel_work_sync(&pf->serv_task); > + ice_service_task_stop(pf); > mutex_destroy(&pf->sw_mutex); > mutex_destroy(&pf->avail_q_mutex); > } > @@ -3601,6 +3614,8 @@ static int ice_probe(struct pci_dev *pdev, > pf->pdev = pdev; > pci_set_drvdata(pdev, pf); > set_bit(__ICE_DOWN, pf->state); > + /* Disable service task until DOWN bit is cleared */ > + set_bit(__ICE_SERVICE_DIS, pf->state); > > hw = &pf->hw; > hw->hw_addr = pcim_iomap_table(pdev)[ICE_BAR0]; @@ -3658,6 > +3673,9 @@ static int ice_probe(struct pci_dev *pdev, > goto err_init_interrupt_unroll; > } > > + /* Driver is mostly up */ > + clear_bit(__ICE_DOWN, pf->state); > + > /* In case of MSIX we are going to setup the misc vector right here > * to handle admin queue events etc. In case of legacy and MSI > * the misc functionality and queue processing is combined in @@ - > 3697,8 +3715,7 @@ static int ice_probe(struct pci_dev *pdev, > goto err_alloc_sw_unroll; > } > > - /* Driver is mostly up */ > - clear_bit(__ICE_DOWN, pf->state); > + clear_bit(__ICE_SERVICE_DIS, pf->state); > > /* since everything is good, start the service timer */ > mod_timer(&pf->serv_tmr, round_jiffies(jiffies + pf->serv_tmr_period)); > @@ -3712,6 +3729,7 @@ static int ice_probe(struct pci_dev *pdev, > return 0; > > err_alloc_sw_unroll: > + set_bit(__ICE_SERVICE_DIS, pf->state); > set_bit(__ICE_DOWN, pf->state); > devm_kfree(&pf->pdev->dev, pf->first_sw); > err_msix_misc_unroll: > @@ -3739,6 +3757,7 @@ static void ice_remove(struct pci_dev *pdev) > return; > > set_bit(__ICE_DOWN, pf->state); > + ice_service_task_stop(pf); > > ice_vsi_release_all(pf); > ice_free_irq_msix_misc(pf); > @@ -6003,6 +6022,7 @@ static void ice_tx_timeout(struct net_device *netdev) > netdev_err(netdev, "tx_timeout recovery unsuccessful, device is > in unrecoverable state.\n"); > set_bit(__ICE_DOWN, pf->state); > set_bit(__ICE_NEEDS_RESTART, vsi->state); > + set_bit(__ICE_SERVICE_DIS, pf->state); > break; > } > > -- > 2.14.3
diff --git a/drivers/net/ethernet/intel/ice/ice.h b/drivers/net/ethernet/intel/ice/ice.h index 6f44a850c4b2..9cf233d085d8 100644 --- a/drivers/net/ethernet/intel/ice/ice.h +++ b/drivers/net/ethernet/intel/ice/ice.h @@ -138,6 +138,7 @@ enum ice_state { __ICE_FLTR_OVERFLOW_PROMISC, __ICE_CFG_BUSY, __ICE_SERVICE_SCHED, + __ICE_SERVICE_DIS, __ICE_STATE_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 cb1145515f98..3a77812e4be7 100644 --- a/drivers/net/ethernet/intel/ice/ice_main.c +++ b/drivers/net/ethernet/intel/ice/ice_main.c @@ -1107,7 +1107,7 @@ static void ice_clean_adminq_subtask(struct ice_pf *pf) */ static void ice_service_task_schedule(struct ice_pf *pf) { - if (!test_bit(__ICE_DOWN, pf->state) && + if (!test_bit(__ICE_SERVICE_DIS, pf->state) && !test_and_set_bit(__ICE_SERVICE_SCHED, pf->state) && !test_bit(__ICE_NEEDS_RESTART, pf->state)) queue_work(ice_wq, &pf->serv_task); @@ -1126,6 +1126,22 @@ static void ice_service_task_complete(struct ice_pf *pf) clear_bit(__ICE_SERVICE_SCHED, pf->state); } +/** + * ice_service_task_stop - stop service task and cancel works + * @pf: board private structure + */ +static void ice_service_task_stop(struct ice_pf *pf) +{ + set_bit(__ICE_SERVICE_DIS, pf->state); + + if (pf->serv_tmr.function) + del_timer_sync(&pf->serv_tmr); + if (pf->serv_task.func) + cancel_work_sync(&pf->serv_task); + + clear_bit(__ICE_SERVICE_SCHED, pf->state); +} + /** * ice_service_timer - timer callback to schedule service task * @t: pointer to timer_list @@ -3391,10 +3407,7 @@ static void ice_determine_q_usage(struct ice_pf *pf) */ static void ice_deinit_pf(struct ice_pf *pf) { - if (pf->serv_tmr.function) - del_timer_sync(&pf->serv_tmr); - if (pf->serv_task.func) - cancel_work_sync(&pf->serv_task); + ice_service_task_stop(pf); mutex_destroy(&pf->sw_mutex); mutex_destroy(&pf->avail_q_mutex); } @@ -3601,6 +3614,8 @@ static int ice_probe(struct pci_dev *pdev, pf->pdev = pdev; pci_set_drvdata(pdev, pf); set_bit(__ICE_DOWN, pf->state); + /* Disable service task until DOWN bit is cleared */ + set_bit(__ICE_SERVICE_DIS, pf->state); hw = &pf->hw; hw->hw_addr = pcim_iomap_table(pdev)[ICE_BAR0]; @@ -3658,6 +3673,9 @@ static int ice_probe(struct pci_dev *pdev, goto err_init_interrupt_unroll; } + /* Driver is mostly up */ + clear_bit(__ICE_DOWN, pf->state); + /* In case of MSIX we are going to setup the misc vector right here * to handle admin queue events etc. In case of legacy and MSI * the misc functionality and queue processing is combined in @@ -3697,8 +3715,7 @@ static int ice_probe(struct pci_dev *pdev, goto err_alloc_sw_unroll; } - /* Driver is mostly up */ - clear_bit(__ICE_DOWN, pf->state); + clear_bit(__ICE_SERVICE_DIS, pf->state); /* since everything is good, start the service timer */ mod_timer(&pf->serv_tmr, round_jiffies(jiffies + pf->serv_tmr_period)); @@ -3712,6 +3729,7 @@ static int ice_probe(struct pci_dev *pdev, return 0; err_alloc_sw_unroll: + set_bit(__ICE_SERVICE_DIS, pf->state); set_bit(__ICE_DOWN, pf->state); devm_kfree(&pf->pdev->dev, pf->first_sw); err_msix_misc_unroll: @@ -3739,6 +3757,7 @@ static void ice_remove(struct pci_dev *pdev) return; set_bit(__ICE_DOWN, pf->state); + ice_service_task_stop(pf); ice_vsi_release_all(pf); ice_free_irq_msix_misc(pf); @@ -6003,6 +6022,7 @@ static void ice_tx_timeout(struct net_device *netdev) netdev_err(netdev, "tx_timeout recovery unsuccessful, device is in unrecoverable state.\n"); set_bit(__ICE_DOWN, pf->state); set_bit(__ICE_NEEDS_RESTART, vsi->state); + set_bit(__ICE_SERVICE_DIS, pf->state); break; }