ixgbe: cleanup use of ixgbe_rsc_count and RSC_CB
This change cleans up the use of rsc_count and changes it to a boolean since the actual numerical value is used nowhere in the Rx cleanup path. I am also moving the skb count into the RSC_CB path since it is much easier to track it there than when it is passed as a parameter to various function calls. Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com> Tested-by: Ross Brattain <ross.b.brattain@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
parent
ee9e0f0b40
commit
aa80175a53
@ -467,6 +467,13 @@ enum ixbge_state_t {
|
|||||||
__IXGBE_SFP_MODULE_NOT_FOUND
|
__IXGBE_SFP_MODULE_NOT_FOUND
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct ixgbe_rsc_cb {
|
||||||
|
dma_addr_t dma;
|
||||||
|
u16 skb_cnt;
|
||||||
|
bool delay_unmap;
|
||||||
|
};
|
||||||
|
#define IXGBE_RSC_CB(skb) ((struct ixgbe_rsc_cb *)(skb)->cb)
|
||||||
|
|
||||||
enum ixgbe_boards {
|
enum ixgbe_boards {
|
||||||
board_82598,
|
board_82598,
|
||||||
board_82599,
|
board_82599,
|
||||||
|
@ -1142,33 +1142,25 @@ static inline u16 ixgbe_get_hlen(union ixgbe_adv_rx_desc *rx_desc)
|
|||||||
return hlen;
|
return hlen;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline u32 ixgbe_get_rsc_count(union ixgbe_adv_rx_desc *rx_desc)
|
|
||||||
{
|
|
||||||
return (le32_to_cpu(rx_desc->wb.lower.lo_dword.data) &
|
|
||||||
IXGBE_RXDADV_RSCCNT_MASK) >>
|
|
||||||
IXGBE_RXDADV_RSCCNT_SHIFT;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ixgbe_transform_rsc_queue - change rsc queue into a full packet
|
* ixgbe_transform_rsc_queue - change rsc queue into a full packet
|
||||||
* @skb: pointer to the last skb in the rsc queue
|
* @skb: pointer to the last skb in the rsc queue
|
||||||
* @count: pointer to number of packets coalesced in this context
|
|
||||||
*
|
*
|
||||||
* This function changes a queue full of hw rsc buffers into a completed
|
* This function changes a queue full of hw rsc buffers into a completed
|
||||||
* packet. It uses the ->prev pointers to find the first packet and then
|
* packet. It uses the ->prev pointers to find the first packet and then
|
||||||
* turns it into the frag list owner.
|
* turns it into the frag list owner.
|
||||||
**/
|
**/
|
||||||
static inline struct sk_buff *ixgbe_transform_rsc_queue(struct sk_buff *skb,
|
static inline struct sk_buff *ixgbe_transform_rsc_queue(struct sk_buff *skb)
|
||||||
u64 *count)
|
|
||||||
{
|
{
|
||||||
unsigned int frag_list_size = 0;
|
unsigned int frag_list_size = 0;
|
||||||
|
unsigned int skb_cnt = 1;
|
||||||
|
|
||||||
while (skb->prev) {
|
while (skb->prev) {
|
||||||
struct sk_buff *prev = skb->prev;
|
struct sk_buff *prev = skb->prev;
|
||||||
frag_list_size += skb->len;
|
frag_list_size += skb->len;
|
||||||
skb->prev = NULL;
|
skb->prev = NULL;
|
||||||
skb = prev;
|
skb = prev;
|
||||||
*count += 1;
|
skb_cnt++;
|
||||||
}
|
}
|
||||||
|
|
||||||
skb_shinfo(skb)->frag_list = skb->next;
|
skb_shinfo(skb)->frag_list = skb->next;
|
||||||
@ -1176,15 +1168,16 @@ static inline struct sk_buff *ixgbe_transform_rsc_queue(struct sk_buff *skb,
|
|||||||
skb->len += frag_list_size;
|
skb->len += frag_list_size;
|
||||||
skb->data_len += frag_list_size;
|
skb->data_len += frag_list_size;
|
||||||
skb->truesize += frag_list_size;
|
skb->truesize += frag_list_size;
|
||||||
|
IXGBE_RSC_CB(skb)->skb_cnt = skb_cnt;
|
||||||
|
|
||||||
return skb;
|
return skb;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ixgbe_rsc_cb {
|
static inline bool ixgbe_get_rsc_state(union ixgbe_adv_rx_desc *rx_desc)
|
||||||
dma_addr_t dma;
|
{
|
||||||
bool delay_unmap;
|
return !!(le32_to_cpu(rx_desc->wb.lower.lo_dword.data) &
|
||||||
};
|
IXGBE_RXDADV_RSCCNT_MASK);
|
||||||
|
}
|
||||||
#define IXGBE_RSC_CB(skb) ((struct ixgbe_rsc_cb *)(skb)->cb)
|
|
||||||
|
|
||||||
static void ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
|
static void ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
|
||||||
struct ixgbe_ring *rx_ring,
|
struct ixgbe_ring *rx_ring,
|
||||||
@ -1196,13 +1189,13 @@ static void ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
|
|||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
unsigned int total_rx_bytes = 0, total_rx_packets = 0;
|
unsigned int total_rx_bytes = 0, total_rx_packets = 0;
|
||||||
const int current_node = numa_node_id();
|
const int current_node = numa_node_id();
|
||||||
unsigned int rsc_count = 0;
|
|
||||||
#ifdef IXGBE_FCOE
|
#ifdef IXGBE_FCOE
|
||||||
int ddp_bytes = 0;
|
int ddp_bytes = 0;
|
||||||
#endif /* IXGBE_FCOE */
|
#endif /* IXGBE_FCOE */
|
||||||
u32 staterr;
|
u32 staterr;
|
||||||
u16 i;
|
u16 i;
|
||||||
u16 cleaned_count = 0;
|
u16 cleaned_count = 0;
|
||||||
|
bool pkt_is_rsc = false;
|
||||||
|
|
||||||
i = rx_ring->next_to_clean;
|
i = rx_ring->next_to_clean;
|
||||||
rx_desc = IXGBE_RX_DESC_ADV(rx_ring, i);
|
rx_desc = IXGBE_RX_DESC_ADV(rx_ring, i);
|
||||||
@ -1220,12 +1213,12 @@ static void ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
|
|||||||
prefetch(skb->data);
|
prefetch(skb->data);
|
||||||
|
|
||||||
if (ring_is_rsc_enabled(rx_ring))
|
if (ring_is_rsc_enabled(rx_ring))
|
||||||
rsc_count = ixgbe_get_rsc_count(rx_desc);
|
pkt_is_rsc = ixgbe_get_rsc_state(rx_desc);
|
||||||
|
|
||||||
/* if this is a skb from previous receive DMA will be 0 */
|
/* if this is a skb from previous receive DMA will be 0 */
|
||||||
if (rx_buffer_info->dma) {
|
if (rx_buffer_info->dma) {
|
||||||
u16 hlen;
|
u16 hlen;
|
||||||
if (rsc_count &&
|
if (pkt_is_rsc &&
|
||||||
!(staterr & IXGBE_RXD_STAT_EOP) &&
|
!(staterr & IXGBE_RXD_STAT_EOP) &&
|
||||||
!skb->prev) {
|
!skb->prev) {
|
||||||
/*
|
/*
|
||||||
@ -1288,7 +1281,7 @@ static void ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
|
|||||||
prefetch(next_rxd);
|
prefetch(next_rxd);
|
||||||
cleaned_count++;
|
cleaned_count++;
|
||||||
|
|
||||||
if (rsc_count) {
|
if (pkt_is_rsc) {
|
||||||
u32 nextp = (staterr & IXGBE_RXDADV_NEXTP_MASK) >>
|
u32 nextp = (staterr & IXGBE_RXDADV_NEXTP_MASK) >>
|
||||||
IXGBE_RXDADV_NEXTP_SHIFT;
|
IXGBE_RXDADV_NEXTP_SHIFT;
|
||||||
next_buffer = &rx_ring->rx_buffer_info[nextp];
|
next_buffer = &rx_ring->rx_buffer_info[nextp];
|
||||||
@ -1310,9 +1303,15 @@ static void ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
|
|||||||
goto next_desc;
|
goto next_desc;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (skb->prev)
|
if (skb->prev) {
|
||||||
skb = ixgbe_transform_rsc_queue(skb,
|
skb = ixgbe_transform_rsc_queue(skb);
|
||||||
&(rx_ring->rx_stats.rsc_count));
|
/* if we got here without RSC the packet is invalid */
|
||||||
|
if (!pkt_is_rsc) {
|
||||||
|
__pskb_trim(skb, 0);
|
||||||
|
rx_buffer_info->skb = skb;
|
||||||
|
goto next_desc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (ring_is_rsc_enabled(rx_ring)) {
|
if (ring_is_rsc_enabled(rx_ring)) {
|
||||||
if (IXGBE_RSC_CB(skb)->delay_unmap) {
|
if (IXGBE_RSC_CB(skb)->delay_unmap) {
|
||||||
@ -1323,11 +1322,14 @@ static void ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
|
|||||||
IXGBE_RSC_CB(skb)->dma = 0;
|
IXGBE_RSC_CB(skb)->dma = 0;
|
||||||
IXGBE_RSC_CB(skb)->delay_unmap = false;
|
IXGBE_RSC_CB(skb)->delay_unmap = false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
if (pkt_is_rsc) {
|
||||||
if (ring_is_ps_enabled(rx_ring))
|
if (ring_is_ps_enabled(rx_ring))
|
||||||
rx_ring->rx_stats.rsc_count +=
|
rx_ring->rx_stats.rsc_count +=
|
||||||
skb_shinfo(skb)->nr_frags;
|
skb_shinfo(skb)->nr_frags;
|
||||||
else
|
else
|
||||||
rx_ring->rx_stats.rsc_count++;
|
rx_ring->rx_stats.rsc_count +=
|
||||||
|
IXGBE_RSC_CB(skb)->skb_cnt;
|
||||||
rx_ring->rx_stats.rsc_flush++;
|
rx_ring->rx_stats.rsc_flush++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3017,7 +3019,6 @@ static void ixgbe_set_rx_buffer_len(struct ixgbe_adapter *adapter)
|
|||||||
}
|
}
|
||||||
#endif /* IXGBE_FCOE */
|
#endif /* IXGBE_FCOE */
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ixgbe_setup_rdrxctl(struct ixgbe_adapter *adapter)
|
static void ixgbe_setup_rdrxctl(struct ixgbe_adapter *adapter)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user