Commit 21536717 authored by Shannon Nelson's avatar Shannon Nelson Committed by Jeff Kirsher

i40e: don't do link_status or stats collection on every ARQ

The ARQ events cause a service_task execution, and we do a link_status
check and full stats gathering for each service_task.  However, when
there are a lot of ARQ events, such as when doing an NVM update, we end up
doing 10's if not 100's of these per second, thereby heavily abusing the
PCI bus and especially the Firmware.  This patch adds a check to keep the
service_task from running these periodic tasks more than once per second,
while still allowing quick action to service the events.

Change-ID: Iec7670c37bfae9791c43fec26df48aea7f70b33e
Signed-off-by: default avatarShannon Nelson <shannon.nelson@intel.com>
Signed-off-by: default avatarPatrick Lu <patrick.lu@intel.com>
Tested-by: default avatarJim Young <jamesx.m.young@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent 0db4e162
...@@ -269,7 +269,8 @@ struct i40e_pf { ...@@ -269,7 +269,8 @@ struct i40e_pf {
u16 msg_enable; u16 msg_enable;
char misc_int_name[IFNAMSIZ + 9]; char misc_int_name[IFNAMSIZ + 9];
u16 adminq_work_limit; /* num of admin receive queue desc to process */ u16 adminq_work_limit; /* num of admin receive queue desc to process */
int service_timer_period; unsigned long service_timer_period;
unsigned long service_timer_previous;
struct timer_list service_timer; struct timer_list service_timer;
struct work_struct service_task; struct work_struct service_task;
......
...@@ -5449,7 +5449,7 @@ static void i40e_check_hang_subtask(struct i40e_pf *pf) ...@@ -5449,7 +5449,7 @@ static void i40e_check_hang_subtask(struct i40e_pf *pf)
} }
/** /**
* i40e_watchdog_subtask - Check and bring link up * i40e_watchdog_subtask - periodic checks not using event driven response
* @pf: board private structure * @pf: board private structure
**/ **/
static void i40e_watchdog_subtask(struct i40e_pf *pf) static void i40e_watchdog_subtask(struct i40e_pf *pf)
...@@ -5461,6 +5461,15 @@ static void i40e_watchdog_subtask(struct i40e_pf *pf) ...@@ -5461,6 +5461,15 @@ static void i40e_watchdog_subtask(struct i40e_pf *pf)
test_bit(__I40E_CONFIG_BUSY, &pf->state)) test_bit(__I40E_CONFIG_BUSY, &pf->state))
return; return;
/* make sure we don't do these things too often */
if (time_before(jiffies, (pf->service_timer_previous +
pf->service_timer_period)))
return;
pf->service_timer_previous = jiffies;
i40e_check_hang_subtask(pf);
i40e_link_event(pf);
/* Update the stats for active netdevs so the network stack /* Update the stats for active netdevs so the network stack
* can look at updated numbers whenever it cares to * can look at updated numbers whenever it cares to
*/ */
...@@ -6325,15 +6334,12 @@ static void i40e_service_task(struct work_struct *work) ...@@ -6325,15 +6334,12 @@ static void i40e_service_task(struct work_struct *work)
i40e_vc_process_vflr_event(pf); i40e_vc_process_vflr_event(pf);
i40e_watchdog_subtask(pf); i40e_watchdog_subtask(pf);
i40e_fdir_reinit_subtask(pf); i40e_fdir_reinit_subtask(pf);
i40e_check_hang_subtask(pf);
i40e_sync_filters_subtask(pf); i40e_sync_filters_subtask(pf);
#ifdef CONFIG_I40E_VXLAN #ifdef CONFIG_I40E_VXLAN
i40e_sync_vxlan_filters_subtask(pf); i40e_sync_vxlan_filters_subtask(pf);
#endif #endif
i40e_clean_adminq_subtask(pf); i40e_clean_adminq_subtask(pf);
i40e_link_event(pf);
i40e_service_event_complete(pf); i40e_service_event_complete(pf);
/* If the tasks have taken longer than one timer cycle or there /* If the tasks have taken longer than one timer cycle or there
......
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