Skip to content

Commit 36eedfd

Browse files
321lipengdavem330
authored andcommitted
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: lipeng <[email protected]> reviewed-by: Yisen Zhuang <[email protected]> Signed-off-by: Salil Mehta <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 4b7cdec commit 36eedfd

File tree

2 files changed

+31
-21
lines changed

2 files changed

+31
-21
lines changed

drivers/net/ethernet/hisilicon/hns/hns_enet.c

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -859,7 +859,7 @@ static int hns_nic_rx_poll_one(struct hns_nic_ring_data *ring_data,
859859
return recv_pkts;
860860
}
861861

862-
static void hns_nic_rx_fini_pro(struct hns_nic_ring_data *ring_data)
862+
static bool hns_nic_rx_fini_pro(struct hns_nic_ring_data *ring_data)
863863
{
864864
struct hnae_ring *ring = ring_data->ring;
865865
int num = 0;
@@ -873,22 +873,23 @@ static void hns_nic_rx_fini_pro(struct hns_nic_ring_data *ring_data)
873873
ring_data->ring->q->handle->dev->ops->toggle_ring_irq(
874874
ring_data->ring, 1);
875875

876-
napi_schedule(&ring_data->napi);
876+
return false;
877+
} else {
878+
return true;
877879
}
878880
}
879881

880-
static void hns_nic_rx_fini_pro_v2(struct hns_nic_ring_data *ring_data)
882+
static bool hns_nic_rx_fini_pro_v2(struct hns_nic_ring_data *ring_data)
881883
{
882884
struct hnae_ring *ring = ring_data->ring;
883-
int num = 0;
885+
int num;
884886

885887
num = readl_relaxed(ring->io_base + RCB_REG_FBDNUM);
886888

887-
if (num == 0)
888-
ring_data->ring->q->handle->dev->ops->toggle_ring_irq(
889-
ring, 0);
889+
if (!num)
890+
return true;
890891
else
891-
napi_schedule(&ring_data->napi);
892+
return false;
892893
}
893894

894895
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,
989990
return 0;
990991
}
991992

992-
static void hns_nic_tx_fini_pro(struct hns_nic_ring_data *ring_data)
993+
static bool hns_nic_tx_fini_pro(struct hns_nic_ring_data *ring_data)
993994
{
994995
struct hnae_ring *ring = ring_data->ring;
995996
int head;
@@ -1002,20 +1003,21 @@ static void hns_nic_tx_fini_pro(struct hns_nic_ring_data *ring_data)
10021003
ring_data->ring->q->handle->dev->ops->toggle_ring_irq(
10031004
ring_data->ring, 1);
10041005

1005-
napi_schedule(&ring_data->napi);
1006+
return false;
1007+
} else {
1008+
return true;
10061009
}
10071010
}
10081011

1009-
static void hns_nic_tx_fini_pro_v2(struct hns_nic_ring_data *ring_data)
1012+
static bool hns_nic_tx_fini_pro_v2(struct hns_nic_ring_data *ring_data)
10101013
{
10111014
struct hnae_ring *ring = ring_data->ring;
10121015
int head = readl_relaxed(ring->io_base + RCB_REG_HEAD);
10131016

10141017
if (head == ring->next_to_clean)
1015-
ring_data->ring->q->handle->dev->ops->toggle_ring_irq(
1016-
ring, 0);
1018+
return true;
10171019
else
1018-
napi_schedule(&ring_data->napi);
1020+
return false;
10191021
}
10201022

10211023
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)
10421044

10431045
static int hns_nic_common_poll(struct napi_struct *napi, int budget)
10441046
{
1047+
int clean_complete = 0;
10451048
struct hns_nic_ring_data *ring_data =
10461049
container_of(napi, struct hns_nic_ring_data, napi);
1047-
int clean_complete = ring_data->poll_one(
1048-
ring_data, budget, ring_data->ex_process);
1050+
struct hnae_ring *ring = ring_data->ring;
10491051

1050-
if (clean_complete >= 0 && clean_complete < budget) {
1051-
napi_complete(napi);
1052-
ring_data->fini_process(ring_data);
1053-
return 0;
1052+
try_again:
1053+
clean_complete += ring_data->poll_one(
1054+
ring_data, budget - clean_complete,
1055+
ring_data->ex_process);
1056+
1057+
if (clean_complete < budget) {
1058+
if (ring_data->fini_process(ring_data)) {
1059+
napi_complete(napi);
1060+
ring->q->handle->dev->ops->toggle_ring_irq(ring, 0);
1061+
} else {
1062+
goto try_again;
1063+
}
10541064
}
10551065

10561066
return clean_complete;

drivers/net/ethernet/hisilicon/hns/hns_enet.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ struct hns_nic_ring_data {
4141
int queue_index;
4242
int (*poll_one)(struct hns_nic_ring_data *, int, void *);
4343
void (*ex_process)(struct hns_nic_ring_data *, struct sk_buff *);
44-
void (*fini_process)(struct hns_nic_ring_data *);
44+
bool (*fini_process)(struct hns_nic_ring_data *);
4545
};
4646

4747
/* compatible the difference between two versions */

0 commit comments

Comments
 (0)