@@ -1037,6 +1037,32 @@ static bool i40e_set_new_dynamic_itr(struct i40e_ring_container *rc)
1037
1037
return false;
1038
1038
}
1039
1039
1040
+ /**
1041
+ * i40e_reuse_rx_page - page flip buffer and store it back on the ring
1042
+ * @rx_ring: rx descriptor ring to store buffers on
1043
+ * @old_buff: donor buffer to have page reused
1044
+ *
1045
+ * Synchronizes page for reuse by the adapter
1046
+ **/
1047
+ static void i40e_reuse_rx_page (struct i40e_ring * rx_ring ,
1048
+ struct i40e_rx_buffer * old_buff )
1049
+ {
1050
+ struct i40e_rx_buffer * new_buff ;
1051
+ u16 nta = rx_ring -> next_to_alloc ;
1052
+
1053
+ new_buff = & rx_ring -> rx_bi [nta ];
1054
+
1055
+ /* update, and store next to alloc */
1056
+ nta ++ ;
1057
+ rx_ring -> next_to_alloc = (nta < rx_ring -> count ) ? nta : 0 ;
1058
+
1059
+ /* transfer page from old buffer to new buffer */
1060
+ new_buff -> dma = old_buff -> dma ;
1061
+ new_buff -> page = old_buff -> page ;
1062
+ new_buff -> page_offset = old_buff -> page_offset ;
1063
+ new_buff -> pagecnt_bias = old_buff -> pagecnt_bias ;
1064
+ }
1065
+
1040
1066
/**
1041
1067
* i40e_rx_is_programming_status - check for programming status descriptor
1042
1068
* @qw: qword representing status_error_len in CPU ordering
@@ -1071,15 +1097,24 @@ static void i40e_clean_programming_status(struct i40e_ring *rx_ring,
1071
1097
union i40e_rx_desc * rx_desc ,
1072
1098
u64 qw )
1073
1099
{
1074
- u32 ntc = rx_ring -> next_to_clean + 1 ;
1100
+ struct i40e_rx_buffer * rx_buffer ;
1101
+ u32 ntc = rx_ring -> next_to_clean ;
1075
1102
u8 id ;
1076
1103
1077
1104
/* fetch, update, and store next to clean */
1105
+ rx_buffer = & rx_ring -> rx_bi [ntc ++ ];
1078
1106
ntc = (ntc < rx_ring -> count ) ? ntc : 0 ;
1079
1107
rx_ring -> next_to_clean = ntc ;
1080
1108
1081
1109
prefetch (I40E_RX_DESC (rx_ring , ntc ));
1082
1110
1111
+ /* place unused page back on the ring */
1112
+ i40e_reuse_rx_page (rx_ring , rx_buffer );
1113
+ rx_ring -> rx_stats .page_reuse_count ++ ;
1114
+
1115
+ /* clear contents of buffer_info */
1116
+ rx_buffer -> page = NULL ;
1117
+
1083
1118
id = (qw & I40E_RX_PROG_STATUS_DESC_QW1_PROGID_MASK ) >>
1084
1119
I40E_RX_PROG_STATUS_DESC_QW1_PROGID_SHIFT ;
1085
1120
@@ -1638,32 +1673,6 @@ static bool i40e_cleanup_headers(struct i40e_ring *rx_ring, struct sk_buff *skb,
1638
1673
return false;
1639
1674
}
1640
1675
1641
- /**
1642
- * i40e_reuse_rx_page - page flip buffer and store it back on the ring
1643
- * @rx_ring: rx descriptor ring to store buffers on
1644
- * @old_buff: donor buffer to have page reused
1645
- *
1646
- * Synchronizes page for reuse by the adapter
1647
- **/
1648
- static void i40e_reuse_rx_page (struct i40e_ring * rx_ring ,
1649
- struct i40e_rx_buffer * old_buff )
1650
- {
1651
- struct i40e_rx_buffer * new_buff ;
1652
- u16 nta = rx_ring -> next_to_alloc ;
1653
-
1654
- new_buff = & rx_ring -> rx_bi [nta ];
1655
-
1656
- /* update, and store next to alloc */
1657
- nta ++ ;
1658
- rx_ring -> next_to_alloc = (nta < rx_ring -> count ) ? nta : 0 ;
1659
-
1660
- /* transfer page from old buffer to new buffer */
1661
- new_buff -> dma = old_buff -> dma ;
1662
- new_buff -> page = old_buff -> page ;
1663
- new_buff -> page_offset = old_buff -> page_offset ;
1664
- new_buff -> pagecnt_bias = old_buff -> pagecnt_bias ;
1665
- }
1666
-
1667
1676
/**
1668
1677
* i40e_page_is_reusable - check if any reuse is possible
1669
1678
* @page: page struct to check
0 commit comments