Skip to content

Commit 5a470b1

Browse files
committed
Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
2 parents 3902baf + 0141317 commit 5a470b1

File tree

12 files changed

+115
-61
lines changed

12 files changed

+115
-61
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@
7878

7979
enum hns_desc_type {
8080
DESC_TYPE_SKB,
81+
DESC_TYPE_FRAGLIST_SKB,
8182
DESC_TYPE_PAGE,
8283
};
8384

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

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1106,6 +1106,10 @@ static int hns3_fill_desc(struct hns3_enet_ring *ring, void *priv,
11061106
if (unlikely(ret < 0))
11071107
return ret;
11081108

1109+
dma = dma_map_single(dev, skb->data, size, DMA_TO_DEVICE);
1110+
} else if (type == DESC_TYPE_FRAGLIST_SKB) {
1111+
struct sk_buff *skb = (struct sk_buff *)priv;
1112+
11091113
dma = dma_map_single(dev, skb->data, size, DMA_TO_DEVICE);
11101114
} else {
11111115
frag = (skb_frag_t *)priv;
@@ -1144,8 +1148,9 @@ static int hns3_fill_desc(struct hns3_enet_ring *ring, void *priv,
11441148
/* The txbd's baseinfo of DESC_TYPE_PAGE & DESC_TYPE_SKB */
11451149
desc_cb->priv = priv;
11461150
desc_cb->dma = dma + HNS3_MAX_BD_SIZE * k;
1147-
desc_cb->type = (type == DESC_TYPE_SKB && !k) ?
1148-
DESC_TYPE_SKB : DESC_TYPE_PAGE;
1151+
desc_cb->type = ((type == DESC_TYPE_FRAGLIST_SKB ||
1152+
type == DESC_TYPE_SKB) && !k) ?
1153+
type : DESC_TYPE_PAGE;
11491154

11501155
/* now, fill the descriptor */
11511156
desc->addr = cpu_to_le64(dma + HNS3_MAX_BD_SIZE * k);
@@ -1354,7 +1359,9 @@ static void hns3_clear_desc(struct hns3_enet_ring *ring, int next_to_use_orig)
13541359
ring_ptr_move_bw(ring, next_to_use);
13551360

13561361
/* unmap the descriptor dma address */
1357-
if (ring->desc_cb[ring->next_to_use].type == DESC_TYPE_SKB)
1362+
if (ring->desc_cb[ring->next_to_use].type == DESC_TYPE_SKB ||
1363+
ring->desc_cb[ring->next_to_use].type ==
1364+
DESC_TYPE_FRAGLIST_SKB)
13581365
dma_unmap_single(dev,
13591366
ring->desc_cb[ring->next_to_use].dma,
13601367
ring->desc_cb[ring->next_to_use].length,
@@ -1447,7 +1454,8 @@ netdev_tx_t hns3_nic_net_xmit(struct sk_buff *skb, struct net_device *netdev)
14471454
goto out;
14481455

14491456
skb_walk_frags(skb, frag_skb) {
1450-
ret = hns3_fill_skb_to_desc(ring, frag_skb, DESC_TYPE_PAGE);
1457+
ret = hns3_fill_skb_to_desc(ring, frag_skb,
1458+
DESC_TYPE_FRAGLIST_SKB);
14511459
if (unlikely(ret < 0))
14521460
goto fill_err;
14531461

@@ -2356,7 +2364,7 @@ static int hns3_map_buffer(struct hns3_enet_ring *ring, struct hns3_desc_cb *cb)
23562364
static void hns3_unmap_buffer(struct hns3_enet_ring *ring,
23572365
struct hns3_desc_cb *cb)
23582366
{
2359-
if (cb->type == DESC_TYPE_SKB)
2367+
if (cb->type == DESC_TYPE_SKB || cb->type == DESC_TYPE_FRAGLIST_SKB)
23602368
dma_unmap_single(ring_to_dev(ring), cb->dma, cb->length,
23612369
ring_to_dma_dir(ring));
23622370
else if (cb->length)

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6768,7 +6768,7 @@ static void hclge_set_timer_task(struct hnae3_handle *handle, bool enable)
67686768
struct hclge_dev *hdev = vport->back;
67696769

67706770
if (enable) {
6771-
hclge_task_schedule(hdev, round_jiffies_relative(HZ));
6771+
hclge_task_schedule(hdev, 0);
67726772
} else {
67736773
/* Set the DOWN flag here to disable link updating */
67746774
set_bit(HCLGE_STATE_DOWN, &hdev->state);
@@ -8986,6 +8986,12 @@ static void hclge_get_media_type(struct hnae3_handle *handle, u8 *media_type,
89868986
struct hclge_vport *vport = hclge_get_vport(handle);
89878987
struct hclge_dev *hdev = vport->back;
89888988

8989+
/* When nic is down, the service task is not running, doesn't update
8990+
* the port information per second. Query the port information before
8991+
* return the media type, ensure getting the correct media information.
8992+
*/
8993+
hclge_update_port_info(hdev);
8994+
89898995
if (media_type)
89908996
*media_type = hdev->hw.mac.media_type;
89918997

@@ -10674,7 +10680,7 @@ static int hclge_init(void)
1067410680
{
1067510681
pr_info("%s is initializing\n", HCLGE_NAME);
1067610682

10677-
hclge_wq = alloc_workqueue("%s", WQ_MEM_RECLAIM, 0, HCLGE_NAME);
10683+
hclge_wq = alloc_workqueue("%s", 0, 0, HCLGE_NAME);
1067810684
if (!hclge_wq) {
1067910685
pr_err("%s: failed to create workqueue\n", HCLGE_NAME);
1068010686
return -ENOMEM;

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

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2149,50 +2149,51 @@ static int hclgevf_config_gro(struct hclgevf_dev *hdev, bool en)
21492149
return ret;
21502150
}
21512151

2152-
static int hclgevf_rss_init_hw(struct hclgevf_dev *hdev)
2152+
static void hclgevf_rss_init_cfg(struct hclgevf_dev *hdev)
21532153
{
21542154
struct hclgevf_rss_cfg *rss_cfg = &hdev->rss_cfg;
2155-
int ret;
2155+
struct hclgevf_rss_tuple_cfg *tuple_sets;
21562156
u32 i;
21572157

2158+
rss_cfg->hash_algo = HCLGEVF_RSS_HASH_ALGO_TOEPLITZ;
21582159
rss_cfg->rss_size = hdev->nic.kinfo.rss_size;
2159-
2160+
tuple_sets = &rss_cfg->rss_tuple_sets;
21602161
if (hdev->pdev->revision >= 0x21) {
21612162
rss_cfg->hash_algo = HCLGEVF_RSS_HASH_ALGO_SIMPLE;
21622163
memcpy(rss_cfg->rss_hash_key, hclgevf_hash_key,
21632164
HCLGEVF_RSS_KEY_SIZE);
21642165

2166+
tuple_sets->ipv4_tcp_en = HCLGEVF_RSS_INPUT_TUPLE_OTHER;
2167+
tuple_sets->ipv4_udp_en = HCLGEVF_RSS_INPUT_TUPLE_OTHER;
2168+
tuple_sets->ipv4_sctp_en = HCLGEVF_RSS_INPUT_TUPLE_SCTP;
2169+
tuple_sets->ipv4_fragment_en = HCLGEVF_RSS_INPUT_TUPLE_OTHER;
2170+
tuple_sets->ipv6_tcp_en = HCLGEVF_RSS_INPUT_TUPLE_OTHER;
2171+
tuple_sets->ipv6_udp_en = HCLGEVF_RSS_INPUT_TUPLE_OTHER;
2172+
tuple_sets->ipv6_sctp_en = HCLGEVF_RSS_INPUT_TUPLE_SCTP;
2173+
tuple_sets->ipv6_fragment_en = HCLGEVF_RSS_INPUT_TUPLE_OTHER;
2174+
}
2175+
2176+
/* Initialize RSS indirect table */
2177+
for (i = 0; i < HCLGEVF_RSS_IND_TBL_SIZE; i++)
2178+
rss_cfg->rss_indirection_tbl[i] = i % rss_cfg->rss_size;
2179+
}
2180+
2181+
static int hclgevf_rss_init_hw(struct hclgevf_dev *hdev)
2182+
{
2183+
struct hclgevf_rss_cfg *rss_cfg = &hdev->rss_cfg;
2184+
int ret;
2185+
2186+
if (hdev->pdev->revision >= 0x21) {
21652187
ret = hclgevf_set_rss_algo_key(hdev, rss_cfg->hash_algo,
21662188
rss_cfg->rss_hash_key);
21672189
if (ret)
21682190
return ret;
21692191

2170-
rss_cfg->rss_tuple_sets.ipv4_tcp_en =
2171-
HCLGEVF_RSS_INPUT_TUPLE_OTHER;
2172-
rss_cfg->rss_tuple_sets.ipv4_udp_en =
2173-
HCLGEVF_RSS_INPUT_TUPLE_OTHER;
2174-
rss_cfg->rss_tuple_sets.ipv4_sctp_en =
2175-
HCLGEVF_RSS_INPUT_TUPLE_SCTP;
2176-
rss_cfg->rss_tuple_sets.ipv4_fragment_en =
2177-
HCLGEVF_RSS_INPUT_TUPLE_OTHER;
2178-
rss_cfg->rss_tuple_sets.ipv6_tcp_en =
2179-
HCLGEVF_RSS_INPUT_TUPLE_OTHER;
2180-
rss_cfg->rss_tuple_sets.ipv6_udp_en =
2181-
HCLGEVF_RSS_INPUT_TUPLE_OTHER;
2182-
rss_cfg->rss_tuple_sets.ipv6_sctp_en =
2183-
HCLGEVF_RSS_INPUT_TUPLE_SCTP;
2184-
rss_cfg->rss_tuple_sets.ipv6_fragment_en =
2185-
HCLGEVF_RSS_INPUT_TUPLE_OTHER;
2186-
21872192
ret = hclgevf_set_rss_input_tuple(hdev, rss_cfg);
21882193
if (ret)
21892194
return ret;
21902195
}
21912196

2192-
/* Initialize RSS indirect table */
2193-
for (i = 0; i < HCLGEVF_RSS_IND_TBL_SIZE; i++)
2194-
rss_cfg->rss_indirection_tbl[i] = i % rss_cfg->rss_size;
2195-
21962197
ret = hclgevf_set_rss_indir_table(hdev);
21972198
if (ret)
21982199
return ret;
@@ -2793,6 +2794,7 @@ static int hclgevf_init_hdev(struct hclgevf_dev *hdev)
27932794
goto err_config;
27942795

27952796
/* Initialize RSS for this VF */
2797+
hclgevf_rss_init_cfg(hdev);
27962798
ret = hclgevf_rss_init_hw(hdev);
27972799
if (ret) {
27982800
dev_err(&hdev->pdev->dev,
@@ -2967,6 +2969,8 @@ static int hclgevf_set_channels(struct hnae3_handle *handle, u32 new_tqps_num,
29672969
for (i = 0; i < HCLGEVF_RSS_IND_TBL_SIZE; i++)
29682970
rss_indir[i] = i % kinfo->rss_size;
29692971

2972+
hdev->rss_cfg.rss_size = kinfo->rss_size;
2973+
29702974
ret = hclgevf_set_rss(handle, rss_indir, NULL, 0);
29712975
if (ret)
29722976
dev_err(&hdev->pdev->dev, "set rss indir table fail, ret=%d\n",
@@ -3220,7 +3224,7 @@ static int hclgevf_init(void)
32203224
{
32213225
pr_info("%s is initializing\n", HCLGEVF_NAME);
32223226

3223-
hclgevf_wq = alloc_workqueue("%s", WQ_MEM_RECLAIM, 0, HCLGEVF_NAME);
3227+
hclgevf_wq = alloc_workqueue("%s", 0, 0, HCLGEVF_NAME);
32243228
if (!hclgevf_wq) {
32253229
pr_err("%s: failed to create workqueue\n", HCLGEVF_NAME);
32263230
return -ENOMEM;

net/core/skbuff.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3668,6 +3668,7 @@ struct sk_buff *skb_segment_list(struct sk_buff *skb,
36683668

36693669
skb_push(nskb, -skb_network_offset(nskb) + offset);
36703670

3671+
skb_release_head_state(nskb);
36713672
__copy_skb_header(nskb, skb);
36723673

36733674
skb_headers_offset_update(nskb, skb_headroom(nskb) - skb_headroom(skb));

net/ipv4/fib_trie.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2572,6 +2572,7 @@ static int fib_triestat_seq_show(struct seq_file *seq, void *v)
25722572
" %zd bytes, size of tnode: %zd bytes.\n",
25732573
LEAF_SIZE, TNODE_SIZE(0));
25742574

2575+
rcu_read_lock();
25752576
for (h = 0; h < FIB_TABLE_HASHSZ; h++) {
25762577
struct hlist_head *head = &net->ipv4.fib_table_hash[h];
25772578
struct fib_table *tb;
@@ -2591,7 +2592,9 @@ static int fib_triestat_seq_show(struct seq_file *seq, void *v)
25912592
trie_show_usage(seq, t->stats);
25922593
#endif
25932594
}
2595+
cond_resched_rcu();
25942596
}
2597+
rcu_read_unlock();
25952598

25962599
return 0;
25972600
}

net/ipv4/ip_tunnel.c

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -142,11 +142,8 @@ struct ip_tunnel *ip_tunnel_lookup(struct ip_tunnel_net *itn,
142142
cand = t;
143143
}
144144

145-
if (flags & TUNNEL_NO_KEY)
146-
goto skip_key_lookup;
147-
148145
hlist_for_each_entry_rcu(t, head, hash_node) {
149-
if (t->parms.i_key != key ||
146+
if ((!(flags & TUNNEL_NO_KEY) && t->parms.i_key != key) ||
150147
t->parms.iph.saddr != 0 ||
151148
t->parms.iph.daddr != 0 ||
152149
!(t->dev->flags & IFF_UP))
@@ -158,7 +155,6 @@ struct ip_tunnel *ip_tunnel_lookup(struct ip_tunnel_net *itn,
158155
cand = t;
159156
}
160157

161-
skip_key_lookup:
162158
if (cand)
163159
return cand;
164160

net/ipv4/udp_offload.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,7 @@ struct sk_buff *udp_gro_receive(struct list_head *head, struct sk_buff *skb,
453453
unsigned int off = skb_gro_offset(skb);
454454
int flush = 1;
455455

456+
NAPI_GRO_CB(skb)->is_flist = 0;
456457
if (skb->dev->features & NETIF_F_GRO_FRAGLIST)
457458
NAPI_GRO_CB(skb)->is_flist = sk ? !udp_sk(sk)->gro_enabled: 1;
458459

net/mac80211/tx.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3611,7 +3611,8 @@ struct sk_buff *ieee80211_tx_dequeue(struct ieee80211_hw *hw,
36113611
* Drop unicast frames to unauthorised stations unless they are
36123612
* EAPOL frames from the local station.
36133613
*/
3614-
if (unlikely(!ieee80211_vif_is_mesh(&tx.sdata->vif) &&
3614+
if (unlikely(ieee80211_is_data(hdr->frame_control) &&
3615+
!ieee80211_vif_is_mesh(&tx.sdata->vif) &&
36153616
tx.sdata->vif.type != NL80211_IFTYPE_OCB &&
36163617
!is_multicast_ether_addr(hdr->addr1) &&
36173618
!test_sta_flag(tx.sta, WLAN_STA_AUTHORIZED) &&

net/sctp/ipv6.c

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,8 @@ static void sctp_v6_get_dst(struct sctp_transport *t, union sctp_addr *saddr,
228228
{
229229
struct sctp_association *asoc = t->asoc;
230230
struct dst_entry *dst = NULL;
231-
struct flowi6 *fl6 = &fl->u.ip6;
231+
struct flowi _fl;
232+
struct flowi6 *fl6 = &_fl.u.ip6;
232233
struct sctp_bind_addr *bp;
233234
struct ipv6_pinfo *np = inet6_sk(sk);
234235
struct sctp_sockaddr_entry *laddr;
@@ -238,7 +239,7 @@ static void sctp_v6_get_dst(struct sctp_transport *t, union sctp_addr *saddr,
238239
enum sctp_scope scope;
239240
__u8 matchlen = 0;
240241

241-
memset(fl6, 0, sizeof(struct flowi6));
242+
memset(&_fl, 0, sizeof(_fl));
242243
fl6->daddr = daddr->v6.sin6_addr;
243244
fl6->fl6_dport = daddr->v6.sin6_port;
244245
fl6->flowi6_proto = IPPROTO_SCTP;
@@ -276,8 +277,11 @@ static void sctp_v6_get_dst(struct sctp_transport *t, union sctp_addr *saddr,
276277
rcu_read_unlock();
277278

278279
dst = ip6_dst_lookup_flow(sock_net(sk), sk, fl6, final_p);
279-
if (!asoc || saddr)
280+
if (!asoc || saddr) {
281+
t->dst = dst;
282+
memcpy(fl, &_fl, sizeof(_fl));
280283
goto out;
284+
}
281285

282286
bp = &asoc->base.bind_addr;
283287
scope = sctp_scope(daddr);
@@ -300,6 +304,8 @@ static void sctp_v6_get_dst(struct sctp_transport *t, union sctp_addr *saddr,
300304
if ((laddr->a.sa.sa_family == AF_INET6) &&
301305
(sctp_v6_cmp_addr(&dst_saddr, &laddr->a))) {
302306
rcu_read_unlock();
307+
t->dst = dst;
308+
memcpy(fl, &_fl, sizeof(_fl));
303309
goto out;
304310
}
305311
}
@@ -338,6 +344,8 @@ static void sctp_v6_get_dst(struct sctp_transport *t, union sctp_addr *saddr,
338344
if (!IS_ERR_OR_NULL(dst))
339345
dst_release(dst);
340346
dst = bdst;
347+
t->dst = dst;
348+
memcpy(fl, &_fl, sizeof(_fl));
341349
break;
342350
}
343351

@@ -351,6 +359,8 @@ static void sctp_v6_get_dst(struct sctp_transport *t, union sctp_addr *saddr,
351359
dst_release(dst);
352360
dst = bdst;
353361
matchlen = bmatchlen;
362+
t->dst = dst;
363+
memcpy(fl, &_fl, sizeof(_fl));
354364
}
355365
rcu_read_unlock();
356366

@@ -359,14 +369,12 @@ static void sctp_v6_get_dst(struct sctp_transport *t, union sctp_addr *saddr,
359369
struct rt6_info *rt;
360370

361371
rt = (struct rt6_info *)dst;
362-
t->dst = dst;
363372
t->dst_cookie = rt6_get_cookie(rt);
364373
pr_debug("rt6_dst:%pI6/%d rt6_src:%pI6\n",
365374
&rt->rt6i_dst.addr, rt->rt6i_dst.plen,
366-
&fl6->saddr);
375+
&fl->u.ip6.saddr);
367376
} else {
368377
t->dst = NULL;
369-
370378
pr_debug("no route\n");
371379
}
372380
}

0 commit comments

Comments
 (0)