Skip to content

Commit 1295738

Browse files
anjalisinghai1Jeff Kirsher
authored andcommitted
i40e: Fix the FD sideband logic to detect a FD table full condition
Hardware does not have a way of telling a PF how much of the global shared FD table space is still available or is consumed. Previously, every PF but PF0 would think there was still space available when there wasn't. The PFs would continue to try to add filters and fail. With this new logic if a filter programming error is detected we just check if we are close to the guaranteed space full and that can be used as a hint to say, there might not be space and we should turn off the features. This way we can turn off the feature in SW for all PFs in time. Change-ID: I725cb2fab16c033f883056362b4542c1400503c5 Signed-off-by: Anjali Singhai Jain <[email protected]> Signed-off-by: Jeff Kirsher <[email protected]>
1 parent 12be846 commit 1295738

File tree

3 files changed

+20
-7
lines changed

3 files changed

+20
-7
lines changed

drivers/net/ethernet/intel/i40e/i40e.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ struct i40e_lump_tracking {
154154
#define I40E_DEFAULT_ATR_SAMPLE_RATE 20
155155
#define I40E_FDIR_MAX_RAW_PACKET_SIZE 512
156156
#define I40E_FDIR_BUFFER_FULL_MARGIN 10
157-
#define I40E_FDIR_BUFFER_HEAD_ROOM 200
157+
#define I40E_FDIR_BUFFER_HEAD_ROOM 32
158158

159159
enum i40e_fd_stat_idx {
160160
I40E_FD_STAT_ATR,
@@ -582,6 +582,7 @@ int i40e_add_del_fdir(struct i40e_vsi *vsi,
582582
struct i40e_fdir_filter *input, bool add);
583583
void i40e_fdir_check_and_reenable(struct i40e_pf *pf);
584584
int i40e_get_current_fd_count(struct i40e_pf *pf);
585+
int i40e_get_cur_guaranteed_fd_count(struct i40e_pf *pf);
585586
bool i40e_set_ntuple(struct i40e_pf *pf, netdev_features_t features);
586587
void i40e_set_ethtool_ops(struct net_device *netdev);
587588
struct i40e_mac_filter *i40e_add_filter(struct i40e_vsi *vsi,

drivers/net/ethernet/intel/i40e/i40e_main.c

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4944,7 +4944,20 @@ static void i40e_service_event_complete(struct i40e_pf *pf)
49444944
}
49454945

49464946
/**
4947-
* i40e_get_current_fd_count - Get the count of FD filters programmed in the HW
4947+
* i40e_get_cur_guaranteed_fd_count - Get the consumed guaranteed FD filters
4948+
* @pf: board private structure
4949+
**/
4950+
int i40e_get_cur_guaranteed_fd_count(struct i40e_pf *pf)
4951+
{
4952+
int val, fcnt_prog;
4953+
4954+
val = rd32(&pf->hw, I40E_PFQF_FDSTAT);
4955+
fcnt_prog = (val & I40E_PFQF_FDSTAT_GUARANT_CNT_MASK);
4956+
return fcnt_prog;
4957+
}
4958+
4959+
/**
4960+
* i40e_get_current_fd_count - Get the count of total FD filters programmed
49484961
* @pf: board private structure
49494962
**/
49504963
int i40e_get_current_fd_count(struct i40e_pf *pf)
@@ -4956,7 +4969,6 @@ int i40e_get_current_fd_count(struct i40e_pf *pf)
49564969
I40E_PFQF_FDSTAT_BEST_CNT_SHIFT);
49574970
return fcnt_prog;
49584971
}
4959-
49604972
/**
49614973
* i40e_fdir_check_and_reenable - Function to reenabe FD ATR or SB if disabled
49624974
* @pf: board private structure
@@ -4971,8 +4983,8 @@ void i40e_fdir_check_and_reenable(struct i40e_pf *pf)
49714983
if ((pf->flags & I40E_FLAG_FD_ATR_ENABLED) &&
49724984
(pf->flags & I40E_FLAG_FD_SB_ENABLED))
49734985
return;
4974-
fcnt_prog = i40e_get_current_fd_count(pf);
4975-
fcnt_avail = i40e_get_fd_cnt_all(pf);
4986+
fcnt_prog = i40e_get_cur_guaranteed_fd_count(pf);
4987+
fcnt_avail = pf->fdir_pf_filter_count;
49764988
if (fcnt_prog < (fcnt_avail - I40E_FDIR_BUFFER_HEAD_ROOM)) {
49774989
if ((pf->flags & I40E_FLAG_FD_SB_ENABLED) &&
49784990
(pf->auto_disable_flags & I40E_FLAG_FD_SB_ENABLED)) {

drivers/net/ethernet/intel/i40e/i40e_txrx.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -437,8 +437,8 @@ static void i40e_fd_handle_status(struct i40e_ring *rx_ring,
437437
rx_desc->wb.qword0.hi_dword.fd_id);
438438

439439
/* filter programming failed most likely due to table full */
440-
fcnt_prog = i40e_get_current_fd_count(pf);
441-
fcnt_avail = i40e_get_fd_cnt_all(pf);
440+
fcnt_prog = i40e_get_cur_guaranteed_fd_count(pf);
441+
fcnt_avail = pf->fdir_pf_filter_count;
442442
/* If ATR is running fcnt_prog can quickly change,
443443
* if we are very close to full, it makes sense to disable
444444
* FD ATR/SB and then re-enable it when there is room.

0 commit comments

Comments
 (0)