From: Gregory Bell <grb...@redhat.com>

Merge branch kernel-ark:os-build into RHEL88228
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index blahblah..blahblah 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -274,6 +274,16 @@ workflow:
     rpmbuild_with: arm64_64k debug
     package_name: kernel-64k-debug
     architectures: aarch64
+.eln_rt_64k:
+  variables:
+    rpmbuild_with: realtime_arm64_64k base
+    package_name: kernel-rt-64k
+    architectures: aarch64
+.eln_rt_64k_debug:
+  variables:
+    rpmbuild_with: realtime_arm64_64k debug
+    package_name: kernel-rt-64k-debug
+    architectures: aarch64
 .eln_automotive:
   variables:
     rpmbuild_with: automotive base
@@ -417,6 +427,14 @@ eln_64k_debug_merge_request:
   extends: [.merge_request, .trigger_eln, .no_tests, .merge_ark_latest, 
.manual_for_bot,
             .eln_64k_debug]
 
+eln_realtime_64k_merge_request:
+  extends: [.merge_request, .trigger_eln, .no_tests, .merge_ark_latest, 
.manual_for_bot,
+            .eln_rt_64k]
+
+eln_realtime_64k_debug_merge_request:
+  extends: [.merge_request, .trigger_eln, .no_tests, .merge_ark_latest, 
.manual_for_bot,
+            .eln_rt_64k_debug]
+
 # ELN baselines
 eln_baseline:
   extends: [.baseline, .trigger_eln, .reported_tests, .ark_latest_head,
@@ -450,6 +468,14 @@ eln_64k_debug_baseline:
   extends: [.baseline, .trigger_eln, .reported_tests, .ark_latest_head,
             .eln_64k_debug]
 
+eln_realtime_64k_baseline:
+  extends: [.baseline, .trigger_eln, .reported_tests, .ark_latest_head,
+            .eln_rt_64k]
+
+eln_realtime_64k_debug_baseline:
+  extends: [.baseline, .trigger_eln, .reported_tests, .ark_latest_head,
+            .eln_rt_64k_debug]
+
 # ELN CKI container image gating
 eln_cki_gating:
   extends: [.baseline, .trigger_eln, .no_tests, .cki_gating_head,
@@ -479,6 +505,14 @@ eln_64k_cki_gating:
   extends: [.baseline, .trigger_eln, .no_tests, .cki_gating_head,
             .eln_64k, .cki_gating_overrides]
 
+eln_realtime_64k_debug_cki_gating:
+  extends: [.baseline, .trigger_eln, .no_tests, .cki_gating_head,
+            .eln_rt_64k_debug, .cki_gating_overrides]
+
+eln_realtime_64k_cki_gating:
+  extends: [.baseline, .trigger_eln, .no_tests, .cki_gating_head,
+            .eln_rt_64k, .cki_gating_overrides]
+
 eln_64k_debug_cki_gating:
   extends: [.baseline, .trigger_eln, .no_tests, .cki_gating_head,
             .eln_64k_debug, .cki_gating_overrides]
@@ -524,6 +558,14 @@ c10s_64k_debug_merge_request:
   extends: [.merge_request, .trigger_c10s, .no_tests, .merge_ark_latest, 
.manual_for_bot,
             .eln_64k_debug]
 
+c10s_realtime_64k_merge_request:
+  extends: [.merge_request, .trigger_c10s, .no_tests, .merge_ark_latest, 
.manual_for_bot,
+            .eln_rt_64k]
+
+c10s_realtime_64k_debug_merge_request:
+  extends: [.merge_request, .trigger_c10s, .no_tests, .merge_ark_latest, 
.manual_for_bot,
+            .eln_rt_64k_debug]
+
 c10s_automotive_merge_request:
   extends: [.merge_request, .trigger_c10s, .no_tests, .merge_ark_latest, 
.manual_for_bot,
             .eln_automotive]
@@ -565,6 +607,14 @@ c10s_64k_debug_baseline:
   extends: [.baseline, .trigger_c10s, .no_tests, .ark_latest_head,
             .eln_64k_debug]
 
+c10s_realtime_64k_baseline:
+  extends: [.baseline, .trigger_c10s, .no_tests, .ark_latest_head,
+            .eln_rt_64k]
+
+c10s_realtime_64k_debug_baseline:
+  extends: [.baseline, .trigger_c10s, .no_tests, .ark_latest_head,
+            .eln_rt_64k_debug]
+
 c10s_automotive_baseline:
   extends: [.baseline, .trigger_c10s, .no_tests, .ark_latest_head,
             .eln_automotive]
@@ -606,6 +656,14 @@ c10s_64k_debug_cki_gating:
   extends: [.baseline, .trigger_c10s, .no_tests, .cki_gating_head,
             .eln_64k_debug, .cki_gating_overrides]
 
+c10s_realtime_64k_cki_gating:
+  extends: [.baseline, .trigger_c10s, .no_tests, .cki_gating_head,
+            .eln_rt_64k, .cki_gating_overrides]
+
+c10s_realtime_64k_debug_cki_gating:
+  extends: [.baseline, .trigger_c10s, .no_tests, .cki_gating_head,
+            .eln_rt_64k_debug, .cki_gating_overrides]
+
 c10s_automotive_cki_gating:
   extends: [.baseline, .trigger_c10s, .no_tests, .cki_gating_head,
             .eln_automotive, .cki_gating_overrides]
diff --git a/MAINTAINERS b/MAINTAINERS
index blahblah..blahblah 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -3191,6 +3191,12 @@ M:       Dinh Nguyen <dingu...@kernel.org>
 S:     Maintained
 F:     drivers/clk/socfpga/
 
+ARM/SOCFPGA DWMAC GLUE LAYER
+M:     Maxime Chevallier <maxime.chevall...@bootlin.com>
+S:     Maintained
+F:     Documentation/devicetree/bindings/net/socfpga-dwmac.txt
+F:     drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c
+
 ARM/SOCFPGA EDAC BINDINGS
 M:     Matthew Gerlach <matthew.gerl...@altera.com>
 S:     Maintained
@@ -16812,6 +16818,7 @@ F:      
Documentation/networking/net_cachelines/net_device.rst
 F:     drivers/connector/
 F:     drivers/net/
 F:     drivers/ptp/
+F:     drivers/s390/net/
 F:     include/dt-bindings/net/
 F:     include/linux/cn_proc.h
 F:     include/linux/etherdevice.h
@@ -16821,6 +16828,7 @@ F:      include/linux/fddidevice.h
 F:     include/linux/hippidevice.h
 F:     include/linux/if_*
 F:     include/linux/inetdevice.h
+F:     include/linux/ism.h
 F:     include/linux/netdev*
 F:     include/linux/platform_data/wiznet.h
 F:     include/uapi/linux/cn_proc.h
@@ -21312,6 +21320,7 @@ L:      linux-s...@vger.kernel.org
 L:     net...@vger.kernel.org
 S:     Supported
 F:     drivers/s390/net/
+F:     include/linux/ism.h
 
 S390 PCI SUBSYSTEM
 M:     Niklas Schnelle <schne...@linux.ibm.com>
diff --git a/Makefile b/Makefile
index blahblah..blahblah 100644
--- a/Makefile
+++ b/Makefile
@@ -1076,11 +1076,11 @@ NOSTDINC_FLAGS += -nostdinc
 KBUILD_CFLAGS += $(call cc-option, -fstrict-flex-arrays=3)
 
 #Currently, disable -Wstringop-overflow for GCC 11, globally.
-KBUILD_CFLAGS-$(CONFIG_CC_NO_STRINGOP_OVERFLOW) += $(call cc-option, 
-Wno-stringop-overflow)
+KBUILD_CFLAGS-$(CONFIG_CC_NO_STRINGOP_OVERFLOW) += $(call cc-disable-warning, 
stringop-overflow)
 KBUILD_CFLAGS-$(CONFIG_CC_STRINGOP_OVERFLOW) += $(call cc-option, 
-Wstringop-overflow)
 
 #Currently, disable -Wunterminated-string-initialization as broken
-KBUILD_CFLAGS += $(call cc-option, -Wno-unterminated-string-initialization)
+KBUILD_CFLAGS += $(call cc-disable-warning, unterminated-string-initialization)
 
 # disable invalid "can't wrap" optimizations for signed / pointers
 KBUILD_CFLAGS  += -fno-strict-overflow
diff --git a/Makefile.rhelver b/Makefile.rhelver
index blahblah..blahblah 100644
--- a/Makefile.rhelver
+++ b/Makefile.rhelver
@@ -12,7 +12,7 @@ RHEL_MINOR = 99
 #
 # Use this spot to avoid future merge conflicts.
 # Do not trim this comment.
-RHEL_RELEASE = 30
+RHEL_RELEASE = 32
 
 #
 # RHEL_REBASE_NUM
diff --git a/arch/loongarch/kernel/Makefile b/arch/loongarch/kernel/Makefile
index blahblah..blahblah 100644
--- a/arch/loongarch/kernel/Makefile
+++ b/arch/loongarch/kernel/Makefile
@@ -21,10 +21,10 @@ obj-$(CONFIG_CPU_HAS_LBT)   += lbt.o
 
 obj-$(CONFIG_ARCH_STRICT_ALIGN)        += unaligned.o
 
-CFLAGS_module.o                += $(call cc-option,-Wno-override-init,)
-CFLAGS_syscall.o       += $(call cc-option,-Wno-override-init,)
-CFLAGS_traps.o         += $(call cc-option,-Wno-override-init,)
-CFLAGS_perf_event.o    += $(call cc-option,-Wno-override-init,)
+CFLAGS_module.o                += $(call cc-disable-warning, override-init)
+CFLAGS_syscall.o       += $(call cc-disable-warning, override-init)
+CFLAGS_traps.o         += $(call cc-disable-warning, override-init)
+CFLAGS_perf_event.o    += $(call cc-disable-warning, override-init)
 
 ifdef CONFIG_FUNCTION_TRACER
   ifndef CONFIG_DYNAMIC_FTRACE
diff --git a/arch/loongarch/kvm/Makefile b/arch/loongarch/kvm/Makefile
index blahblah..blahblah 100644
--- a/arch/loongarch/kvm/Makefile
+++ b/arch/loongarch/kvm/Makefile
@@ -21,4 +21,4 @@ kvm-y += intc/eiointc.o
 kvm-y += intc/pch_pic.o
 kvm-y += irqfd.o
 
-CFLAGS_exit.o  += $(call cc-option,-Wno-override-init,)
+CFLAGS_exit.o  += $(call cc-disable-warning, override-init)
diff --git a/arch/riscv/kernel/Makefile b/arch/riscv/kernel/Makefile
index blahblah..blahblah 100644
--- a/arch/riscv/kernel/Makefile
+++ b/arch/riscv/kernel/Makefile
@@ -9,8 +9,8 @@ CFLAGS_REMOVE_patch.o   = $(CC_FLAGS_FTRACE)
 CFLAGS_REMOVE_sbi.o    = $(CC_FLAGS_FTRACE)
 CFLAGS_REMOVE_return_address.o = $(CC_FLAGS_FTRACE)
 endif
-CFLAGS_syscall_table.o += $(call cc-option,-Wno-override-init,)
-CFLAGS_compat_syscall_table.o += $(call cc-option,-Wno-override-init,)
+CFLAGS_syscall_table.o += $(call cc-disable-warning, override-init)
+CFLAGS_compat_syscall_table.o += $(call cc-disable-warning, override-init)
 
 ifdef CONFIG_KEXEC_CORE
 AFLAGS_kexec_relocate.o := -mcmodel=medany $(call cc-option,-mno-relax)
diff --git a/crypto/scompress.c b/crypto/scompress.c
index blahblah..blahblah 100644
--- a/crypto/scompress.c
+++ b/crypto/scompress.c
@@ -215,8 +215,8 @@ static int scomp_acomp_comp_decomp(struct acomp_req *req, 
int dir)
                        spage = nth_page(spage, soff / PAGE_SIZE);
                        soff = offset_in_page(soff);
 
-                       n = slen / PAGE_SIZE;
-                       n += (offset_in_page(slen) + soff - 1) / PAGE_SIZE;
+                       n = (slen - 1) / PAGE_SIZE;
+                       n += (offset_in_page(slen - 1) + soff) / PAGE_SIZE;
                        if (PageHighMem(nth_page(spage, n)) &&
                            size_add(soff, slen) > PAGE_SIZE)
                                break;
@@ -243,9 +243,9 @@ static int scomp_acomp_comp_decomp(struct acomp_req *req, 
int dir)
                        dpage = nth_page(dpage, doff / PAGE_SIZE);
                        doff = offset_in_page(doff);
 
-                       n = dlen / PAGE_SIZE;
-                       n += (offset_in_page(dlen) + doff - 1) / PAGE_SIZE;
-                       if (PageHighMem(dpage + n) &&
+                       n = (dlen - 1) / PAGE_SIZE;
+                       n += (offset_in_page(dlen - 1) + doff) / PAGE_SIZE;
+                       if (PageHighMem(nth_page(dpage, n)) &&
                            size_add(doff, dlen) > PAGE_SIZE)
                                break;
                        dst = kmap_local_page(dpage) + doff;
diff --git a/crypto/testmgr.c b/crypto/testmgr.c
index blahblah..blahblah 100644
--- a/crypto/testmgr.c
+++ b/crypto/testmgr.c
@@ -58,9 +58,6 @@ module_param(fuzz_iterations, uint, 0644);
 MODULE_PARM_DESC(fuzz_iterations, "number of fuzz test iterations");
 #endif
 
-/* Multibuffer is unlimited.  Set arbitrary limit for testing. */
-#define MAX_MB_MSGS    16
-
 #ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS
 
 /* a perfect nop */
@@ -3329,48 +3326,27 @@ static int test_acomp(struct crypto_acomp *tfm,
                      int ctcount, int dtcount)
 {
        const char *algo = crypto_tfm_alg_driver_name(crypto_acomp_tfm(tfm));
-       struct scatterlist *src = NULL, *dst = NULL;
-       struct acomp_req *reqs[MAX_MB_MSGS] = {};
-       char *decomp_out[MAX_MB_MSGS] = {};
-       char *output[MAX_MB_MSGS] = {};
-       struct crypto_wait wait;
-       struct acomp_req *req;
-       int ret = -ENOMEM;
        unsigned int i;
+       char *output, *decomp_out;
+       int ret;
+       struct scatterlist src, dst;
+       struct acomp_req *req;
+       struct crypto_wait wait;
 
-       src = kmalloc_array(MAX_MB_MSGS, sizeof(*src), GFP_KERNEL);
-       if (!src)
-               goto out;
-       dst = kmalloc_array(MAX_MB_MSGS, sizeof(*dst), GFP_KERNEL);
-       if (!dst)
-               goto out;
-
-       for (i = 0; i < MAX_MB_MSGS; i++) {
-               reqs[i] = acomp_request_alloc(tfm);
-               if (!reqs[i])
-                       goto out;
-
-               acomp_request_set_callback(reqs[i],
-                                          CRYPTO_TFM_REQ_MAY_SLEEP |
-                                          CRYPTO_TFM_REQ_MAY_BACKLOG,
-                                          crypto_req_done, &wait);
-               if (i)
-                       acomp_request_chain(reqs[i], reqs[0]);
-
-               output[i] = kmalloc(COMP_BUF_SIZE, GFP_KERNEL);
-               if (!output[i])
-                       goto out;
+       output = kmalloc(COMP_BUF_SIZE, GFP_KERNEL);
+       if (!output)
+               return -ENOMEM;
 
-               decomp_out[i] = kmalloc(COMP_BUF_SIZE, GFP_KERNEL);
-               if (!decomp_out[i])
-                       goto out;
+       decomp_out = kmalloc(COMP_BUF_SIZE, GFP_KERNEL);
+       if (!decomp_out) {
+               kfree(output);
+               return -ENOMEM;
        }
 
        for (i = 0; i < ctcount; i++) {
                unsigned int dlen = COMP_BUF_SIZE;
                int ilen = ctemplate[i].inlen;
                void *input_vec;
-               int j;
 
                input_vec = kmemdup(ctemplate[i].input, ilen, GFP_KERNEL);
                if (!input_vec) {
@@ -3378,61 +3354,70 @@ static int test_acomp(struct crypto_acomp *tfm,
                        goto out;
                }
 
+               memset(output, 0, dlen);
                crypto_init_wait(&wait);
-               sg_init_one(src, input_vec, ilen);
+               sg_init_one(&src, input_vec, ilen);
+               sg_init_one(&dst, output, dlen);
 
-               for (j = 0; j < MAX_MB_MSGS; j++) {
-                       sg_init_one(dst + j, output[j], dlen);
-                       acomp_request_set_params(reqs[j], src, dst + j, ilen, 
dlen);
+               req = acomp_request_alloc(tfm);
+               if (!req) {
+                       pr_err("alg: acomp: request alloc failed for %s\n",
+                              algo);
+                       kfree(input_vec);
+                       ret = -ENOMEM;
+                       goto out;
                }
 
-               req = reqs[0];
+               acomp_request_set_params(req, &src, &dst, ilen, dlen);
+               acomp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
+                                          crypto_req_done, &wait);
+
                ret = crypto_wait_req(crypto_acomp_compress(req), &wait);
                if (ret) {
                        pr_err("alg: acomp: compression failed on test %d for 
%s: ret=%d\n",
                               i + 1, algo, -ret);
                        kfree(input_vec);
+                       acomp_request_free(req);
                        goto out;
                }
 
                ilen = req->dlen;
                dlen = COMP_BUF_SIZE;
+               sg_init_one(&src, output, ilen);
+               sg_init_one(&dst, decomp_out, dlen);
                crypto_init_wait(&wait);
-               for (j = 0; j < MAX_MB_MSGS; j++) {
-                       sg_init_one(src + j, output[j], ilen);
-                       sg_init_one(dst + j, decomp_out[j], dlen);
-                       acomp_request_set_params(reqs[j], src + j, dst + j, 
ilen, dlen);
-               }
-
-               crypto_wait_req(crypto_acomp_decompress(req), &wait);
-               for (j = 0; j < MAX_MB_MSGS; j++) {
-                       ret = reqs[j]->base.err;
-                       if (ret) {
-                               pr_err("alg: acomp: compression failed on test 
%d (%d) for %s: ret=%d\n",
-                                      i + 1, j, algo, -ret);
-                               kfree(input_vec);
-                               goto out;
-                       }
+               acomp_request_set_params(req, &src, &dst, ilen, dlen);
 
-                       if (reqs[j]->dlen != ctemplate[i].inlen) {
-                               pr_err("alg: acomp: Compression test %d (%d) 
failed for %s: output len = %d\n",
-                                      i + 1, j, algo, reqs[j]->dlen);
-                               ret = -EINVAL;
-                               kfree(input_vec);
-                               goto out;
-                       }
+               ret = crypto_wait_req(crypto_acomp_decompress(req), &wait);
+               if (ret) {
+                       pr_err("alg: acomp: compression failed on test %d for 
%s: ret=%d\n",
+                              i + 1, algo, -ret);
+                       kfree(input_vec);
+                       acomp_request_free(req);
+                       goto out;
+               }
 
-                       if (memcmp(input_vec, decomp_out[j], reqs[j]->dlen)) {
-                               pr_err("alg: acomp: Compression test %d (%d) 
failed for %s\n",
-                                      i + 1, j, algo);
-                               hexdump(output[j], reqs[j]->dlen);
-                               ret = -EINVAL;
-                               kfree(input_vec);
-                               goto out;
-                       }
+               if (req->dlen != ctemplate[i].inlen) {
+                       pr_err("alg: acomp: Compression test %d failed for %s: 
output len = %d\n",
+                              i + 1, algo, req->dlen);
+                       ret = -EINVAL;
+                       kfree(input_vec);
+                       acomp_request_free(req);
+                       goto out;
+               }
+
+               if (memcmp(input_vec, decomp_out, req->dlen)) {
+                       pr_err("alg: acomp: Compression test %d failed for 
%s\n",
+                              i + 1, algo);
+                       hexdump(output, req->dlen);
+                       ret = -EINVAL;
+                       kfree(input_vec);
+                       acomp_request_free(req);
+                       goto out;
                }
 
                kfree(input_vec);
+               acomp_request_free(req);
        }
 
        for (i = 0; i < dtcount; i++) {
@@ -3446,9 +3431,10 @@ static int test_acomp(struct crypto_acomp *tfm,
                        goto out;
                }
 
+               memset(output, 0, dlen);
                crypto_init_wait(&wait);
-               sg_init_one(src, input_vec, ilen);
-               sg_init_one(dst, output[0], dlen);
+               sg_init_one(&src, input_vec, ilen);
+               sg_init_one(&dst, output, dlen);
 
                req = acomp_request_alloc(tfm);
                if (!req) {
@@ -3459,7 +3445,7 @@ static int test_acomp(struct crypto_acomp *tfm,
                        goto out;
                }
 
-               acomp_request_set_params(req, src, dst, ilen, dlen);
+               acomp_request_set_params(req, &src, &dst, ilen, dlen);
                acomp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
                                           crypto_req_done, &wait);
 
@@ -3481,10 +3467,10 @@ static int test_acomp(struct crypto_acomp *tfm,
                        goto out;
                }
 
-               if (memcmp(output[0], dtemplate[i].output, req->dlen)) {
+               if (memcmp(output, dtemplate[i].output, req->dlen)) {
                        pr_err("alg: acomp: Decompression test %d failed for 
%s\n",
                               i + 1, algo);
-                       hexdump(output[0], req->dlen);
+                       hexdump(output, req->dlen);
                        ret = -EINVAL;
                        kfree(input_vec);
                        acomp_request_free(req);
@@ -3498,13 +3484,8 @@ static int test_acomp(struct crypto_acomp *tfm,
        ret = 0;
 
 out:
-       acomp_request_free(reqs[0]);
-       for (i = 0; i < MAX_MB_MSGS; i++) {
-               kfree(output[i]);
-               kfree(decomp_out[i]);
-       }
-       kfree(dst);
-       kfree(src);
+       kfree(decomp_out);
+       kfree(output);
        return ret;
 }
 
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
index blahblah..blahblah 100644
--- a/drivers/char/virtio_console.c
+++ b/drivers/char/virtio_console.c
@@ -1576,8 +1576,8 @@ static void handle_control_message(struct virtio_device 
*vdev,
                break;
        case VIRTIO_CONSOLE_RESIZE: {
                struct {
-                       __u16 rows;
-                       __u16 cols;
+                       __virtio16 cols;
+                       __virtio16 rows;
                } size;
 
                if (!is_console_port(port))
@@ -1585,7 +1585,8 @@ static void handle_control_message(struct virtio_device 
*vdev,
 
                memcpy(&size, buf->buf + buf->offset + sizeof(*cpkt),
                       sizeof(size));
-               set_console_size(port, size.rows, size.cols);
+               set_console_size(port, virtio16_to_cpu(vdev, size.rows),
+                                virtio16_to_cpu(vdev, size.cols));
 
                port->cons.hvc->irq_requested = 1;
                resize_console(port);
diff --git a/drivers/crypto/atmel-sha204a.c b/drivers/crypto/atmel-sha204a.c
index blahblah..blahblah 100644
--- a/drivers/crypto/atmel-sha204a.c
+++ b/drivers/crypto/atmel-sha204a.c
@@ -163,6 +163,12 @@ static int atmel_sha204a_probe(struct i2c_client *client)
        i2c_priv->hwrng.name = dev_name(&client->dev);
        i2c_priv->hwrng.read = atmel_sha204a_rng_read;
 
+       /*
+        * According to review by Bill Cox [1], this HWRNG has very low entropy.
+        * [1] 
https://www.metzdowd.com/pipermail/cryptography/2014-December/023858.html
+        */
+       i2c_priv->hwrng.quality = 1;
+
        ret = devm_hwrng_register(&client->dev, &i2c_priv->hwrng);
        if (ret)
                dev_warn(&client->dev, "failed to register RNG (%d)\n", ret);
diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.c 
b/drivers/gpu/drm/virtio/virtgpu_drv.c
index blahblah..blahblah 100644
--- a/drivers/gpu/drm/virtio/virtgpu_drv.c
+++ b/drivers/gpu/drm/virtio/virtgpu_drv.c
@@ -128,6 +128,14 @@ static void virtio_gpu_remove(struct virtio_device *vdev)
        drm_dev_put(dev);
 }
 
+static void virtio_gpu_shutdown(struct virtio_device *vdev)
+{
+       /*
+        * drm does its own synchronization on shutdown.
+        * Do nothing here, opt out of device reset.
+        */
+}
+
 static void virtio_gpu_config_changed(struct virtio_device *vdev)
 {
        struct drm_device *dev = vdev->priv;
@@ -162,6 +170,7 @@ static struct virtio_driver virtio_gpu_driver = {
        .id_table = id_table,
        .probe = virtio_gpu_probe,
        .remove = virtio_gpu_remove,
+       .shutdown = virtio_gpu_shutdown,
        .config_changed = virtio_gpu_config_changed
 };
 
diff --git a/drivers/net/dsa/mt7530.c b/drivers/net/dsa/mt7530.c
index blahblah..blahblah 100644
--- a/drivers/net/dsa/mt7530.c
+++ b/drivers/net/dsa/mt7530.c
@@ -2419,6 +2419,9 @@ mt7531_setup_common(struct dsa_switch *ds)
        struct mt7530_priv *priv = ds->priv;
        int ret, i;
 
+       ds->assisted_learning_on_cpu_port = true;
+       ds->mtu_enforcement_ingress = true;
+
        mt753x_trap_frames(priv);
 
        /* Enable and reset MIB counters */
@@ -2571,9 +2574,6 @@ mt7531_setup(struct dsa_switch *ds)
        if (ret)
                return ret;
 
-       ds->assisted_learning_on_cpu_port = true;
-       ds->mtu_enforcement_ingress = true;
-
        return 0;
 }
 
diff --git a/drivers/net/ethernet/amd/pds_core/adminq.c 
b/drivers/net/ethernet/amd/pds_core/adminq.c
index blahblah..blahblah 100644
--- a/drivers/net/ethernet/amd/pds_core/adminq.c
+++ b/drivers/net/ethernet/amd/pds_core/adminq.c
@@ -5,11 +5,6 @@
 
 #include "core.h"
 
-struct pdsc_wait_context {
-       struct pdsc_qcq *qcq;
-       struct completion wait_completion;
-};
-
 static int pdsc_process_notifyq(struct pdsc_qcq *qcq)
 {
        union pds_core_notifyq_comp *comp;
@@ -109,10 +104,10 @@ void pdsc_process_adminq(struct pdsc_qcq *qcq)
                q_info = &q->info[q->tail_idx];
                q->tail_idx = (q->tail_idx + 1) & (q->num_descs - 1);
 
-               /* Copy out the completion data */
-               memcpy(q_info->dest, comp, sizeof(*comp));
-
-               complete_all(&q_info->wc->wait_completion);
+               if (!completion_done(&q_info->completion)) {
+                       memcpy(q_info->dest, comp, sizeof(*comp));
+                       complete(&q_info->completion);
+               }
 
                if (cq->tail_idx == cq->num_descs - 1)
                        cq->done_color = !cq->done_color;
@@ -162,8 +157,7 @@ irqreturn_t pdsc_adminq_isr(int irq, void *data)
 static int __pdsc_adminq_post(struct pdsc *pdsc,
                              struct pdsc_qcq *qcq,
                              union pds_core_adminq_cmd *cmd,
-                             union pds_core_adminq_comp *comp,
-                             struct pdsc_wait_context *wc)
+                             union pds_core_adminq_comp *comp)
 {
        struct pdsc_queue *q = &qcq->q;
        struct pdsc_q_info *q_info;
@@ -205,9 +199,9 @@ static int __pdsc_adminq_post(struct pdsc *pdsc,
        /* Post the request */
        index = q->head_idx;
        q_info = &q->info[index];
-       q_info->wc = wc;
        q_info->dest = comp;
        memcpy(q_info->desc, cmd, sizeof(*cmd));
+       reinit_completion(&q_info->completion);
 
        dev_dbg(pdsc->dev, "head_idx %d tail_idx %d\n",
                q->head_idx, q->tail_idx);
@@ -231,16 +225,13 @@ int pdsc_adminq_post(struct pdsc *pdsc,
                     union pds_core_adminq_comp *comp,
                     bool fast_poll)
 {
-       struct pdsc_wait_context wc = {
-               .wait_completion =
-                       COMPLETION_INITIALIZER_ONSTACK(wc.wait_completion),
-       };
        unsigned long poll_interval = 1;
        unsigned long poll_jiffies;
        unsigned long time_limit;
        unsigned long time_start;
        unsigned long time_done;
        unsigned long remaining;
+       struct completion *wc;
        int err = 0;
        int index;
 
@@ -250,20 +241,19 @@ int pdsc_adminq_post(struct pdsc *pdsc,
                return -ENXIO;
        }
 
-       wc.qcq = &pdsc->adminqcq;
-       index = __pdsc_adminq_post(pdsc, &pdsc->adminqcq, cmd, comp, &wc);
+       index = __pdsc_adminq_post(pdsc, &pdsc->adminqcq, cmd, comp);
        if (index < 0) {
                err = index;
                goto err_out;
        }
 
+       wc = &pdsc->adminqcq.q.info[index].completion;
        time_start = jiffies;
        time_limit = time_start + HZ * pdsc->devcmd_timeout;
        do {
                /* Timeslice the actual wait to catch IO errors etc early */
                poll_jiffies = msecs_to_jiffies(poll_interval);
-               remaining = wait_for_completion_timeout(&wc.wait_completion,
-                                                       poll_jiffies);
+               remaining = wait_for_completion_timeout(wc, poll_jiffies);
                if (remaining)
                        break;
 
@@ -292,9 +282,11 @@ int pdsc_adminq_post(struct pdsc *pdsc,
        dev_dbg(pdsc->dev, "%s: elapsed %d msecs\n",
                __func__, jiffies_to_msecs(time_done - time_start));
 
-       /* Check the results */
-       if (time_after_eq(time_done, time_limit))
+       /* Check the results and clear an un-completed timeout */
+       if (time_after_eq(time_done, time_limit) && !completion_done(wc)) {
                err = -ETIMEDOUT;
+               complete(wc);
+       }
 
        dev_dbg(pdsc->dev, "read admin queue completion idx %d:\n", index);
        dynamic_hex_dump("comp ", DUMP_PREFIX_OFFSET, 16, 1,
diff --git a/drivers/net/ethernet/amd/pds_core/auxbus.c 
b/drivers/net/ethernet/amd/pds_core/auxbus.c
index blahblah..blahblah 100644
--- a/drivers/net/ethernet/amd/pds_core/auxbus.c
+++ b/drivers/net/ethernet/amd/pds_core/auxbus.c
@@ -107,9 +107,6 @@ int pds_client_adminq_cmd(struct pds_auxiliary_dev *padev,
        dev_dbg(pf->dev, "%s: %s opcode %d\n",
                __func__, dev_name(&padev->aux_dev.dev), req->opcode);
 
-       if (pf->state)
-               return -ENXIO;
-
        /* Wrap the client's request */
        cmd.client_request.opcode = PDS_AQ_CMD_CLIENT_CMD;
        cmd.client_request.client_id = cpu_to_le16(padev->client_id);
diff --git a/drivers/net/ethernet/amd/pds_core/core.c 
b/drivers/net/ethernet/amd/pds_core/core.c
index blahblah..blahblah 100644
--- a/drivers/net/ethernet/amd/pds_core/core.c
+++ b/drivers/net/ethernet/amd/pds_core/core.c
@@ -167,8 +167,10 @@ static void pdsc_q_map(struct pdsc_queue *q, void *base, 
dma_addr_t base_pa)
        q->base = base;
        q->base_pa = base_pa;
 
-       for (i = 0, cur = q->info; i < q->num_descs; i++, cur++)
+       for (i = 0, cur = q->info; i < q->num_descs; i++, cur++) {
                cur->desc = base + (i * q->desc_size);
+               init_completion(&cur->completion);
+       }
 }
 
 static void pdsc_cq_map(struct pdsc_cq *cq, void *base, dma_addr_t base_pa)
@@ -325,10 +327,7 @@ static int pdsc_core_init(struct pdsc *pdsc)
        size_t sz;
        int err;
 
-       /* Scale the descriptor ring length based on number of CPUs and VFs */
-       numdescs = max_t(int, PDSC_ADMINQ_MIN_LENGTH, num_online_cpus());
-       numdescs += 2 * pci_sriov_get_totalvfs(pdsc->pdev);
-       numdescs = roundup_pow_of_two(numdescs);
+       numdescs = PDSC_ADMINQ_MAX_LENGTH;
        err = pdsc_qcq_alloc(pdsc, PDS_CORE_QTYPE_ADMINQ, 0, "adminq",
                             PDS_CORE_QCQ_F_CORE | PDS_CORE_QCQ_F_INTR,
                             numdescs,
diff --git a/drivers/net/ethernet/amd/pds_core/core.h 
b/drivers/net/ethernet/amd/pds_core/core.h
index blahblah..blahblah 100644
--- a/drivers/net/ethernet/amd/pds_core/core.h
+++ b/drivers/net/ethernet/amd/pds_core/core.h
@@ -16,7 +16,7 @@
 
 #define PDSC_WATCHDOG_SECS     5
 #define PDSC_QUEUE_NAME_MAX_SZ  16
-#define PDSC_ADMINQ_MIN_LENGTH 16      /* must be a power of two */
+#define PDSC_ADMINQ_MAX_LENGTH 16      /* must be a power of two */
 #define PDSC_NOTIFYQ_LENGTH    64      /* must be a power of two */
 #define PDSC_TEARDOWN_RECOVERY false
 #define PDSC_TEARDOWN_REMOVING true
@@ -96,7 +96,7 @@ struct pdsc_q_info {
        unsigned int bytes;
        unsigned int nbufs;
        struct pdsc_buf_info bufs[PDS_CORE_MAX_FRAGS];
-       struct pdsc_wait_context *wc;
+       struct completion completion;
        void *dest;
 };
 
diff --git a/drivers/net/ethernet/amd/pds_core/devlink.c 
b/drivers/net/ethernet/amd/pds_core/devlink.c
index blahblah..blahblah 100644
--- a/drivers/net/ethernet/amd/pds_core/devlink.c
+++ b/drivers/net/ethernet/amd/pds_core/devlink.c
@@ -105,7 +105,7 @@ int pdsc_dl_info_get(struct devlink *dl, struct 
devlink_info_req *req,
                .fw_control.opcode = PDS_CORE_CMD_FW_CONTROL,
                .fw_control.oper = PDS_CORE_FW_GET_LIST,
        };
-       struct pds_core_fw_list_info fw_list;
+       struct pds_core_fw_list_info fw_list = {};
        struct pdsc *pdsc = devlink_priv(dl);
        union pds_core_dev_comp comp;
        char buf[32];
@@ -118,8 +118,6 @@ int pdsc_dl_info_get(struct devlink *dl, struct 
devlink_info_req *req,
        if (!err)
                memcpy_fromio(&fw_list, pdsc->cmd_regs->data, sizeof(fw_list));
        mutex_unlock(&pdsc->devcmd_lock);
-       if (err && err != -EIO)
-               return err;
 
        listlen = min(fw_list.num_fw_slots, ARRAY_SIZE(fw_list.fw_names));
        for (i = 0; i < listlen; i++) {
diff --git a/drivers/net/ethernet/freescale/enetc/enetc.c 
b/drivers/net/ethernet/freescale/enetc/enetc.c
index blahblah..blahblah 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc.c
@@ -1850,6 +1850,16 @@ static void enetc_xdp_drop(struct enetc_bdr *rx_ring, 
int rx_ring_first,
        }
 }
 
+static void enetc_bulk_flip_buff(struct enetc_bdr *rx_ring, int rx_ring_first,
+                                int rx_ring_last)
+{
+       while (rx_ring_first != rx_ring_last) {
+               enetc_flip_rx_buff(rx_ring,
+                                  &rx_ring->rx_swbd[rx_ring_first]);
+               enetc_bdr_idx_inc(rx_ring, &rx_ring_first);
+       }
+}
+
 static int enetc_clean_rx_ring_xdp(struct enetc_bdr *rx_ring,
                                   struct napi_struct *napi, int work_limit,
                                   struct bpf_prog *prog)
@@ -1868,11 +1878,10 @@ static int enetc_clean_rx_ring_xdp(struct enetc_bdr 
*rx_ring,
 
        while (likely(rx_frm_cnt < work_limit)) {
                union enetc_rx_bd *rxbd, *orig_rxbd;
-               int orig_i, orig_cleaned_cnt;
                struct xdp_buff xdp_buff;
                struct sk_buff *skb;
+               int orig_i, err;
                u32 bd_status;
-               int err;
 
                rxbd = enetc_rxbd(rx_ring, i);
                bd_status = le32_to_cpu(rxbd->r.lstatus);
@@ -1887,7 +1896,6 @@ static int enetc_clean_rx_ring_xdp(struct enetc_bdr 
*rx_ring,
                        break;
 
                orig_rxbd = rxbd;
-               orig_cleaned_cnt = cleaned_cnt;
                orig_i = i;
 
                enetc_build_xdp_buff(rx_ring, bd_status, &rxbd, &i,
@@ -1915,15 +1923,21 @@ static int enetc_clean_rx_ring_xdp(struct enetc_bdr 
*rx_ring,
                        rx_ring->stats.xdp_drops++;
                        break;
                case XDP_PASS:
-                       rxbd = orig_rxbd;
-                       cleaned_cnt = orig_cleaned_cnt;
-                       i = orig_i;
-
-                       skb = enetc_build_skb(rx_ring, bd_status, &rxbd,
-                                             &i, &cleaned_cnt,
-                                             ENETC_RXB_DMA_SIZE_XDP);
-                       if (unlikely(!skb))
+                       skb = xdp_build_skb_from_buff(&xdp_buff);
+                       /* Probably under memory pressure, stop NAPI */
+                       if (unlikely(!skb)) {
+                               enetc_xdp_drop(rx_ring, orig_i, i);
+                               rx_ring->stats.xdp_drops++;
                                goto out;
+                       }
+
+                       enetc_get_offloads(rx_ring, orig_rxbd, skb);
+
+                       /* These buffers are about to be owned by the stack.
+                        * Update our buffer cache (the rx_swbd array elements)
+                        * with their other page halves.
+                        */
+                       enetc_bulk_flip_buff(rx_ring, orig_i, i);
 
                        napi_gro_receive(napi, skb);
                        break;
@@ -1965,11 +1979,7 @@ static int enetc_clean_rx_ring_xdp(struct enetc_bdr 
*rx_ring,
                                enetc_xdp_drop(rx_ring, orig_i, i);
                                rx_ring->stats.xdp_redirect_failures++;
                        } else {
-                               while (orig_i != i) {
-                                       enetc_flip_rx_buff(rx_ring,
-                                                          
&rx_ring->rx_swbd[orig_i]);
-                                       enetc_bdr_idx_inc(rx_ring, &orig_i);
-                               }
+                               enetc_bulk_flip_buff(rx_ring, orig_i, i);
                                xdp_redirect_frm_cnt++;
                                rx_ring->stats.xdp_redirect++;
                        }
@@ -3362,7 +3372,8 @@ static int enetc_int_vector_init(struct enetc_ndev_priv 
*priv, int i,
        bdr->buffer_offset = ENETC_RXB_PAD;
        priv->rx_ring[i] = bdr;
 
-       err = xdp_rxq_info_reg(&bdr->xdp.rxq, priv->ndev, i, 0);
+       err = __xdp_rxq_info_reg(&bdr->xdp.rxq, priv->ndev, i, 0,
+                                ENETC_RXB_DMA_SIZE_XDP);
        if (err)
                goto free_vector;
 
diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c 
b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
index blahblah..blahblah 100644
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -4043,11 +4043,27 @@ static int mtk_hw_init(struct mtk_eth *eth, bool reset)
        mtk_w32(eth, 0x21021000, MTK_FE_INT_GRP);
 
        if (mtk_is_netsys_v3_or_greater(eth)) {
-               /* PSE should not drop port1, port8 and port9 packets */
-               mtk_w32(eth, 0x00000302, PSE_DROP_CFG);
+               /* PSE dummy page mechanism */
+               mtk_w32(eth, PSE_DUMMY_WORK_GDM(1) | PSE_DUMMY_WORK_GDM(2) |
+                       PSE_DUMMY_WORK_GDM(3) | DUMMY_PAGE_THR, PSE_DUMY_REQ);
+
+               /* PSE free buffer drop threshold */
+               mtk_w32(eth, 0x00600009, PSE_IQ_REV(8));
+
+               /* PSE should not drop port8, port9 and port13 packets from
+                * WDMA Tx
+                */
+               mtk_w32(eth, 0x00002300, PSE_DROP_CFG);
+
+               /* PSE should drop packets to port8, port9 and port13 on WDMA Rx
+                * ring full
+                */
+               mtk_w32(eth, 0x00002300, PSE_PPE_DROP(0));
+               mtk_w32(eth, 0x00002300, PSE_PPE_DROP(1));
+               mtk_w32(eth, 0x00002300, PSE_PPE_DROP(2));
 
                /* GDM and CDM Threshold */
-               mtk_w32(eth, 0x00000707, MTK_CDMW0_THRES);
+               mtk_w32(eth, 0x08000707, MTK_CDMW0_THRES);
                mtk_w32(eth, 0x00000077, MTK_CDMW1_THRES);
 
                /* Disable GDM1 RX CRC stripping */
@@ -4064,7 +4080,7 @@ static int mtk_hw_init(struct mtk_eth *eth, bool reset)
                mtk_w32(eth, 0x00000300, PSE_DROP_CFG);
 
                /* PSE should drop packets to port 8/9 on WDMA Rx ring full */
-               mtk_w32(eth, 0x00000300, PSE_PPE0_DROP);
+               mtk_w32(eth, 0x00000300, PSE_PPE_DROP(0));
 
                /* PSE Free Queue Flow Control  */
                mtk_w32(eth, 0x01fa01f4, PSE_FQFC_CFG2);

--
https://gitlab.com/cki-project/kernel-ark/-/merge_requests/3839

-- 
_______________________________________________
kernel mailing list -- kernel@lists.fedoraproject.org
To unsubscribe send an email to kernel-le...@lists.fedoraproject.org
Fedora Code of Conduct: 
https://docs.fedoraproject.org/en-US/project/code-of-conduct/
List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
List Archives: 
https://lists.fedoraproject.org/archives/list/kernel@lists.fedoraproject.org
Do not reply to spam, report it: 
https://pagure.io/fedora-infrastructure/new_issue

Reply via email to