From: Salil Mehta <salil.mehta@huawei.com>
To: <davem@davemloft.net>
Cc: <salil.mehta@huawei.com>, <yisen.zhuang@huawei.com>,
<mehta.salil.lnk@gmail.com>, <netdev@vger.kernel.org>,
<linux-kernel@vger.kernel.org>, <linuxarm@huawei.com>,
lipeng <lipeng321@huawei.com>
Subject: [PATCH V2 net-next 06/18] net: hns: Optimize hns_nic_common_poll for better performance
Date: Fri, 31 Mar 2017 12:20:20 +0100 [thread overview]
Message-ID: <20170331112032.4692-7-salil.mehta@huawei.com> (raw)
In-Reply-To: <20170331112032.4692-1-salil.mehta@huawei.com>
From: lipeng <lipeng321@huawei.com>
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 <lipeng321@huawei.com>
reviewed-by: Yisen Zhuang <yisen.zhuang@huawei.com>
Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
---
drivers/net/ethernet/hisilicon/hns/hns_enet.c | 50 ++++++++++++++++-----------
drivers/net/ethernet/hisilicon/hns/hns_enet.h | 2 +-
2 files changed, 31 insertions(+), 21 deletions(-)
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
index 73ec8c8..5f67db2 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
@@ -859,7 +859,7 @@ static int hns_nic_rx_poll_one(struct hns_nic_ring_data *ring_data,
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;
int num = 0;
@@ -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, 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;
- int num = 0;
+ int num;
num = readl_relaxed(ring->io_base + RCB_REG_FBDNUM);
- if (num == 0)
- ring_data->ring->q->handle->dev->ops->toggle_ring_irq(
- ring, 0);
+ if (!num)
+ return true;
else
- napi_schedule(&ring_data->napi);
+ return false;
}
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,
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;
int head;
@@ -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, 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;
int head = readl_relaxed(ring->io_base + RCB_REG_HEAD);
if (head == ring->next_to_clean)
- ring_data->ring->q->handle->dev->ops->toggle_ring_irq(
- ring, 0);
+ return true;
else
- napi_schedule(&ring_data->napi);
+ return false;
}
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)
{
+ int clean_complete = 0;
struct hns_nic_ring_data *ring_data =
container_of(napi, struct hns_nic_ring_data, napi);
- int clean_complete = ring_data->poll_one(
- ring_data, budget, ring_data->ex_process);
+ struct hnae_ring *ring = ring_data->ring;
- if (clean_complete >= 0 && clean_complete < budget) {
- napi_complete(napi);
- ring_data->fini_process(ring_data);
- return 0;
+try_again:
+ clean_complete += ring_data->poll_one(
+ ring_data, budget - clean_complete,
+ 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;
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.h b/drivers/net/ethernet/hisilicon/hns/hns_enet.h
index fff8f8a..1b83232 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_enet.h
+++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.h
@@ -41,7 +41,7 @@ struct hns_nic_ring_data {
int queue_index;
int (*poll_one)(struct hns_nic_ring_data *, int, void *);
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 */
--
2.7.4
next prev parent reply other threads:[~2017-03-31 11:21 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-03-31 11:20 [PATCH V2 net-next 00/18] net: hns: Misc. HNS Bug Fixes & Code Improvements Salil Mehta
2017-03-31 11:20 ` [PATCH V2 net-next 01/18] net: hns: Fix the implementation of irq affinity function Salil Mehta
2017-03-31 11:20 ` [PATCH V2 net-next 02/18] net: hns: Modify GMAC init TX threshold value Salil Mehta
2017-03-31 11:20 ` [PATCH V2 net-next 03/18] net: hns: Optimize the code for GMAC pad and crc Config Salil Mehta
2017-03-31 11:20 ` [PATCH V2 net-next 04/18] net: hns: Remove redundant memset during buffer release Salil Mehta
2017-03-31 11:20 ` [PATCH V2 net-next 05/18] net: hns: bug fix of ethtool show the speed Salil Mehta
2017-03-31 11:20 ` Salil Mehta [this message]
2017-03-31 11:20 ` [PATCH V2 net-next 07/18] net: hns: Fix to adjust buf_size of ring according to mtu Salil Mehta
2017-03-31 11:20 ` [PATCH V2 net-next 08/18] net: hns: Replace netif_tx_lock to ring spin lock Salil Mehta
2017-03-31 11:20 ` [PATCH V2 net-next 09/18] net: hns: Correct HNS RSS key set function Salil Mehta
2017-03-31 11:20 ` [PATCH V2 net-next 10/18] net: hns: Remove the redundant adding and deleting mac function Salil Mehta
2017-03-31 11:20 ` [PATCH V2 net-next 11/18] net: hns: Remove redundant mac_get_id() Salil Mehta
2017-03-31 11:20 ` [PATCH V2 net-next 12/18] net: hns: Remove redundant mac table operations Salil Mehta
2017-03-31 11:20 ` [PATCH V2 net-next 13/18] net: hns: Clean redundant code from hns_mdio.c file Salil Mehta
2017-03-31 11:20 ` [PATCH V2 net-next 14/18] net: hns: Optimise the code in hns_mdio_wait_ready() Salil Mehta
2017-03-31 11:20 ` [PATCH V2 net-next 15/18] net: hns: Simplify the exception sequence in hns_ppe_init() Salil Mehta
2017-03-31 11:20 ` [PATCH V2 net-next 16/18] net: hns: Adjust the SBM module buffer threshold Salil Mehta
2017-03-31 11:20 ` [PATCH V2 net-next 17/18] net: hns: Avoid Hip06 chip TX packet line bug Salil Mehta
2017-03-31 11:20 ` [PATCH V2 net-next 18/18] net: hns: Some checkpatch.pl script & warning fixes Salil Mehta
2017-03-31 15:44 ` Joe Perches
2017-03-31 16:46 ` Salil Mehta
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170331112032.4692-7-salil.mehta@huawei.com \
--to=salil.mehta@huawei.com \
--cc=davem@davemloft.net \
--cc=linux-kernel@vger.kernel.org \
--cc=linuxarm@huawei.com \
--cc=lipeng321@huawei.com \
--cc=mehta.salil.lnk@gmail.com \
--cc=netdev@vger.kernel.org \
--cc=yisen.zhuang@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox