diff --git a/patches.suse/msft-hv-2513-video-hyperv_fb-Fix-validation-of-screen-resolution.patch b/patches.suse/msft-hv-2513-video-hyperv_fb-Fix-validation-of-screen-resolution.patch new file mode 100644 index 0000000..3231106 --- /dev/null +++ b/patches.suse/msft-hv-2513-video-hyperv_fb-Fix-validation-of-screen-resolution.patch @@ -0,0 +1,93 @@ +From: Michael Kelley +Date: Sun, 16 Jan 2022 11:18:31 -0800 +Patch-mainline: v5.17-rc2 +Subject: video: hyperv_fb: Fix validation of screen resolution +Git-commit: 9ff5549b1d1d3c3a9d71220d44bd246586160f1d +References: git-fixes + +In the WIN10 version of the Synthetic Video protocol with Hyper-V, +Hyper-V reports a list of supported resolutions as part of the protocol +negotiation. The driver calculates the maximum width and height from +the list of resolutions, and uses those maximums to validate any screen +resolution specified in the video= option on the kernel boot line. + +This method of validation is incorrect. For example, the list of +supported resolutions could contain 1600x1200 and 1920x1080, both of +which fit in an 8 Mbyte frame buffer. But calculating the max width +and height yields 1920 and 1200, and 1920x1200 resolution does not fit +in an 8 Mbyte frame buffer. Unfortunately, this resolution is accepted, +causing a kernel fault when the driver accesses memory outside the +frame buffer. + +Instead, validate the specified screen resolution by calculating +its size, and comparing against the frame buffer size. Delete the +code for calculating the max width and height from the list of +resolutions, since these max values have no use. Also add the +frame buffer size to the info message to aid in understanding why +a resolution might be rejected. + +Fixes: 67e7cdb4829d ("video: hyperv: hyperv_fb: Obtain screen resolution from Hyper-V host") +Signed-off-by: Michael Kelley +Reviewed-by: Haiyang Zhang +Acked-by: Helge Deller +Link: https://lore.kernel.org/r/1642360711-2335-1-git-send-email-mikelley@microsoft.com +Signed-off-by: Wei Liu +Acked-by: Olaf Hering +--- + drivers/video/fbdev/hyperv_fb.c | 16 +++------------- + 1 file changed, 3 insertions(+), 13 deletions(-) + +diff --git a/drivers/video/fbdev/hyperv_fb.c b/drivers/video/fbdev/hyperv_fb.c +--- a/drivers/video/fbdev/hyperv_fb.c ++++ b/drivers/video/fbdev/hyperv_fb.c +@@ -287,8 +287,6 @@ struct hvfb_par { + + static uint screen_width = HVFB_WIDTH; + static uint screen_height = HVFB_HEIGHT; +-static uint screen_width_max = HVFB_WIDTH; +-static uint screen_height_max = HVFB_HEIGHT; + static uint screen_depth; + static uint screen_fb_size; + static uint dio_fb_size; /* FB size for deferred IO */ +@@ -582,7 +580,6 @@ static int synthvid_get_supported_resolution(struct hv_device *hdev) + int ret = 0; + unsigned long t; + u8 index; +- int i; + + memset(msg, 0, sizeof(struct synthvid_msg)); + msg->vid_hdr.type = SYNTHVID_RESOLUTION_REQUEST; +@@ -613,13 +610,6 @@ static int synthvid_get_supported_resolution(struct hv_device *hdev) + goto out; + } + +- for (i = 0; i < msg->resolution_resp.resolution_count; i++) { +- screen_width_max = max_t(unsigned int, screen_width_max, +- msg->resolution_resp.supported_resolution[i].width); +- screen_height_max = max_t(unsigned int, screen_height_max, +- msg->resolution_resp.supported_resolution[i].height); +- } +- + screen_width = + msg->resolution_resp.supported_resolution[index].width; + screen_height = +@@ -941,7 +931,7 @@ static void hvfb_get_option(struct fb_info *info) + + if (x < HVFB_WIDTH_MIN || y < HVFB_HEIGHT_MIN || + (synthvid_ver_ge(par->synthvid_version, SYNTHVID_VERSION_WIN10) && +- (x > screen_width_max || y > screen_height_max)) || ++ (x * y * screen_depth / 8 > screen_fb_size)) || + (par->synthvid_version == SYNTHVID_VERSION_WIN8 && + x * y * screen_depth / 8 > SYNTHVID_FB_SIZE_WIN8) || + (par->synthvid_version == SYNTHVID_VERSION_WIN7 && +@@ -1194,8 +1184,8 @@ static int hvfb_probe(struct hv_device *hdev, + } + + hvfb_get_option(info); +- pr_info("Screen resolution: %dx%d, Color depth: %d\n", +- screen_width, screen_height, screen_depth); ++ pr_info("Screen resolution: %dx%d, Color depth: %d, Frame buffer size: %d\n", ++ screen_width, screen_height, screen_depth, screen_fb_size); + + ret = hvfb_getmem(hdev, info); + if (ret) { diff --git a/patches.suse/msft-hv-2514-net-mana-Use-struct_size-helper-in-mana_gd_create_dm.patch b/patches.suse/msft-hv-2514-net-mana-Use-struct_size-helper-in-mana_gd_create_dm.patch new file mode 100644 index 0000000..9f23eed --- /dev/null +++ b/patches.suse/msft-hv-2514-net-mana-Use-struct_size-helper-in-mana_gd_create_dm.patch @@ -0,0 +1,44 @@ +From: "Gustavo A. R. Silva" +Date: Mon, 24 Jan 2022 15:43:47 -0600 +Patch-mainline: v5.18-rc1 +Subject: net: mana: Use struct_size() helper in mana_gd_create_dma_region() +Git-commit: 10cdc794dae890fb3149e90854e8440cf5bf615e +References: bsc#1195651 + +Make use of the struct_size() helper instead of an open-coded version, +in order to avoid any potential type mistakes or integer overflows that, +in the worst scenario, could lead to heap overflows. + +Also, address the following sparse warnings: +drivers/net/ethernet/microsoft/mana/gdma_main.c:677:24: warning: using sizeof on a flexible structure + +Link: https://github.com/KSPP/linux/issues/174 +Signed-off-by: Gustavo A. R. Silva +Reviewed-by: Dexuan Cui +Signed-off-by: David S. Miller +Acked-by: Olaf Hering +--- + drivers/net/ethernet/microsoft/mana/gdma_main.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/ethernet/microsoft/mana/gdma_main.c b/drivers/net/ethernet/microsoft/mana/gdma_main.c +--- a/drivers/net/ethernet/microsoft/mana/gdma_main.c ++++ b/drivers/net/ethernet/microsoft/mana/gdma_main.c +@@ -663,7 +663,7 @@ static int mana_gd_create_dma_region(struct gdma_dev *gd, + struct gdma_context *gc = gd->gdma_context; + struct hw_channel_context *hwc; + u32 length = gmi->length; +- u32 req_msg_size; ++ size_t req_msg_size; + int err; + int i; + +@@ -674,7 +674,7 @@ static int mana_gd_create_dma_region(struct gdma_dev *gd, + return -EINVAL; + + hwc = gc->hwc.driver_data; +- req_msg_size = sizeof(*req) + num_page * sizeof(u64); ++ req_msg_size = struct_size(req, page_addr_list, num_page); + if (req_msg_size > hwc->max_req_msg_size) + return -EINVAL; + diff --git a/patches.suse/msft-hv-2516-net-mana-Add-counter-for-packet-dropped-by-XDP.patch b/patches.suse/msft-hv-2516-net-mana-Add-counter-for-packet-dropped-by-XDP.patch new file mode 100644 index 0000000..4f10422 --- /dev/null +++ b/patches.suse/msft-hv-2516-net-mana-Add-counter-for-packet-dropped-by-XDP.patch @@ -0,0 +1,221 @@ +From: Haiyang Zhang +Date: Fri, 28 Jan 2022 18:03:36 -0800 +Patch-mainline: v5.18-rc1 +Subject: net: mana: Add counter for packet dropped by XDP +Git-commit: f90f84201edde2bca25a73226ff0ebe765273890 +References: bsc#1195651 + +This counter will show up in ethtool stat data. + +Signed-off-by: Haiyang Zhang +Signed-off-by: David S. Miller +Acked-by: Olaf Hering +--- + drivers/net/ethernet/microsoft/mana/mana.h | 13 ++++++-- + drivers/net/ethernet/microsoft/mana/mana_en.c | 35 +++++++++++++--------- + drivers/net/ethernet/microsoft/mana/mana_ethtool.c | 30 +++++++++++-------- + 3 files changed, 49 insertions(+), 29 deletions(-) + +diff --git a/drivers/net/ethernet/microsoft/mana/mana.h b/drivers/net/ethernet/microsoft/mana/mana.h +--- a/drivers/net/ethernet/microsoft/mana/mana.h ++++ b/drivers/net/ethernet/microsoft/mana/mana.h +@@ -48,7 +48,14 @@ enum TRI_STATE { + + #define MAX_PORTS_IN_MANA_DEV 256 + +-struct mana_stats { ++struct mana_stats_rx { ++ u64 packets; ++ u64 bytes; ++ u64 xdp_drop; ++ struct u64_stats_sync syncp; ++}; ++ ++struct mana_stats_tx { + u64 packets; + u64 bytes; + struct u64_stats_sync syncp; +@@ -76,7 +83,7 @@ struct mana_txq { + + atomic_t pending_sends; + +- struct mana_stats stats; ++ struct mana_stats_tx stats; + }; + + /* skb data and frags dma mappings */ +@@ -298,7 +305,7 @@ struct mana_rxq { + + u32 buf_index; + +- struct mana_stats stats; ++ struct mana_stats_rx stats; + + struct bpf_prog __rcu *bpf_prog; + struct xdp_rxq_info xdp_rxq; +diff --git a/drivers/net/ethernet/microsoft/mana/mana_en.c b/drivers/net/ethernet/microsoft/mana/mana_en.c +--- a/drivers/net/ethernet/microsoft/mana/mana_en.c ++++ b/drivers/net/ethernet/microsoft/mana/mana_en.c +@@ -136,7 +136,7 @@ int mana_start_xmit(struct sk_buff *skb, struct net_device *ndev) + bool ipv4 = false, ipv6 = false; + struct mana_tx_package pkg = {}; + struct netdev_queue *net_txq; +- struct mana_stats *tx_stats; ++ struct mana_stats_tx *tx_stats; + struct gdma_queue *gdma_sq; + unsigned int csum_type; + struct mana_txq *txq; +@@ -299,7 +299,8 @@ static void mana_get_stats64(struct net_device *ndev, + { + struct mana_port_context *apc = netdev_priv(ndev); + unsigned int num_queues = apc->num_queues; +- struct mana_stats *stats; ++ struct mana_stats_rx *rx_stats; ++ struct mana_stats_tx *tx_stats; + unsigned int start; + u64 packets, bytes; + int q; +@@ -310,26 +311,26 @@ static void mana_get_stats64(struct net_device *ndev, + netdev_stats_to_stats64(st, &ndev->stats); + + for (q = 0; q < num_queues; q++) { +- stats = &apc->rxqs[q]->stats; ++ rx_stats = &apc->rxqs[q]->stats; + + do { +- start = u64_stats_fetch_begin_irq(&stats->syncp); +- packets = stats->packets; +- bytes = stats->bytes; +- } while (u64_stats_fetch_retry_irq(&stats->syncp, start)); ++ start = u64_stats_fetch_begin_irq(&rx_stats->syncp); ++ packets = rx_stats->packets; ++ bytes = rx_stats->bytes; ++ } while (u64_stats_fetch_retry_irq(&rx_stats->syncp, start)); + + st->rx_packets += packets; + st->rx_bytes += bytes; + } + + for (q = 0; q < num_queues; q++) { +- stats = &apc->tx_qp[q].txq.stats; ++ tx_stats = &apc->tx_qp[q].txq.stats; + + do { +- start = u64_stats_fetch_begin_irq(&stats->syncp); +- packets = stats->packets; +- bytes = stats->bytes; +- } while (u64_stats_fetch_retry_irq(&stats->syncp, start)); ++ start = u64_stats_fetch_begin_irq(&tx_stats->syncp); ++ packets = tx_stats->packets; ++ bytes = tx_stats->bytes; ++ } while (u64_stats_fetch_retry_irq(&tx_stats->syncp, start)); + + st->tx_packets += packets; + st->tx_bytes += bytes; +@@ -986,7 +987,7 @@ static struct sk_buff *mana_build_skb(void *buf_va, uint pkt_len, + static void mana_rx_skb(void *buf_va, struct mana_rxcomp_oob *cqe, + struct mana_rxq *rxq) + { +- struct mana_stats *rx_stats = &rxq->stats; ++ struct mana_stats_rx *rx_stats = &rxq->stats; + struct net_device *ndev = rxq->ndev; + uint pkt_len = cqe->ppi[0].pkt_len; + u16 rxq_idx = rxq->rxq_idx; +@@ -1007,7 +1008,7 @@ static void mana_rx_skb(void *buf_va, struct mana_rxcomp_oob *cqe, + act = mana_run_xdp(ndev, rxq, &xdp, buf_va, pkt_len); + + if (act != XDP_PASS && act != XDP_TX) +- goto drop; ++ goto drop_xdp; + + skb = mana_build_skb(buf_va, pkt_len, &xdp); + +@@ -1048,9 +1049,15 @@ static void mana_rx_skb(void *buf_va, struct mana_rxcomp_oob *cqe, + u64_stats_update_end(&rx_stats->syncp); + return; + ++drop_xdp: ++ u64_stats_update_begin(&rx_stats->syncp); ++ rx_stats->xdp_drop++; ++ u64_stats_update_end(&rx_stats->syncp); ++ + drop: + free_page((unsigned long)buf_va); + ++ndev->stats.rx_dropped; ++ + return; + } + +diff --git a/drivers/net/ethernet/microsoft/mana/mana_ethtool.c b/drivers/net/ethernet/microsoft/mana/mana_ethtool.c +--- a/drivers/net/ethernet/microsoft/mana/mana_ethtool.c ++++ b/drivers/net/ethernet/microsoft/mana/mana_ethtool.c +@@ -23,7 +23,7 @@ static int mana_get_sset_count(struct net_device *ndev, int stringset) + if (stringset != ETH_SS_STATS) + return -EINVAL; + +- return ARRAY_SIZE(mana_eth_stats) + num_queues * 4; ++ return ARRAY_SIZE(mana_eth_stats) + num_queues * 5; + } + + static void mana_get_strings(struct net_device *ndev, u32 stringset, u8 *data) +@@ -46,6 +46,8 @@ static void mana_get_strings(struct net_device *ndev, u32 stringset, u8 *data) + p += ETH_GSTRING_LEN; + sprintf(p, "rx_%d_bytes", i); + p += ETH_GSTRING_LEN; ++ sprintf(p, "rx_%d_xdp_drop", i); ++ p += ETH_GSTRING_LEN; + } + + for (i = 0; i < num_queues; i++) { +@@ -62,9 +64,11 @@ static void mana_get_ethtool_stats(struct net_device *ndev, + struct mana_port_context *apc = netdev_priv(ndev); + unsigned int num_queues = apc->num_queues; + void *eth_stats = &apc->eth_stats; +- struct mana_stats *stats; ++ struct mana_stats_rx *rx_stats; ++ struct mana_stats_tx *tx_stats; + unsigned int start; + u64 packets, bytes; ++ u64 xdp_drop; + int q, i = 0; + + if (!apc->port_is_up) +@@ -74,26 +78,28 @@ static void mana_get_ethtool_stats(struct net_device *ndev, + data[i++] = *(u64 *)(eth_stats + mana_eth_stats[q].offset); + + for (q = 0; q < num_queues; q++) { +- stats = &apc->rxqs[q]->stats; ++ rx_stats = &apc->rxqs[q]->stats; + + do { +- start = u64_stats_fetch_begin_irq(&stats->syncp); +- packets = stats->packets; +- bytes = stats->bytes; +- } while (u64_stats_fetch_retry_irq(&stats->syncp, start)); ++ start = u64_stats_fetch_begin_irq(&rx_stats->syncp); ++ packets = rx_stats->packets; ++ bytes = rx_stats->bytes; ++ xdp_drop = rx_stats->xdp_drop; ++ } while (u64_stats_fetch_retry_irq(&rx_stats->syncp, start)); + + data[i++] = packets; + data[i++] = bytes; ++ data[i++] = xdp_drop; + } + + for (q = 0; q < num_queues; q++) { +- stats = &apc->tx_qp[q].txq.stats; ++ tx_stats = &apc->tx_qp[q].txq.stats; + + do { +- start = u64_stats_fetch_begin_irq(&stats->syncp); +- packets = stats->packets; +- bytes = stats->bytes; +- } while (u64_stats_fetch_retry_irq(&stats->syncp, start)); ++ start = u64_stats_fetch_begin_irq(&tx_stats->syncp); ++ packets = tx_stats->packets; ++ bytes = tx_stats->bytes; ++ } while (u64_stats_fetch_retry_irq(&tx_stats->syncp, start)); + + data[i++] = packets; + data[i++] = bytes; diff --git a/patches.suse/msft-hv-2517-net-mana-Add-counter-for-XDP_TX.patch b/patches.suse/msft-hv-2517-net-mana-Add-counter-for-XDP_TX.patch new file mode 100644 index 0000000..aab3335 --- /dev/null +++ b/patches.suse/msft-hv-2517-net-mana-Add-counter-for-XDP_TX.patch @@ -0,0 +1,102 @@ +From: Haiyang Zhang +Date: Fri, 28 Jan 2022 18:03:37 -0800 +Patch-mainline: v5.18-rc1 +Subject: net: mana: Add counter for XDP_TX +Git-commit: d356abb95b9883198b1ba0db678659369701e17d +References: bsc#1195651 + +This counter will show up in ethtool stat. It is the +number of packets received and forwarded by XDP program. + +Signed-off-by: Haiyang Zhang +Signed-off-by: David S. Miller +Acked-by: Olaf Hering +--- + drivers/net/ethernet/microsoft/mana/mana.h | 1 + + drivers/net/ethernet/microsoft/mana/mana_en.c | 12 ++++++++---- + drivers/net/ethernet/microsoft/mana/mana_ethtool.c | 7 ++++++- + 3 files changed, 15 insertions(+), 5 deletions(-) + +diff --git a/drivers/net/ethernet/microsoft/mana/mana.h b/drivers/net/ethernet/microsoft/mana/mana.h +--- a/drivers/net/ethernet/microsoft/mana/mana.h ++++ b/drivers/net/ethernet/microsoft/mana/mana.h +@@ -52,6 +52,7 @@ struct mana_stats_rx { + u64 packets; + u64 bytes; + u64 xdp_drop; ++ u64 xdp_tx; + struct u64_stats_sync syncp; + }; + +diff --git a/drivers/net/ethernet/microsoft/mana/mana_en.c b/drivers/net/ethernet/microsoft/mana/mana_en.c +--- a/drivers/net/ethernet/microsoft/mana/mana_en.c ++++ b/drivers/net/ethernet/microsoft/mana/mana_en.c +@@ -1035,6 +1035,14 @@ static void mana_rx_skb(void *buf_va, struct mana_rxcomp_oob *cqe, + skb_set_hash(skb, hash_value, PKT_HASH_TYPE_L3); + } + ++ u64_stats_update_begin(&rx_stats->syncp); ++ rx_stats->packets++; ++ rx_stats->bytes += pkt_len; ++ ++ if (act == XDP_TX) ++ rx_stats->xdp_tx++; ++ u64_stats_update_end(&rx_stats->syncp); ++ + if (act == XDP_TX) { + skb_set_queue_mapping(skb, rxq_idx); + mana_xdp_tx(skb, ndev); +@@ -1043,10 +1051,6 @@ static void mana_rx_skb(void *buf_va, struct mana_rxcomp_oob *cqe, + + napi_gro_receive(napi, skb); + +- u64_stats_update_begin(&rx_stats->syncp); +- rx_stats->packets++; +- rx_stats->bytes += pkt_len; +- u64_stats_update_end(&rx_stats->syncp); + return; + + drop_xdp: +diff --git a/drivers/net/ethernet/microsoft/mana/mana_ethtool.c b/drivers/net/ethernet/microsoft/mana/mana_ethtool.c +--- a/drivers/net/ethernet/microsoft/mana/mana_ethtool.c ++++ b/drivers/net/ethernet/microsoft/mana/mana_ethtool.c +@@ -23,7 +23,7 @@ static int mana_get_sset_count(struct net_device *ndev, int stringset) + if (stringset != ETH_SS_STATS) + return -EINVAL; + +- return ARRAY_SIZE(mana_eth_stats) + num_queues * 5; ++ return ARRAY_SIZE(mana_eth_stats) + num_queues * 6; + } + + static void mana_get_strings(struct net_device *ndev, u32 stringset, u8 *data) +@@ -48,6 +48,8 @@ static void mana_get_strings(struct net_device *ndev, u32 stringset, u8 *data) + p += ETH_GSTRING_LEN; + sprintf(p, "rx_%d_xdp_drop", i); + p += ETH_GSTRING_LEN; ++ sprintf(p, "rx_%d_xdp_tx", i); ++ p += ETH_GSTRING_LEN; + } + + for (i = 0; i < num_queues; i++) { +@@ -69,6 +71,7 @@ static void mana_get_ethtool_stats(struct net_device *ndev, + unsigned int start; + u64 packets, bytes; + u64 xdp_drop; ++ u64 xdp_tx; + int q, i = 0; + + if (!apc->port_is_up) +@@ -85,11 +88,13 @@ static void mana_get_ethtool_stats(struct net_device *ndev, + packets = rx_stats->packets; + bytes = rx_stats->bytes; + xdp_drop = rx_stats->xdp_drop; ++ xdp_tx = rx_stats->xdp_tx; + } while (u64_stats_fetch_retry_irq(&rx_stats->syncp, start)); + + data[i++] = packets; + data[i++] = bytes; + data[i++] = xdp_drop; ++ data[i++] = xdp_tx; + } + + for (q = 0; q < num_queues; q++) { diff --git a/patches.suse/msft-hv-2518-net-mana-Reuse-XDP-dropped-page.patch b/patches.suse/msft-hv-2518-net-mana-Reuse-XDP-dropped-page.patch new file mode 100644 index 0000000..46a3993 --- /dev/null +++ b/patches.suse/msft-hv-2518-net-mana-Reuse-XDP-dropped-page.patch @@ -0,0 +1,68 @@ +From: Haiyang Zhang +Date: Fri, 28 Jan 2022 18:03:38 -0800 +Patch-mainline: v5.18-rc1 +Subject: net: mana: Reuse XDP dropped page +Git-commit: a6bf5703f17bdbd775c0e6837dd2d5b1c344e28c +References: bsc#1195651 + +Reuse the dropped page in RX path to save page allocation +overhead. + +Signed-off-by: Haiyang Zhang +Signed-off-by: David S. Miller +Acked-by: Olaf Hering +--- + drivers/net/ethernet/microsoft/mana/mana.h | 1 + + drivers/net/ethernet/microsoft/mana/mana_en.c | 15 +++++++++++++-- + 2 files changed, 14 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/ethernet/microsoft/mana/mana.h b/drivers/net/ethernet/microsoft/mana/mana.h +--- a/drivers/net/ethernet/microsoft/mana/mana.h ++++ b/drivers/net/ethernet/microsoft/mana/mana.h +@@ -310,6 +310,7 @@ struct mana_rxq { + + struct bpf_prog __rcu *bpf_prog; + struct xdp_rxq_info xdp_rxq; ++ struct page *xdp_save_page; + + /* MUST BE THE LAST MEMBER: + * Each receive buffer has an associated mana_recv_buf_oob. +diff --git a/drivers/net/ethernet/microsoft/mana/mana_en.c b/drivers/net/ethernet/microsoft/mana/mana_en.c +--- a/drivers/net/ethernet/microsoft/mana/mana_en.c ++++ b/drivers/net/ethernet/microsoft/mana/mana_en.c +@@ -1059,7 +1059,9 @@ drop_xdp: + u64_stats_update_end(&rx_stats->syncp); + + drop: +- free_page((unsigned long)buf_va); ++ WARN_ON_ONCE(rxq->xdp_save_page); ++ rxq->xdp_save_page = virt_to_page(buf_va); ++ + ++ndev->stats.rx_dropped; + + return; +@@ -1116,7 +1118,13 @@ static void mana_process_rx_cqe(struct mana_rxq *rxq, struct mana_cq *cq, + rxbuf_oob = &rxq->rx_oobs[curr]; + WARN_ON_ONCE(rxbuf_oob->wqe_inf.wqe_size_in_bu != 1); + +- new_page = alloc_page(GFP_ATOMIC); ++ /* Reuse XDP dropped page if available */ ++ if (rxq->xdp_save_page) { ++ new_page = rxq->xdp_save_page; ++ rxq->xdp_save_page = NULL; ++ } else { ++ new_page = alloc_page(GFP_ATOMIC); ++ } + + if (new_page) { + da = dma_map_page(dev, new_page, XDP_PACKET_HEADROOM, rxq->datasize, +@@ -1403,6 +1411,9 @@ static void mana_destroy_rxq(struct mana_port_context *apc, + + mana_deinit_cq(apc, &rxq->rx_cq); + ++ if (rxq->xdp_save_page) ++ __free_page(rxq->xdp_save_page); ++ + for (i = 0; i < rxq->num_rx_buf; i++) { + rx_oob = &rxq->rx_oobs[i]; + diff --git a/patches.suse/msft-hv-2523-net-mana-Add-handling-of-CQE_RX_TRUNCATED.patch b/patches.suse/msft-hv-2523-net-mana-Add-handling-of-CQE_RX_TRUNCATED.patch new file mode 100644 index 0000000..3ab9552 --- /dev/null +++ b/patches.suse/msft-hv-2523-net-mana-Add-handling-of-CQE_RX_TRUNCATED.patch @@ -0,0 +1,42 @@ +From: Haiyang Zhang +Date: Fri, 4 Feb 2022 14:45:44 -0800 +Patch-mainline: v5.18-rc1 +Subject: net: mana: Add handling of CQE_RX_TRUNCATED +Git-commit: e4b7621982d29f26ff4d39af389e5e675a4ffed4 +References: bsc#1195651 + +The proper way to drop this kind of CQE is advancing rxq tail +without indicating the packet to the upper network layer. + +Signed-off-by: Haiyang Zhang +Reviewed-by: Dexuan Cui +Signed-off-by: David S. Miller +Acked-by: Olaf Hering +--- + drivers/net/ethernet/microsoft/mana/mana_en.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/ethernet/microsoft/mana/mana_en.c b/drivers/net/ethernet/microsoft/mana/mana_en.c +--- a/drivers/net/ethernet/microsoft/mana/mana_en.c ++++ b/drivers/net/ethernet/microsoft/mana/mana_en.c +@@ -1085,8 +1085,10 @@ static void mana_process_rx_cqe(struct mana_rxq *rxq, struct mana_cq *cq, + break; + + case CQE_RX_TRUNCATED: +- netdev_err(ndev, "Dropped a truncated packet\n"); +- return; ++ ++ndev->stats.rx_dropped; ++ rxbuf_oob = &rxq->rx_oobs[rxq->buf_index]; ++ netdev_warn_once(ndev, "Dropped a truncated packet\n"); ++ goto drop; + + case CQE_RX_COALESCED_4: + netdev_err(ndev, "RX coalescing is unsupported\n"); +@@ -1154,6 +1156,7 @@ static void mana_process_rx_cqe(struct mana_rxq *rxq, struct mana_cq *cq, + + mana_rx_skb(old_buf, oob, rxq); + ++drop: + mana_move_wq_tail(rxq->gdma_rq, rxbuf_oob->wqe_inf.wqe_size_in_bu); + + mana_post_pkt_rxq(rxq); diff --git a/patches.suse/msft-hv-2524-net-mana-Remove-unnecessary-check-of-cqe_type-in-man.patch b/patches.suse/msft-hv-2524-net-mana-Remove-unnecessary-check-of-cqe_type-in-man.patch new file mode 100644 index 0000000..0f544f7 --- /dev/null +++ b/patches.suse/msft-hv-2524-net-mana-Remove-unnecessary-check-of-cqe_type-in-man.patch @@ -0,0 +1,31 @@ +From: Haiyang Zhang +Date: Fri, 4 Feb 2022 14:45:45 -0800 +Patch-mainline: v5.18-rc1 +Subject: net: mana: Remove unnecessary check of cqe_type in mana_process_rx_cqe() +Git-commit: 68f831355052706e1f8498653f6c4d36643c0db8 +References: bsc#1195651 + +The switch statement already ensures cqe_type == CQE_RX_OKAY at that +point. + +Signed-off-by: Haiyang Zhang +Reviewed-by: Dexuan Cui +Signed-off-by: David S. Miller +Acked-by: Olaf Hering +--- + drivers/net/ethernet/microsoft/mana/mana_en.c | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/drivers/net/ethernet/microsoft/mana/mana_en.c b/drivers/net/ethernet/microsoft/mana/mana_en.c +--- a/drivers/net/ethernet/microsoft/mana/mana_en.c ++++ b/drivers/net/ethernet/microsoft/mana/mana_en.c +@@ -1104,9 +1104,6 @@ static void mana_process_rx_cqe(struct mana_rxq *rxq, struct mana_cq *cq, + return; + } + +- if (oob->cqe_hdr.cqe_type != CQE_RX_OKAY) +- return; +- + pktlen = oob->ppi[0].pkt_len; + + if (pktlen == 0) { diff --git a/patches.suse/msft-hv-2588-PCI-hv-Do-not-set-PCI_COMMAND_MEMORY-to-reduce-VM-bo.patch b/patches.suse/msft-hv-2588-PCI-hv-Do-not-set-PCI_COMMAND_MEMORY-to-reduce-VM-bo.patch new file mode 100644 index 0000000..6c9c35b --- /dev/null +++ b/patches.suse/msft-hv-2588-PCI-hv-Do-not-set-PCI_COMMAND_MEMORY-to-reduce-VM-bo.patch @@ -0,0 +1,69 @@ +From: Dexuan Cui +Date: Mon, 2 May 2022 00:42:55 -0700 +Patch-mainline: v5.19-rc1 +Subject: PCI: hv: Do not set PCI_COMMAND_MEMORY to reduce VM boot time +Git-commit: 23e118a48acf7be223e57d98e98da8ac5a4071ac +References: bsc#1199314 + +Currently when the pci-hyperv driver finishes probing and initializing the +PCI device, it sets the PCI_COMMAND_MEMORY bit; later when the PCI device +is registered to the core PCI subsystem, the core PCI driver's BAR detection +and initialization code toggles the bit multiple times, and each toggling of +the bit causes the hypervisor to unmap/map the virtual BARs from/to the +physical BARs, which can be slow if the BAR sizes are huge, e.g., a Linux VM +with 14 GPU devices has to spend more than 3 minutes on BAR detection and +initialization, causing a long boot time. + +Reduce the boot time by not setting the PCI_COMMAND_MEMORY bit when we +register the PCI device (there is no need to have it set in the first place). +The bit stays off till the PCI device driver calls pci_enable_device(). +With this change, the boot time of such a 14-GPU VM is reduced by almost +3 minutes. + +Link: https://lore.kernel.org/lkml/20220419220007.26550-1-decui@microsoft.com/ +Tested-by: Boqun Feng (Microsoft) +Signed-off-by: Dexuan Cui +Reviewed-by: Michael Kelley +Acked-by: Lorenzo Pieralisi +Cc: Jake Oshins +Link: https://lore.kernel.org/r/20220502074255.16901-1-decui@microsoft.com +Signed-off-by: Wei Liu +Acked-by: Olaf Hering +--- + drivers/pci/controller/pci-hyperv.c | 18 +++++++++++------- + 1 file changed, 11 insertions(+), 7 deletions(-) + +--- a/drivers/pci/controller/pci-hyperv.c ++++ b/drivers/pci/controller/pci-hyperv.c +@@ -1671,7 +1671,6 @@ static void prepopulate_bars(struct hv_p + struct hv_pci_dev *hpdev; + unsigned long flags; + u64 bar_val; +- u32 command; + bool high; + int i; + +@@ -1729,12 +1728,17 @@ static void prepopulate_bars(struct hv_p + } + } + if (high_size <= 1 && low_size <= 1) { +- /* Set the memory enable bit. */ +- _hv_pcifront_read_config(hpdev, PCI_COMMAND, 2, +- &command); +- command |= PCI_COMMAND_MEMORY; +- _hv_pcifront_write_config(hpdev, PCI_COMMAND, 2, +- command); ++ /* ++ * No need to set the PCI_COMMAND_MEMORY bit as ++ * the core PCI driver doesn't require the bit ++ * to be pre-set. Actually here we intentionally ++ * keep the bit off so that the PCI BAR probing ++ * in the core PCI driver doesn't cause Hyper-V ++ * to unnecessarily unmap/map the virtual BARs ++ * from/to the physical BARs multiple times. ++ * This reduces the VM boot time significantly ++ * if the BAR sizes are huge. ++ */ + break; + } + } diff --git a/series.conf b/series.conf index 57c2c0e..cc82717 100644 --- a/series.conf +++ b/series.conf @@ -22932,6 +22932,7 @@ patches.suse/gve-Fix-GFP-flags-when-allocing-pages.patch patches.suse/udf-Fix-NULL-ptr-deref-when-converting-from-inline-f.patch patches.suse/udf-Restore-i_lenAlloc-when-inode-expansion-fails.patch + patches.suse/msft-hv-2513-video-hyperv_fb-Fix-validation-of-screen-resolution.patch patches.suse/cgroup-v1-Require-capabilities-to-set-release_agent.patch patches.suse/gve-fix-the-wrong-AdminQ-buffer-queue-index-check.patch patches.suse/net-sched-fix-use-after-free-in-tc_new_tfilter.patch @@ -22968,6 +22969,12 @@ patches.suse/ALSA-pcm-Fix-races-among-concurrent-read-write-and-b.patch patches.suse/ALSA-pcm-Fix-races-among-concurrent-prepare-and-hw_p.patch patches.suse/ALSA-pcm-Fix-races-among-concurrent-prealloc-proc-wr.patch + patches.suse/msft-hv-2514-net-mana-Use-struct_size-helper-in-mana_gd_create_dm.patch + patches.suse/msft-hv-2516-net-mana-Add-counter-for-packet-dropped-by-XDP.patch + patches.suse/msft-hv-2517-net-mana-Add-counter-for-XDP_TX.patch + patches.suse/msft-hv-2518-net-mana-Reuse-XDP-dropped-page.patch + patches.suse/msft-hv-2523-net-mana-Add-handling-of-CQE_RX_TRUNCATED.patch + patches.suse/msft-hv-2524-net-mana-Remove-unnecessary-check-of-cqe_type-in-man.patch patches.suse/ixgbe-add-the-ability-for-the-PF-to-disable-VF-link-.patch patches.suse/ixgbe-add-improvement-for-MDD-response-functionality.patch patches.suse/ixgbevf-add-disable-link-state.patch @@ -22999,6 +23006,7 @@ patches.suse/lockdown-also-lock-down-previous-kgdb-use.patch patches.suse/ext4-verify-dir-block-before-splitting-it.patch patches.suse/ext4-avoid-cycles-in-directory-h-tree.patch + patches.suse/msft-hv-2588-PCI-hv-Do-not-set-PCI_COMMAND_MEMORY-to-reduce-VM-bo.patch patches.suse/netfilter-nf_tables-disallow-non-stateful-expression.patch ########################################################