Skip to content

Commit 148f025

Browse files
committed
Merge branch 'hns3-next'
Huazhong Tan says: ==================== code optimizations & bugfixes for HNS3 driver This patch-set includes code optimizations and bugfixes for the HNS3 ethernet controller driver. [patch 1/11 - 3/11] fixes some bugs about the IO path [patch 4/11 - 6/11] includes some optimization and bugfixes about mailbox handling [patch 7/11 - 11/11] adds misc code optimizations and bugfixes. Change log: V2->V3: fixes comments from Neil Horman, removes [patch 8/12] V1->V2: adds modification on [patch 8/12] ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
2 parents 790d23e + 96490a1 commit 148f025

File tree

10 files changed

+69
-55
lines changed

10 files changed

+69
-55
lines changed

drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,12 +84,15 @@ struct hclgevf_mbx_resp_status {
8484
struct hclge_mbx_vf_to_pf_cmd {
8585
u8 rsv;
8686
u8 mbx_src_vfid; /* Auto filled by IMP */
87-
u8 rsv1[2];
87+
u8 mbx_need_resp;
88+
u8 rsv1[1];
8889
u8 msg_len;
8990
u8 rsv2[3];
9091
u8 msg[HCLGE_MBX_MAX_MSG_SIZE];
9192
};
9293

94+
#define HCLGE_MBX_NEED_RESP_BIT BIT(0)
95+
9396
struct hclge_mbx_pf_to_vf_cmd {
9497
u8 dest_vfid;
9598
u8 rsv[3];
@@ -111,7 +114,7 @@ struct hclgevf_mbx_arq_ring {
111114
struct hclgevf_dev *hdev;
112115
u32 head;
113116
u32 tail;
114-
u32 count;
117+
atomic_t count;
115118
u16 msg_q[HCLGE_MBX_MAX_ARQ_MSG_NUM][HCLGE_MBX_MAX_ARQ_MSG_SIZE];
116119
};
117120

drivers/net/ethernet/hisilicon/hns3/hns3_enet.c

Lines changed: 38 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2214,14 +2214,22 @@ static void hns3_reuse_buffer(struct hns3_enet_ring *ring, int i)
22142214
static void hns3_nic_reclaim_one_desc(struct hns3_enet_ring *ring, int *bytes,
22152215
int *pkts)
22162216
{
2217-
struct hns3_desc_cb *desc_cb = &ring->desc_cb[ring->next_to_clean];
2217+
int ntc = ring->next_to_clean;
2218+
struct hns3_desc_cb *desc_cb;
22182219

2220+
desc_cb = &ring->desc_cb[ntc];
22192221
(*pkts) += (desc_cb->type == DESC_TYPE_SKB);
22202222
(*bytes) += desc_cb->length;
22212223
/* desc_cb will be cleaned, after hnae3_free_buffer_detach*/
2222-
hns3_free_buffer_detach(ring, ring->next_to_clean);
2224+
hns3_free_buffer_detach(ring, ntc);
22232225

2224-
ring_ptr_move_fw(ring, next_to_clean);
2226+
if (++ntc == ring->desc_num)
2227+
ntc = 0;
2228+
2229+
/* This smp_store_release() pairs with smp_load_acquire() in
2230+
* ring_space called by hns3_nic_net_xmit.
2231+
*/
2232+
smp_store_release(&ring->next_to_clean, ntc);
22252233
}
22262234

22272235
static int is_valid_clean_head(struct hns3_enet_ring *ring, int h)
@@ -2689,36 +2697,37 @@ static int hns3_set_gro_and_checksum(struct hns3_enet_ring *ring,
26892697
}
26902698

26912699
static void hns3_set_rx_skb_rss_type(struct hns3_enet_ring *ring,
2692-
struct sk_buff *skb)
2700+
struct sk_buff *skb, u32 rss_hash)
26932701
{
26942702
struct hnae3_handle *handle = ring->tqp->handle;
26952703
enum pkt_hash_types rss_type;
2696-
struct hns3_desc *desc;
2697-
int last_bd;
26982704

2699-
/* When driver handle the rss type, ring->next_to_clean indicates the
2700-
* first descriptor of next packet, need -1 here.
2701-
*/
2702-
last_bd = (ring->next_to_clean - 1 + ring->desc_num) % ring->desc_num;
2703-
desc = &ring->desc[last_bd];
2704-
2705-
if (le32_to_cpu(desc->rx.rss_hash))
2705+
if (rss_hash)
27062706
rss_type = handle->kinfo.rss_type;
27072707
else
27082708
rss_type = PKT_HASH_TYPE_NONE;
27092709

2710-
skb_set_hash(skb, le32_to_cpu(desc->rx.rss_hash), rss_type);
2710+
skb_set_hash(skb, rss_hash, rss_type);
27112711
}
27122712

2713-
static int hns3_handle_bdinfo(struct hns3_enet_ring *ring, struct sk_buff *skb,
2714-
struct hns3_desc *desc)
2713+
static int hns3_handle_bdinfo(struct hns3_enet_ring *ring, struct sk_buff *skb)
27152714
{
27162715
struct net_device *netdev = ring->tqp->handle->kinfo.netdev;
2717-
u32 bd_base_info = le32_to_cpu(desc->rx.bd_base_info);
2718-
u32 l234info = le32_to_cpu(desc->rx.l234_info);
27192716
enum hns3_pkt_l2t_type l2_frame_type;
2717+
u32 bd_base_info, l234info;
2718+
struct hns3_desc *desc;
27202719
unsigned int len;
2721-
int ret;
2720+
int pre_ntc, ret;
2721+
2722+
/* bdinfo handled below is only valid on the last BD of the
2723+
* current packet, and ring->next_to_clean indicates the first
2724+
* descriptor of next packet, so need - 1 below.
2725+
*/
2726+
pre_ntc = ring->next_to_clean ? (ring->next_to_clean - 1) :
2727+
(ring->desc_num - 1);
2728+
desc = &ring->desc[pre_ntc];
2729+
bd_base_info = le32_to_cpu(desc->rx.bd_base_info);
2730+
l234info = le32_to_cpu(desc->rx.l234_info);
27222731

27232732
/* Based on hw strategy, the tag offloaded will be stored at
27242733
* ot_vlan_tag in two layer tag case, and stored at vlan_tag
@@ -2779,6 +2788,8 @@ static int hns3_handle_bdinfo(struct hns3_enet_ring *ring, struct sk_buff *skb,
27792788
u64_stats_update_end(&ring->syncp);
27802789

27812790
ring->tqp_vector->rx_group.total_bytes += len;
2791+
2792+
hns3_set_rx_skb_rss_type(ring, skb, le32_to_cpu(desc->rx.rss_hash));
27822793
return 0;
27832794
}
27842795

@@ -2848,14 +2859,13 @@ static int hns3_handle_rx_bd(struct hns3_enet_ring *ring,
28482859
ALIGN(ring->pull_len, sizeof(long)));
28492860
}
28502861

2851-
ret = hns3_handle_bdinfo(ring, skb, desc);
2862+
ret = hns3_handle_bdinfo(ring, skb);
28522863
if (unlikely(ret)) {
28532864
dev_kfree_skb_any(skb);
28542865
return ret;
28552866
}
28562867

28572868
*out_skb = skb;
2858-
hns3_set_rx_skb_rss_type(ring, skb);
28592869

28602870
return 0;
28612871
}
@@ -2866,7 +2876,7 @@ int hns3_clean_rx_ring(
28662876
{
28672877
#define RCB_NOF_ALLOC_RX_BUFF_ONCE 16
28682878
int recv_pkts, recv_bds, clean_count, err;
2869-
int unused_count = hns3_desc_unused(ring) - ring->pending_buf;
2879+
int unused_count = hns3_desc_unused(ring);
28702880
struct sk_buff *skb = ring->skb;
28712881
int num;
28722882

@@ -2875,6 +2885,7 @@ int hns3_clean_rx_ring(
28752885

28762886
recv_pkts = 0, recv_bds = 0, clean_count = 0;
28772887
num -= unused_count;
2888+
unused_count -= ring->pending_buf;
28782889

28792890
while (recv_pkts < budget && recv_bds < num) {
28802891
/* Reuse or realloc buffers */
@@ -3476,6 +3487,7 @@ static int hns3_get_ring_config(struct hns3_nic_priv *priv)
34763487
}
34773488

34783489
devm_kfree(&pdev->dev, priv->ring_data);
3490+
priv->ring_data = NULL;
34793491
return ret;
34803492
}
34813493

@@ -3484,12 +3496,16 @@ static void hns3_put_ring_config(struct hns3_nic_priv *priv)
34843496
struct hnae3_handle *h = priv->ae_handle;
34853497
int i;
34863498

3499+
if (!priv->ring_data)
3500+
return;
3501+
34873502
for (i = 0; i < h->kinfo.num_tqps; i++) {
34883503
devm_kfree(priv->dev, priv->ring_data[i].ring);
34893504
devm_kfree(priv->dev,
34903505
priv->ring_data[i + h->kinfo.num_tqps].ring);
34913506
}
34923507
devm_kfree(priv->dev, priv->ring_data);
3508+
priv->ring_data = NULL;
34933509
}
34943510

34953511
static int hns3_alloc_ring_memory(struct hns3_enet_ring *ring)
@@ -3909,8 +3925,6 @@ static void hns3_client_uninit(struct hnae3_handle *handle, bool reset)
39093925

39103926
hns3_dbg_uninit(handle);
39113927

3912-
priv->ring_data = NULL;
3913-
39143928
out_netdev_free:
39153929
free_netdev(netdev);
39163930
}
@@ -4257,12 +4271,10 @@ static int hns3_reset_notify_init_enet(struct hnae3_handle *handle)
42574271
hns3_uninit_all_ring(priv);
42584272
err_uninit_vector:
42594273
hns3_nic_uninit_vector_data(priv);
4260-
priv->ring_data = NULL;
42614274
err_dealloc_vector:
42624275
hns3_nic_dealloc_vector_data(priv);
42634276
err_put_ring:
42644277
hns3_put_ring_config(priv);
4265-
priv->ring_data = NULL;
42664278

42674279
return ret;
42684280
}
@@ -4324,7 +4336,6 @@ static int hns3_reset_notify_uninit_enet(struct hnae3_handle *handle)
43244336
netdev_err(netdev, "uninit ring error\n");
43254337

43264338
hns3_put_ring_config(priv);
4327-
priv->ring_data = NULL;
43284339

43294340
return ret;
43304341
}

drivers/net/ethernet/hisilicon/hns3/hns3_enet.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -581,8 +581,11 @@ union l4_hdr_info {
581581

582582
static inline int ring_space(struct hns3_enet_ring *ring)
583583
{
584-
int begin = ring->next_to_clean;
585-
int end = ring->next_to_use;
584+
/* This smp_load_acquire() pairs with smp_store_release() in
585+
* hns3_nic_reclaim_one_desc called by hns3_clean_tx_ring.
586+
*/
587+
int begin = smp_load_acquire(&ring->next_to_clean);
588+
int end = READ_ONCE(ring->next_to_use);
586589

587590
return ((end >= begin) ? (ring->desc_num - end + begin) :
588591
(begin - end)) - 1;

drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1653,8 +1653,6 @@ int hclge_handle_hw_msix_error(struct hclge_dev *hdev,
16531653
if (ret) {
16541654
dev_err(dev, "fail(%d) to query msix int status bd num\n",
16551655
ret);
1656-
/* reset everything for now */
1657-
set_bit(HNAE3_GLOBAL_RESET, reset_requests);
16581656
return ret;
16591657
}
16601658

@@ -1675,8 +1673,6 @@ int hclge_handle_hw_msix_error(struct hclge_dev *hdev,
16751673
if (ret) {
16761674
dev_err(dev, "query all mpf msix int cmd failed (%d)\n",
16771675
ret);
1678-
/* reset everything for now */
1679-
set_bit(HNAE3_GLOBAL_RESET, reset_requests);
16801676
goto msi_error;
16811677
}
16821678

@@ -1710,8 +1706,6 @@ int hclge_handle_hw_msix_error(struct hclge_dev *hdev,
17101706
if (ret) {
17111707
dev_err(dev, "clear all mpf msix int cmd failed (%d)\n",
17121708
ret);
1713-
/* reset everything for now */
1714-
set_bit(HNAE3_GLOBAL_RESET, reset_requests);
17151709
goto msi_error;
17161710
}
17171711

@@ -1725,8 +1719,6 @@ int hclge_handle_hw_msix_error(struct hclge_dev *hdev,
17251719
if (ret) {
17261720
dev_err(dev, "query all pf msix int cmd failed (%d)\n",
17271721
ret);
1728-
/* reset everything for now */
1729-
set_bit(HNAE3_GLOBAL_RESET, reset_requests);
17301722
goto msi_error;
17311723
}
17321724

@@ -1767,8 +1759,6 @@ int hclge_handle_hw_msix_error(struct hclge_dev *hdev,
17671759
if (ret) {
17681760
dev_err(dev, "clear all pf msix int cmd failed (%d)\n",
17691761
ret);
1770-
/* reset everything for now */
1771-
set_bit(HNAE3_GLOBAL_RESET, reset_requests);
17721762
}
17731763

17741764
/* query and clear mac tnl interruptions */

drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5337,8 +5337,8 @@ static int hclge_set_serdes_loopback(struct hclge_dev *hdev, bool en,
53375337
#define HCLGE_SERDES_RETRY_MS 10
53385338
#define HCLGE_SERDES_RETRY_NUM 100
53395339

5340-
#define HCLGE_MAC_LINK_STATUS_MS 20
5341-
#define HCLGE_MAC_LINK_STATUS_NUM 10
5340+
#define HCLGE_MAC_LINK_STATUS_MS 10
5341+
#define HCLGE_MAC_LINK_STATUS_NUM 100
53425342
#define HCLGE_MAC_LINK_STATUS_DOWN 0
53435343
#define HCLGE_MAC_LINK_STATUS_UP 1
53445344

drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -212,8 +212,7 @@ static int hclge_set_vf_promisc_mode(struct hclge_vport *vport,
212212
}
213213

214214
static int hclge_set_vf_uc_mac_addr(struct hclge_vport *vport,
215-
struct hclge_mbx_vf_to_pf_cmd *mbx_req,
216-
bool gen_resp)
215+
struct hclge_mbx_vf_to_pf_cmd *mbx_req)
217216
{
218217
const u8 *mac_addr = (const u8 *)(&mbx_req->msg[2]);
219218
struct hclge_dev *hdev = vport->back;
@@ -249,7 +248,7 @@ static int hclge_set_vf_uc_mac_addr(struct hclge_vport *vport,
249248
return -EIO;
250249
}
251250

252-
if (gen_resp)
251+
if (mbx_req->mbx_need_resp & HCLGE_MBX_NEED_RESP_BIT)
253252
hclge_gen_resp_to_vf(vport, mbx_req, status, NULL, 0);
254253

255254
return 0;
@@ -597,7 +596,7 @@ void hclge_mbx_handler(struct hclge_dev *hdev)
597596
ret);
598597
break;
599598
case HCLGE_MBX_SET_UNICAST:
600-
ret = hclge_set_vf_uc_mac_addr(vport, req, true);
599+
ret = hclge_set_vf_uc_mac_addr(vport, req);
601600
if (ret)
602601
dev_err(&hdev->pdev->dev,
603602
"PF fail(%d) to set VF UC MAC Addr\n",

drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1331,8 +1331,11 @@ int hclge_pause_setup_hw(struct hclge_dev *hdev, bool init)
13311331
ret = hclge_pfc_setup_hw(hdev);
13321332
if (init && ret == -EOPNOTSUPP)
13331333
dev_warn(&hdev->pdev->dev, "GE MAC does not support pfc\n");
1334-
else
1334+
else if (ret) {
1335+
dev_err(&hdev->pdev->dev, "config pfc failed! ret = %d\n",
1336+
ret);
13351337
return ret;
1338+
}
13361339

13371340
return hclge_tm_bp_setup(hdev);
13381341
}

drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@ int hclgevf_cmd_init(struct hclgevf_dev *hdev)
340340
hdev->arq.hdev = hdev;
341341
hdev->arq.head = 0;
342342
hdev->arq.tail = 0;
343-
hdev->arq.count = 0;
343+
atomic_set(&hdev->arq.count, 0);
344344
hdev->hw.cmq.csq.next_to_clean = 0;
345345
hdev->hw.cmq.csq.next_to_use = 0;
346346
hdev->hw.cmq.crq.next_to_clean = 0;

drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1758,7 +1758,7 @@ static void hclgevf_keep_alive_task(struct work_struct *work)
17581758

17591759
hdev = container_of(work, struct hclgevf_dev, keep_alive_task);
17601760

1761-
if (test_bit(HCLGEVF_STATE_RST_HANDLING, &hdev->state))
1761+
if (test_bit(HCLGEVF_STATE_CMD_DISABLE, &hdev->state))
17621762
return;
17631763

17641764
ret = hclgevf_send_mbx_msg(hdev, HCLGE_MBX_KEEP_ALIVE, 0, NULL,
@@ -2050,8 +2050,10 @@ static void hclgevf_ae_stop(struct hnae3_handle *handle)
20502050

20512051
set_bit(HCLGEVF_STATE_DOWN, &hdev->state);
20522052

2053-
for (i = 0; i < handle->kinfo.num_tqps; i++)
2054-
hclgevf_reset_tqp(handle, i);
2053+
if (hdev->reset_type != HNAE3_VF_RESET)
2054+
for (i = 0; i < handle->kinfo.num_tqps; i++)
2055+
if (hclgevf_reset_tqp(handle, i))
2056+
break;
20552057

20562058
/* reset tqp stats */
20572059
hclgevf_reset_tqp_stats(handle);

drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_mbx.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,8 @@ int hclgevf_send_mbx_msg(struct hclgevf_dev *hdev, u16 code, u16 subcode,
9898
}
9999

100100
hclgevf_cmd_setup_basic_desc(&desc, HCLGEVF_OPC_MBX_VF_TO_PF, false);
101+
req->mbx_need_resp |= need_resp ? HCLGE_MBX_NEED_RESP_BIT :
102+
~HCLGE_MBX_NEED_RESP_BIT;
101103
req->msg[0] = code;
102104
req->msg[1] = subcode;
103105
memcpy(&req->msg[2], msg_data, msg_len);
@@ -212,7 +214,8 @@ void hclgevf_mbx_handler(struct hclgevf_dev *hdev)
212214
/* we will drop the async msg if we find ARQ as full
213215
* and continue with next message
214216
*/
215-
if (hdev->arq.count >= HCLGE_MBX_MAX_ARQ_MSG_NUM) {
217+
if (atomic_read(&hdev->arq.count) >=
218+
HCLGE_MBX_MAX_ARQ_MSG_NUM) {
216219
dev_warn(&hdev->pdev->dev,
217220
"Async Q full, dropping msg(%d)\n",
218221
req->msg[1]);
@@ -224,7 +227,7 @@ void hclgevf_mbx_handler(struct hclgevf_dev *hdev)
224227
memcpy(&msg_q[0], req->msg,
225228
HCLGE_MBX_MAX_ARQ_MSG_SIZE * sizeof(u16));
226229
hclge_mbx_tail_ptr_move_arq(hdev->arq);
227-
hdev->arq.count++;
230+
atomic_inc(&hdev->arq.count);
228231

229232
hclgevf_mbx_task_schedule(hdev);
230233

@@ -317,7 +320,7 @@ void hclgevf_mbx_async_handler(struct hclgevf_dev *hdev)
317320
}
318321

319322
hclge_mbx_head_ptr_move_arq(hdev->arq);
320-
hdev->arq.count--;
323+
atomic_dec(&hdev->arq.count);
321324
msg_q = hdev->arq.msg_q[hdev->arq.head];
322325
}
323326
}

0 commit comments

Comments
 (0)