Commit 36eedfde authored by lipeng's avatar lipeng Committed by David S. Miller

net: hns: Optimize hns_nic_common_poll for better performance

After polling less than buget packages, we need check again. If
there are still some packages, we call napi_schedule add softirq
queue, this is not better way. So we return buget value instead
of napi_schedule.
Signed-off-by: default avatarlipeng <lipeng321@huawei.com>
reviewed-by: default avatarYisen Zhuang <yisen.zhuang@huawei.com>
Signed-off-by: default avatarSalil Mehta <salil.mehta@huawei.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 4b7cdeca
...@@ -859,7 +859,7 @@ static int hns_nic_rx_poll_one(struct hns_nic_ring_data *ring_data, ...@@ -859,7 +859,7 @@ static int hns_nic_rx_poll_one(struct hns_nic_ring_data *ring_data,
return recv_pkts; return recv_pkts;
} }
static void hns_nic_rx_fini_pro(struct hns_nic_ring_data *ring_data) static bool hns_nic_rx_fini_pro(struct hns_nic_ring_data *ring_data)
{ {
struct hnae_ring *ring = ring_data->ring; struct hnae_ring *ring = ring_data->ring;
int num = 0; int num = 0;
...@@ -873,22 +873,23 @@ static void hns_nic_rx_fini_pro(struct hns_nic_ring_data *ring_data) ...@@ -873,22 +873,23 @@ static void hns_nic_rx_fini_pro(struct hns_nic_ring_data *ring_data)
ring_data->ring->q->handle->dev->ops->toggle_ring_irq( ring_data->ring->q->handle->dev->ops->toggle_ring_irq(
ring_data->ring, 1); ring_data->ring, 1);
napi_schedule(&ring_data->napi); return false;
} else {
return true;
} }
} }
static void hns_nic_rx_fini_pro_v2(struct hns_nic_ring_data *ring_data) static bool hns_nic_rx_fini_pro_v2(struct hns_nic_ring_data *ring_data)
{ {
struct hnae_ring *ring = ring_data->ring; struct hnae_ring *ring = ring_data->ring;
int num = 0; int num;
num = readl_relaxed(ring->io_base + RCB_REG_FBDNUM); num = readl_relaxed(ring->io_base + RCB_REG_FBDNUM);
if (num == 0) if (!num)
ring_data->ring->q->handle->dev->ops->toggle_ring_irq( return true;
ring, 0);
else else
napi_schedule(&ring_data->napi); return false;
} }
static inline void hns_nic_reclaim_one_desc(struct hnae_ring *ring, static inline void hns_nic_reclaim_one_desc(struct hnae_ring *ring,
...@@ -989,7 +990,7 @@ static int hns_nic_tx_poll_one(struct hns_nic_ring_data *ring_data, ...@@ -989,7 +990,7 @@ static int hns_nic_tx_poll_one(struct hns_nic_ring_data *ring_data,
return 0; return 0;
} }
static void hns_nic_tx_fini_pro(struct hns_nic_ring_data *ring_data) static bool hns_nic_tx_fini_pro(struct hns_nic_ring_data *ring_data)
{ {
struct hnae_ring *ring = ring_data->ring; struct hnae_ring *ring = ring_data->ring;
int head; int head;
...@@ -1002,20 +1003,21 @@ static void hns_nic_tx_fini_pro(struct hns_nic_ring_data *ring_data) ...@@ -1002,20 +1003,21 @@ static void hns_nic_tx_fini_pro(struct hns_nic_ring_data *ring_data)
ring_data->ring->q->handle->dev->ops->toggle_ring_irq( ring_data->ring->q->handle->dev->ops->toggle_ring_irq(
ring_data->ring, 1); ring_data->ring, 1);
napi_schedule(&ring_data->napi); return false;
} else {
return true;
} }
} }
static void hns_nic_tx_fini_pro_v2(struct hns_nic_ring_data *ring_data) static bool hns_nic_tx_fini_pro_v2(struct hns_nic_ring_data *ring_data)
{ {
struct hnae_ring *ring = ring_data->ring; struct hnae_ring *ring = ring_data->ring;
int head = readl_relaxed(ring->io_base + RCB_REG_HEAD); int head = readl_relaxed(ring->io_base + RCB_REG_HEAD);
if (head == ring->next_to_clean) if (head == ring->next_to_clean)
ring_data->ring->q->handle->dev->ops->toggle_ring_irq( return true;
ring, 0);
else else
napi_schedule(&ring_data->napi); return false;
} }
static void hns_nic_tx_clr_all_bufs(struct hns_nic_ring_data *ring_data) static void hns_nic_tx_clr_all_bufs(struct hns_nic_ring_data *ring_data)
...@@ -1042,15 +1044,23 @@ static void hns_nic_tx_clr_all_bufs(struct hns_nic_ring_data *ring_data) ...@@ -1042,15 +1044,23 @@ static void hns_nic_tx_clr_all_bufs(struct hns_nic_ring_data *ring_data)
static int hns_nic_common_poll(struct napi_struct *napi, int budget) static int hns_nic_common_poll(struct napi_struct *napi, int budget)
{ {
int clean_complete = 0;
struct hns_nic_ring_data *ring_data = struct hns_nic_ring_data *ring_data =
container_of(napi, struct hns_nic_ring_data, napi); container_of(napi, struct hns_nic_ring_data, napi);
int clean_complete = ring_data->poll_one( struct hnae_ring *ring = ring_data->ring;
ring_data, budget, ring_data->ex_process);
if (clean_complete >= 0 && clean_complete < budget) { try_again:
napi_complete(napi); clean_complete += ring_data->poll_one(
ring_data->fini_process(ring_data); ring_data, budget - clean_complete,
return 0; ring_data->ex_process);
if (clean_complete < budget) {
if (ring_data->fini_process(ring_data)) {
napi_complete(napi);
ring->q->handle->dev->ops->toggle_ring_irq(ring, 0);
} else {
goto try_again;
}
} }
return clean_complete; return clean_complete;
......
...@@ -41,7 +41,7 @@ struct hns_nic_ring_data { ...@@ -41,7 +41,7 @@ struct hns_nic_ring_data {
int queue_index; int queue_index;
int (*poll_one)(struct hns_nic_ring_data *, int, void *); int (*poll_one)(struct hns_nic_ring_data *, int, void *);
void (*ex_process)(struct hns_nic_ring_data *, struct sk_buff *); void (*ex_process)(struct hns_nic_ring_data *, struct sk_buff *);
void (*fini_process)(struct hns_nic_ring_data *); bool (*fini_process)(struct hns_nic_ring_data *);
}; };
/* compatible the difference between two versions */ /* compatible the difference between two versions */
......
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