mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-04 00:06:36 +00:00
ice: port fix for chk_linearlize
This is a port of commit 248de22e63
("i40e/i40evf: Account for frags
split over multiple descriptors in check linearize")
As part of testing workloads (read/write) using larger IO size (128K)
tx_timeout is observed and whenever it happens, it was due to
tx_linearize.
Signed-off-by: Kiran Patil <kiran.patil@intel.com>
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
This commit is contained in:
parent
f34f55557a
commit
0a37abfa01
1 changed files with 23 additions and 3 deletions
|
@ -2292,10 +2292,30 @@ static bool __ice_chk_linearize(struct sk_buff *skb)
|
|||
/* Walk through fragments adding latest fragment, testing it, and
|
||||
* then removing stale fragments from the sum.
|
||||
*/
|
||||
stale = &skb_shinfo(skb)->frags[0];
|
||||
for (;;) {
|
||||
for (stale = &skb_shinfo(skb)->frags[0];; stale++) {
|
||||
int stale_size = skb_frag_size(stale);
|
||||
|
||||
sum += skb_frag_size(frag++);
|
||||
|
||||
/* The stale fragment may present us with a smaller
|
||||
* descriptor than the actual fragment size. To account
|
||||
* for that we need to remove all the data on the front and
|
||||
* figure out what the remainder would be in the last
|
||||
* descriptor associated with the fragment.
|
||||
*/
|
||||
if (stale_size > ICE_MAX_DATA_PER_TXD) {
|
||||
int align_pad = -(skb_frag_off(stale)) &
|
||||
(ICE_MAX_READ_REQ_SIZE - 1);
|
||||
|
||||
sum -= align_pad;
|
||||
stale_size -= align_pad;
|
||||
|
||||
do {
|
||||
sum -= ICE_MAX_DATA_PER_TXD_ALIGNED;
|
||||
stale_size -= ICE_MAX_DATA_PER_TXD_ALIGNED;
|
||||
} while (stale_size > ICE_MAX_DATA_PER_TXD);
|
||||
}
|
||||
|
||||
/* if sum is negative we failed to make sufficient progress */
|
||||
if (sum < 0)
|
||||
return true;
|
||||
|
@ -2303,7 +2323,7 @@ static bool __ice_chk_linearize(struct sk_buff *skb)
|
|||
if (!nr_frags--)
|
||||
break;
|
||||
|
||||
sum -= skb_frag_size(stale++);
|
||||
sum -= stale_size;
|
||||
}
|
||||
|
||||
return false;
|
||||
|
|
Loading…
Add table
Reference in a new issue