Skip to content

Commit 26d310a

Browse files
committed
tgupdate: merge t/DO-NOT-MERGE-mptcp-enabled-by-default into t/upstream base
2 parents b478b4d + f8dfddc commit 26d310a

File tree

8 files changed

+101
-34
lines changed

8 files changed

+101
-34
lines changed

MAINTAINERS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16508,6 +16508,7 @@ F: include/linux/netdev*
1650816508
F: include/linux/netlink.h
1650916509
F: include/linux/netpoll.h
1651016510
F: include/linux/rtnetlink.h
16511+
F: include/linux/sctp.h
1651116512
F: include/linux/seq_file_net.h
1651216513
F: include/linux/skbuff*
1651316514
F: include/net/
@@ -16524,6 +16525,7 @@ F: include/uapi/linux/netdev*
1652416525
F: include/uapi/linux/netlink.h
1652516526
F: include/uapi/linux/netlink_diag.h
1652616527
F: include/uapi/linux/rtnetlink.h
16528+
F: include/uapi/linux/sctp.h
1652716529
F: lib/net_utils.c
1652816530
F: lib/random32.c
1652916531
F: net/

drivers/net/ethernet/intel/idpf/idpf_lib.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2159,8 +2159,13 @@ static int idpf_open(struct net_device *netdev)
21592159
idpf_vport_ctrl_lock(netdev);
21602160
vport = idpf_netdev_to_vport(netdev);
21612161

2162+
err = idpf_set_real_num_queues(vport);
2163+
if (err)
2164+
goto unlock;
2165+
21622166
err = idpf_vport_open(vport);
21632167

2168+
unlock:
21642169
idpf_vport_ctrl_unlock(netdev);
21652170

21662171
return err;

drivers/net/ethernet/intel/idpf/idpf_txrx.c

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3008,8 +3008,6 @@ static int idpf_rx_rsc(struct idpf_rx_queue *rxq, struct sk_buff *skb,
30083008
return -EINVAL;
30093009

30103010
rsc_segments = DIV_ROUND_UP(skb->data_len, rsc_seg_len);
3011-
if (unlikely(rsc_segments == 1))
3012-
return 0;
30133011

30143012
NAPI_GRO_CB(skb)->count = rsc_segments;
30153013
skb_shinfo(skb)->gso_size = rsc_seg_len;
@@ -3072,6 +3070,7 @@ idpf_rx_process_skb_fields(struct idpf_rx_queue *rxq, struct sk_buff *skb,
30723070
idpf_rx_hash(rxq, skb, rx_desc, decoded);
30733071

30743072
skb->protocol = eth_type_trans(skb, rxq->netdev);
3073+
skb_record_rx_queue(skb, rxq->idx);
30753074

30763075
if (le16_get_bits(rx_desc->hdrlen_flags,
30773076
VIRTCHNL2_RX_FLEX_DESC_ADV_RSC_M))
@@ -3080,8 +3079,6 @@ idpf_rx_process_skb_fields(struct idpf_rx_queue *rxq, struct sk_buff *skb,
30803079
csum_bits = idpf_rx_splitq_extract_csum_bits(rx_desc);
30813080
idpf_rx_csum(rxq, skb, csum_bits, decoded);
30823081

3083-
skb_record_rx_queue(skb, rxq->idx);
3084-
30853082
return 0;
30863083
}
30873084

drivers/net/ethernet/intel/igc/igc_main.c

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1096,6 +1096,7 @@ static int igc_init_empty_frame(struct igc_ring *ring,
10961096
return -ENOMEM;
10971097
}
10981098

1099+
buffer->type = IGC_TX_BUFFER_TYPE_SKB;
10991100
buffer->skb = skb;
11001101
buffer->protocol = 0;
11011102
buffer->bytecount = skb->len;
@@ -2701,8 +2702,9 @@ static int igc_clean_rx_irq(struct igc_q_vector *q_vector, const int budget)
27012702
}
27022703

27032704
static struct sk_buff *igc_construct_skb_zc(struct igc_ring *ring,
2704-
struct xdp_buff *xdp)
2705+
struct igc_xdp_buff *ctx)
27052706
{
2707+
struct xdp_buff *xdp = &ctx->xdp;
27062708
unsigned int totalsize = xdp->data_end - xdp->data_meta;
27072709
unsigned int metasize = xdp->data - xdp->data_meta;
27082710
struct sk_buff *skb;
@@ -2721,27 +2723,28 @@ static struct sk_buff *igc_construct_skb_zc(struct igc_ring *ring,
27212723
__skb_pull(skb, metasize);
27222724
}
27232725

2726+
if (ctx->rx_ts) {
2727+
skb_shinfo(skb)->tx_flags |= SKBTX_HW_TSTAMP_NETDEV;
2728+
skb_hwtstamps(skb)->netdev_data = ctx->rx_ts;
2729+
}
2730+
27242731
return skb;
27252732
}
27262733

27272734
static void igc_dispatch_skb_zc(struct igc_q_vector *q_vector,
27282735
union igc_adv_rx_desc *desc,
2729-
struct xdp_buff *xdp,
2730-
ktime_t timestamp)
2736+
struct igc_xdp_buff *ctx)
27312737
{
27322738
struct igc_ring *ring = q_vector->rx.ring;
27332739
struct sk_buff *skb;
27342740

2735-
skb = igc_construct_skb_zc(ring, xdp);
2741+
skb = igc_construct_skb_zc(ring, ctx);
27362742
if (!skb) {
27372743
ring->rx_stats.alloc_failed++;
27382744
set_bit(IGC_RING_FLAG_RX_ALLOC_FAILED, &ring->flags);
27392745
return;
27402746
}
27412747

2742-
if (timestamp)
2743-
skb_hwtstamps(skb)->hwtstamp = timestamp;
2744-
27452748
if (igc_cleanup_headers(ring, desc, skb))
27462749
return;
27472750

@@ -2777,7 +2780,6 @@ static int igc_clean_rx_irq_zc(struct igc_q_vector *q_vector, const int budget)
27772780
union igc_adv_rx_desc *desc;
27782781
struct igc_rx_buffer *bi;
27792782
struct igc_xdp_buff *ctx;
2780-
ktime_t timestamp = 0;
27812783
unsigned int size;
27822784
int res;
27832785

@@ -2807,6 +2809,8 @@ static int igc_clean_rx_irq_zc(struct igc_q_vector *q_vector, const int budget)
28072809
*/
28082810
bi->xdp->data_meta += IGC_TS_HDR_LEN;
28092811
size -= IGC_TS_HDR_LEN;
2812+
} else {
2813+
ctx->rx_ts = NULL;
28102814
}
28112815

28122816
bi->xdp->data_end = bi->xdp->data + size;
@@ -2815,7 +2819,7 @@ static int igc_clean_rx_irq_zc(struct igc_q_vector *q_vector, const int budget)
28152819
res = __igc_xdp_run_prog(adapter, prog, bi->xdp);
28162820
switch (res) {
28172821
case IGC_XDP_PASS:
2818-
igc_dispatch_skb_zc(q_vector, desc, bi->xdp, timestamp);
2822+
igc_dispatch_skb_zc(q_vector, desc, ctx);
28192823
fallthrough;
28202824
case IGC_XDP_CONSUMED:
28212825
xsk_buff_free(bi->xdp);

drivers/net/ethernet/intel/ixgbe/ixgbe_main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2105,7 +2105,7 @@ static void ixgbe_put_rx_buffer(struct ixgbe_ring *rx_ring,
21052105
/* hand second half of page back to the ring */
21062106
ixgbe_reuse_rx_page(rx_ring, rx_buffer);
21072107
} else {
2108-
if (!IS_ERR(skb) && IXGBE_CB(skb)->dma == rx_buffer->dma) {
2108+
if (skb && IXGBE_CB(skb)->dma == rx_buffer->dma) {
21092109
/* the page has been released from the ring */
21102110
IXGBE_CB(skb)->page_released = true;
21112111
} else {

drivers/net/ethernet/ti/am65-cpsw-nuss.c

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -828,21 +828,30 @@ static void am65_cpsw_nuss_xmit_free(struct am65_cpsw_tx_chn *tx_chn,
828828
static void am65_cpsw_nuss_tx_cleanup(void *data, dma_addr_t desc_dma)
829829
{
830830
struct am65_cpsw_tx_chn *tx_chn = data;
831+
enum am65_cpsw_tx_buf_type buf_type;
831832
struct cppi5_host_desc_t *desc_tx;
833+
struct xdp_frame *xdpf;
832834
struct sk_buff *skb;
833835
void **swdata;
834836

835837
desc_tx = k3_cppi_desc_pool_dma2virt(tx_chn->desc_pool, desc_dma);
836838
swdata = cppi5_hdesc_get_swdata(desc_tx);
837-
skb = *(swdata);
838-
am65_cpsw_nuss_xmit_free(tx_chn, desc_tx);
839+
buf_type = am65_cpsw_nuss_buf_type(tx_chn, desc_dma);
840+
if (buf_type == AM65_CPSW_TX_BUF_TYPE_SKB) {
841+
skb = *(swdata);
842+
dev_kfree_skb_any(skb);
843+
} else {
844+
xdpf = *(swdata);
845+
xdp_return_frame(xdpf);
846+
}
839847

840-
dev_kfree_skb_any(skb);
848+
am65_cpsw_nuss_xmit_free(tx_chn, desc_tx);
841849
}
842850

843851
static struct sk_buff *am65_cpsw_build_skb(void *page_addr,
844852
struct net_device *ndev,
845-
unsigned int len)
853+
unsigned int len,
854+
unsigned int headroom)
846855
{
847856
struct sk_buff *skb;
848857

@@ -852,7 +861,7 @@ static struct sk_buff *am65_cpsw_build_skb(void *page_addr,
852861
if (unlikely(!skb))
853862
return NULL;
854863

855-
skb_reserve(skb, AM65_CPSW_HEADROOM);
864+
skb_reserve(skb, headroom);
856865
skb->dev = ndev;
857866

858867
return skb;
@@ -1169,9 +1178,11 @@ static int am65_cpsw_run_xdp(struct am65_cpsw_rx_flow *flow,
11691178
struct xdp_frame *xdpf;
11701179
struct bpf_prog *prog;
11711180
struct page *page;
1181+
int pkt_len;
11721182
u32 act;
11731183
int err;
11741184

1185+
pkt_len = *len;
11751186
prog = READ_ONCE(port->xdp_prog);
11761187
if (!prog)
11771188
return AM65_CPSW_XDP_PASS;
@@ -1189,8 +1200,10 @@ static int am65_cpsw_run_xdp(struct am65_cpsw_rx_flow *flow,
11891200
netif_txq = netdev_get_tx_queue(ndev, tx_chn->id);
11901201

11911202
xdpf = xdp_convert_buff_to_frame(xdp);
1192-
if (unlikely(!xdpf))
1203+
if (unlikely(!xdpf)) {
1204+
ndev->stats.tx_dropped++;
11931205
goto drop;
1206+
}
11941207

11951208
__netif_tx_lock(netif_txq, cpu);
11961209
err = am65_cpsw_xdp_tx_frame(ndev, tx_chn, xdpf,
@@ -1199,14 +1212,14 @@ static int am65_cpsw_run_xdp(struct am65_cpsw_rx_flow *flow,
11991212
if (err)
12001213
goto drop;
12011214

1202-
dev_sw_netstats_tx_add(ndev, 1, *len);
1215+
dev_sw_netstats_rx_add(ndev, pkt_len);
12031216
ret = AM65_CPSW_XDP_CONSUMED;
12041217
goto out;
12051218
case XDP_REDIRECT:
12061219
if (unlikely(xdp_do_redirect(ndev, xdp, prog)))
12071220
goto drop;
12081221

1209-
dev_sw_netstats_rx_add(ndev, *len);
1222+
dev_sw_netstats_rx_add(ndev, pkt_len);
12101223
ret = AM65_CPSW_XDP_REDIRECT;
12111224
goto out;
12121225
default:
@@ -1315,16 +1328,8 @@ static int am65_cpsw_nuss_rx_packets(struct am65_cpsw_rx_flow *flow,
13151328
dev_dbg(dev, "%s rx csum_info:%#x\n", __func__, csum_info);
13161329

13171330
dma_unmap_single(rx_chn->dma_dev, buf_dma, buf_dma_len, DMA_FROM_DEVICE);
1318-
13191331
k3_cppi_desc_pool_free(rx_chn->desc_pool, desc_rx);
13201332

1321-
skb = am65_cpsw_build_skb(page_addr, ndev,
1322-
AM65_CPSW_MAX_PACKET_SIZE);
1323-
if (unlikely(!skb)) {
1324-
new_page = page;
1325-
goto requeue;
1326-
}
1327-
13281333
if (port->xdp_prog) {
13291334
xdp_init_buff(&xdp, PAGE_SIZE, &port->xdp_rxq[flow->id]);
13301335
xdp_prepare_buff(&xdp, page_addr, AM65_CPSW_HEADROOM,
@@ -1334,9 +1339,16 @@ static int am65_cpsw_nuss_rx_packets(struct am65_cpsw_rx_flow *flow,
13341339
if (*xdp_state != AM65_CPSW_XDP_PASS)
13351340
goto allocate;
13361341

1337-
/* Compute additional headroom to be reserved */
1338-
headroom = (xdp.data - xdp.data_hard_start) - skb_headroom(skb);
1339-
skb_reserve(skb, headroom);
1342+
headroom = xdp.data - xdp.data_hard_start;
1343+
} else {
1344+
headroom = AM65_CPSW_HEADROOM;
1345+
}
1346+
1347+
skb = am65_cpsw_build_skb(page_addr, ndev,
1348+
AM65_CPSW_MAX_PACKET_SIZE, headroom);
1349+
if (unlikely(!skb)) {
1350+
new_page = page;
1351+
goto requeue;
13401352
}
13411353

13421354
ndev_priv = netdev_priv(ndev);

net/vmw_vsock/af_vsock.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -824,13 +824,19 @@ static void __vsock_release(struct sock *sk, int level)
824824
*/
825825
lock_sock_nested(sk, level);
826826

827-
sock_orphan(sk);
827+
/* Indicate to vsock_remove_sock() that the socket is being released and
828+
* can be removed from the bound_table. Unlike transport reassignment
829+
* case, where the socket must remain bound despite vsock_remove_sock()
830+
* being called from the transport release() callback.
831+
*/
832+
sock_set_flag(sk, SOCK_DEAD);
828833

829834
if (vsk->transport)
830835
vsk->transport->release(vsk);
831836
else if (sock_type_connectible(sk->sk_type))
832837
vsock_remove_sock(vsk);
833838

839+
sock_orphan(sk);
834840
sk->sk_shutdown = SHUTDOWN_MASK;
835841

836842
skb_queue_purge(&sk->sk_receive_queue);

tools/testing/vsock/vsock_test.c

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1788,6 +1788,42 @@ static void test_stream_connect_retry_server(const struct test_opts *opts)
17881788
close(fd);
17891789
}
17901790

1791+
static void test_stream_linger_client(const struct test_opts *opts)
1792+
{
1793+
struct linger optval = {
1794+
.l_onoff = 1,
1795+
.l_linger = 1
1796+
};
1797+
int fd;
1798+
1799+
fd = vsock_stream_connect(opts->peer_cid, opts->peer_port);
1800+
if (fd < 0) {
1801+
perror("connect");
1802+
exit(EXIT_FAILURE);
1803+
}
1804+
1805+
if (setsockopt(fd, SOL_SOCKET, SO_LINGER, &optval, sizeof(optval))) {
1806+
perror("setsockopt(SO_LINGER)");
1807+
exit(EXIT_FAILURE);
1808+
}
1809+
1810+
close(fd);
1811+
}
1812+
1813+
static void test_stream_linger_server(const struct test_opts *opts)
1814+
{
1815+
int fd;
1816+
1817+
fd = vsock_stream_accept(VMADDR_CID_ANY, opts->peer_port, NULL);
1818+
if (fd < 0) {
1819+
perror("accept");
1820+
exit(EXIT_FAILURE);
1821+
}
1822+
1823+
vsock_wait_remote_close(fd);
1824+
close(fd);
1825+
}
1826+
17911827
static struct test_case test_cases[] = {
17921828
{
17931829
.name = "SOCK_STREAM connection reset",
@@ -1943,6 +1979,11 @@ static struct test_case test_cases[] = {
19431979
.run_client = test_stream_connect_retry_client,
19441980
.run_server = test_stream_connect_retry_server,
19451981
},
1982+
{
1983+
.name = "SOCK_STREAM SO_LINGER null-ptr-deref",
1984+
.run_client = test_stream_linger_client,
1985+
.run_server = test_stream_linger_server,
1986+
},
19461987
{},
19471988
};
19481989

0 commit comments

Comments
 (0)