diff options
author | Mike Pagano <mpagano@gentoo.org> | 2021-07-11 10:42:58 -0400 |
---|---|---|
committer | Mike Pagano <mpagano@gentoo.org> | 2021-07-11 10:42:58 -0400 |
commit | 9c16e6b001749e8de8bac1a8c050e9cd6b68da3b (patch) | |
tree | 7e461ce2cf608bd91ef4b25f7cc78ee15840ec57 | |
parent | KSPP:Fix DEVMEM Select and move help text (diff) | |
download | linux-patches-9c16e6b001749e8de8bac1a8c050e9cd6b68da3b.tar.gz linux-patches-9c16e6b001749e8de8bac1a8c050e9cd6b68da3b.tar.bz2 linux-patches-9c16e6b001749e8de8bac1a8c050e9cd6b68da3b.zip |
Linux patch 5.10.49
Signed-off-by: Mike Pagano <mpagano@gentoo.org>
-rw-r--r-- | 0000_README | 4 | ||||
-rw-r--r-- | 1048_linux-5.10.49.patch | 516 |
2 files changed, 520 insertions, 0 deletions
diff --git a/0000_README b/0000_README index aefbc8e1..534b76a5 100644 --- a/0000_README +++ b/0000_README @@ -235,6 +235,10 @@ Patch: 1047_linux-5.10.48.patch From: http://www.kernel.org Desc: Linux 5.10.48 +Patch: 1048_linux-5.10.49.patch +From: http://www.kernel.org +Desc: Linux 5.10.49 + Patch: 1500_XATTR_USER_PREFIX.patch From: https://bugs.gentoo.org/show_bug.cgi?id=470644 Desc: Support for namespace user.pax.* on tmpfs. diff --git a/1048_linux-5.10.49.patch b/1048_linux-5.10.49.patch new file mode 100644 index 00000000..481f258f --- /dev/null +++ b/1048_linux-5.10.49.patch @@ -0,0 +1,516 @@ +diff --git a/Makefile b/Makefile +index 52dcfe3371c4c..c51b73455ea33 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,7 +1,7 @@ + # SPDX-License-Identifier: GPL-2.0 + VERSION = 5 + PATCHLEVEL = 10 +-SUBLEVEL = 48 ++SUBLEVEL = 49 + EXTRAVERSION = + NAME = Dare mighty things + +diff --git a/arch/hexagon/Makefile b/arch/hexagon/Makefile +index c168c6980d050..74b644ea8a00a 100644 +--- a/arch/hexagon/Makefile ++++ b/arch/hexagon/Makefile +@@ -10,6 +10,9 @@ LDFLAGS_vmlinux += -G0 + # Do not use single-byte enums; these will overflow. + KBUILD_CFLAGS += -fno-short-enums + ++# We must use long-calls: ++KBUILD_CFLAGS += -mlong-calls ++ + # Modules must use either long-calls, or use pic/plt. + # Use long-calls for now, it's easier. And faster. + # KBUILD_CFLAGS_MODULE += -fPIC +@@ -30,9 +33,6 @@ TIR_NAME := r19 + KBUILD_CFLAGS += -ffixed-$(TIR_NAME) -DTHREADINFO_REG=$(TIR_NAME) -D__linux__ + KBUILD_AFLAGS += -DTHREADINFO_REG=$(TIR_NAME) + +-LIBGCC := $(shell $(CC) $(KBUILD_CFLAGS) -print-libgcc-file-name 2>/dev/null) +-libs-y += $(LIBGCC) +- + head-y := arch/hexagon/kernel/head.o + + core-y += arch/hexagon/kernel/ \ +diff --git a/arch/hexagon/include/asm/futex.h b/arch/hexagon/include/asm/futex.h +index 6b9c554aee78e..9fb00a0ae89f7 100644 +--- a/arch/hexagon/include/asm/futex.h ++++ b/arch/hexagon/include/asm/futex.h +@@ -21,7 +21,7 @@ + "3:\n" \ + ".section .fixup,\"ax\"\n" \ + "4: %1 = #%5;\n" \ +- " jump 3b\n" \ ++ " jump ##3b\n" \ + ".previous\n" \ + ".section __ex_table,\"a\"\n" \ + ".long 1b,4b,2b,4b\n" \ +@@ -90,7 +90,7 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, u32 oldval, + "3:\n" + ".section .fixup,\"ax\"\n" + "4: %0 = #%6\n" +- " jump 3b\n" ++ " jump ##3b\n" + ".previous\n" + ".section __ex_table,\"a\"\n" + ".long 1b,4b,2b,4b\n" +diff --git a/arch/hexagon/include/asm/timex.h b/arch/hexagon/include/asm/timex.h +index 78338d8ada83f..8d4ec76fceb45 100644 +--- a/arch/hexagon/include/asm/timex.h ++++ b/arch/hexagon/include/asm/timex.h +@@ -8,6 +8,7 @@ + + #include <asm-generic/timex.h> + #include <asm/timer-regs.h> ++#include <asm/hexagon_vm.h> + + /* Using TCX0 as our clock. CLOCK_TICK_RATE scheduled to be removed. */ + #define CLOCK_TICK_RATE TCX0_CLK_RATE +@@ -16,7 +17,7 @@ + + static inline int read_current_timer(unsigned long *timer_val) + { +- *timer_val = (unsigned long) __vmgettime(); ++ *timer_val = __vmgettime(); + return 0; + } + +diff --git a/arch/hexagon/kernel/hexagon_ksyms.c b/arch/hexagon/kernel/hexagon_ksyms.c +index 6fb1aaab1c298..35545a7386a06 100644 +--- a/arch/hexagon/kernel/hexagon_ksyms.c ++++ b/arch/hexagon/kernel/hexagon_ksyms.c +@@ -35,8 +35,8 @@ EXPORT_SYMBOL(_dflt_cache_att); + DECLARE_EXPORT(__hexagon_memcpy_likely_aligned_min32bytes_mult8bytes); + + /* Additional functions */ +-DECLARE_EXPORT(__divsi3); +-DECLARE_EXPORT(__modsi3); +-DECLARE_EXPORT(__udivsi3); +-DECLARE_EXPORT(__umodsi3); ++DECLARE_EXPORT(__hexagon_divsi3); ++DECLARE_EXPORT(__hexagon_modsi3); ++DECLARE_EXPORT(__hexagon_udivsi3); ++DECLARE_EXPORT(__hexagon_umodsi3); + DECLARE_EXPORT(csum_tcpudp_magic); +diff --git a/arch/hexagon/kernel/ptrace.c b/arch/hexagon/kernel/ptrace.c +index a5a89e944257c..8975f9b4cedf0 100644 +--- a/arch/hexagon/kernel/ptrace.c ++++ b/arch/hexagon/kernel/ptrace.c +@@ -35,7 +35,7 @@ void user_disable_single_step(struct task_struct *child) + + static int genregs_get(struct task_struct *target, + const struct user_regset *regset, +- srtuct membuf to) ++ struct membuf to) + { + struct pt_regs *regs = task_pt_regs(target); + +@@ -54,7 +54,7 @@ static int genregs_get(struct task_struct *target, + membuf_store(&to, regs->m0); + membuf_store(&to, regs->m1); + membuf_store(&to, regs->usr); +- membuf_store(&to, regs->p3_0); ++ membuf_store(&to, regs->preds); + membuf_store(&to, regs->gp); + membuf_store(&to, regs->ugp); + membuf_store(&to, pt_elr(regs)); // pc +diff --git a/arch/hexagon/lib/Makefile b/arch/hexagon/lib/Makefile +index 54be529d17a25..a64641e89d5fe 100644 +--- a/arch/hexagon/lib/Makefile ++++ b/arch/hexagon/lib/Makefile +@@ -2,4 +2,5 @@ + # + # Makefile for hexagon-specific library files. + # +-obj-y = checksum.o io.o memcpy.o memset.o ++obj-y = checksum.o io.o memcpy.o memset.o memcpy_likely_aligned.o \ ++ divsi3.o modsi3.o udivsi3.o umodsi3.o +diff --git a/arch/hexagon/lib/divsi3.S b/arch/hexagon/lib/divsi3.S +new file mode 100644 +index 0000000000000..783e09424c2c8 +--- /dev/null ++++ b/arch/hexagon/lib/divsi3.S +@@ -0,0 +1,67 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++/* ++ * Copyright (c) 2021, The Linux Foundation. All rights reserved. ++ */ ++ ++#include <linux/linkage.h> ++ ++SYM_FUNC_START(__hexagon_divsi3) ++ { ++ p0 = cmp.gt(r0,#-1) ++ p1 = cmp.gt(r1,#-1) ++ r3:2 = vabsw(r1:0) ++ } ++ { ++ p3 = xor(p0,p1) ++ r4 = sub(r2,r3) ++ r6 = cl0(r2) ++ p0 = cmp.gtu(r3,r2) ++ } ++ { ++ r0 = mux(p3,#-1,#1) ++ r7 = cl0(r3) ++ p1 = cmp.gtu(r3,r4) ++ } ++ { ++ r0 = mux(p0,#0,r0) ++ p0 = or(p0,p1) ++ if (p0.new) jumpr:nt r31 ++ r6 = sub(r7,r6) ++ } ++ { ++ r7 = r6 ++ r5:4 = combine(#1,r3) ++ r6 = add(#1,lsr(r6,#1)) ++ p0 = cmp.gtu(r6,#4) ++ } ++ { ++ r5:4 = vaslw(r5:4,r7) ++ if (!p0) r6 = #3 ++ } ++ { ++ loop0(1f,r6) ++ r7:6 = vlsrw(r5:4,#1) ++ r1:0 = #0 ++ } ++ .falign ++1: ++ { ++ r5:4 = vlsrw(r5:4,#2) ++ if (!p0.new) r0 = add(r0,r5) ++ if (!p0.new) r2 = sub(r2,r4) ++ p0 = cmp.gtu(r4,r2) ++ } ++ { ++ r7:6 = vlsrw(r7:6,#2) ++ if (!p0.new) r0 = add(r0,r7) ++ if (!p0.new) r2 = sub(r2,r6) ++ p0 = cmp.gtu(r6,r2) ++ }:endloop0 ++ { ++ if (!p0) r0 = add(r0,r7) ++ } ++ { ++ if (p3) r0 = sub(r1,r0) ++ jumpr r31 ++ } ++SYM_FUNC_END(__hexagon_divsi3) +diff --git a/arch/hexagon/lib/memcpy_likely_aligned.S b/arch/hexagon/lib/memcpy_likely_aligned.S +new file mode 100644 +index 0000000000000..6a541fb90a540 +--- /dev/null ++++ b/arch/hexagon/lib/memcpy_likely_aligned.S +@@ -0,0 +1,56 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++/* ++ * Copyright (c) 2021, The Linux Foundation. All rights reserved. ++ */ ++ ++#include <linux/linkage.h> ++ ++SYM_FUNC_START(__hexagon_memcpy_likely_aligned_min32bytes_mult8bytes) ++ { ++ p0 = bitsclr(r1,#7) ++ p0 = bitsclr(r0,#7) ++ if (p0.new) r5:4 = memd(r1) ++ if (p0.new) r7:6 = memd(r1+#8) ++ } ++ { ++ if (!p0) jump:nt .Lmemcpy_call ++ if (p0) r9:8 = memd(r1+#16) ++ if (p0) r11:10 = memd(r1+#24) ++ p0 = cmp.gtu(r2,#64) ++ } ++ { ++ if (p0) jump:nt .Lmemcpy_call ++ if (!p0) memd(r0) = r5:4 ++ if (!p0) memd(r0+#8) = r7:6 ++ p0 = cmp.gtu(r2,#32) ++ } ++ { ++ p1 = cmp.gtu(r2,#40) ++ p2 = cmp.gtu(r2,#48) ++ if (p0) r13:12 = memd(r1+#32) ++ if (p1.new) r15:14 = memd(r1+#40) ++ } ++ { ++ memd(r0+#16) = r9:8 ++ memd(r0+#24) = r11:10 ++ } ++ { ++ if (p0) memd(r0+#32) = r13:12 ++ if (p1) memd(r0+#40) = r15:14 ++ if (!p2) jumpr:t r31 ++ } ++ { ++ p0 = cmp.gtu(r2,#56) ++ r5:4 = memd(r1+#48) ++ if (p0.new) r7:6 = memd(r1+#56) ++ } ++ { ++ memd(r0+#48) = r5:4 ++ if (p0) memd(r0+#56) = r7:6 ++ jumpr r31 ++ } ++ ++.Lmemcpy_call: ++ jump memcpy ++ ++SYM_FUNC_END(__hexagon_memcpy_likely_aligned_min32bytes_mult8bytes) +diff --git a/arch/hexagon/lib/modsi3.S b/arch/hexagon/lib/modsi3.S +new file mode 100644 +index 0000000000000..9ea1c86efac2b +--- /dev/null ++++ b/arch/hexagon/lib/modsi3.S +@@ -0,0 +1,46 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++/* ++ * Copyright (c) 2021, The Linux Foundation. All rights reserved. ++ */ ++ ++#include <linux/linkage.h> ++ ++SYM_FUNC_START(__hexagon_modsi3) ++ { ++ p2 = cmp.ge(r0,#0) ++ r2 = abs(r0) ++ r1 = abs(r1) ++ } ++ { ++ r3 = cl0(r2) ++ r4 = cl0(r1) ++ p0 = cmp.gtu(r1,r2) ++ } ++ { ++ r3 = sub(r4,r3) ++ if (p0) jumpr r31 ++ } ++ { ++ p1 = cmp.eq(r3,#0) ++ loop0(1f,r3) ++ r0 = r2 ++ r2 = lsl(r1,r3) ++ } ++ .falign ++1: ++ { ++ p0 = cmp.gtu(r2,r0) ++ if (!p0.new) r0 = sub(r0,r2) ++ r2 = lsr(r2,#1) ++ if (p1) r1 = #0 ++ }:endloop0 ++ { ++ p0 = cmp.gtu(r2,r0) ++ if (!p0.new) r0 = sub(r0,r1) ++ if (p2) jumpr r31 ++ } ++ { ++ r0 = neg(r0) ++ jumpr r31 ++ } ++SYM_FUNC_END(__hexagon_modsi3) +diff --git a/arch/hexagon/lib/udivsi3.S b/arch/hexagon/lib/udivsi3.S +new file mode 100644 +index 0000000000000..477f27b9311cd +--- /dev/null ++++ b/arch/hexagon/lib/udivsi3.S +@@ -0,0 +1,38 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++/* ++ * Copyright (c) 2021, The Linux Foundation. All rights reserved. ++ */ ++ ++#include <linux/linkage.h> ++ ++SYM_FUNC_START(__hexagon_udivsi3) ++ { ++ r2 = cl0(r0) ++ r3 = cl0(r1) ++ r5:4 = combine(#1,#0) ++ p0 = cmp.gtu(r1,r0) ++ } ++ { ++ r6 = sub(r3,r2) ++ r4 = r1 ++ r1:0 = combine(r0,r4) ++ if (p0) jumpr r31 ++ } ++ { ++ r3:2 = vlslw(r5:4,r6) ++ loop0(1f,r6) ++ } ++ .falign ++1: ++ { ++ p0 = cmp.gtu(r2,r1) ++ if (!p0.new) r1 = sub(r1,r2) ++ if (!p0.new) r0 = add(r0,r3) ++ r3:2 = vlsrw(r3:2,#1) ++ }:endloop0 ++ { ++ p0 = cmp.gtu(r2,r1) ++ if (!p0.new) r0 = add(r0,r3) ++ jumpr r31 ++ } ++SYM_FUNC_END(__hexagon_udivsi3) +diff --git a/arch/hexagon/lib/umodsi3.S b/arch/hexagon/lib/umodsi3.S +new file mode 100644 +index 0000000000000..280bf06a55e7d +--- /dev/null ++++ b/arch/hexagon/lib/umodsi3.S +@@ -0,0 +1,36 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++/* ++ * Copyright (c) 2021, The Linux Foundation. All rights reserved. ++ */ ++ ++#include <linux/linkage.h> ++ ++SYM_FUNC_START(__hexagon_umodsi3) ++ { ++ r2 = cl0(r0) ++ r3 = cl0(r1) ++ p0 = cmp.gtu(r1,r0) ++ } ++ { ++ r2 = sub(r3,r2) ++ if (p0) jumpr r31 ++ } ++ { ++ loop0(1f,r2) ++ p1 = cmp.eq(r2,#0) ++ r2 = lsl(r1,r2) ++ } ++ .falign ++1: ++ { ++ p0 = cmp.gtu(r2,r0) ++ if (!p0.new) r0 = sub(r0,r2) ++ r2 = lsr(r2,#1) ++ if (p1) r1 = #0 ++ }:endloop0 ++ { ++ p0 = cmp.gtu(r2,r0) ++ if (!p0.new) r0 = sub(r0,r1) ++ jumpr r31 ++ } ++SYM_FUNC_END(__hexagon_umodsi3) +diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c +index 280f7992ae993..965b702208d85 100644 +--- a/arch/powerpc/kvm/book3s_hv.c ++++ b/arch/powerpc/kvm/book3s_hv.c +@@ -3583,6 +3583,7 @@ static int kvmhv_p9_guest_entry(struct kvm_vcpu *vcpu, u64 time_limit, + unsigned long host_tidr = mfspr(SPRN_TIDR); + unsigned long host_iamr = mfspr(SPRN_IAMR); + unsigned long host_amr = mfspr(SPRN_AMR); ++ unsigned long host_fscr = mfspr(SPRN_FSCR); + s64 dec; + u64 tb; + int trap, save_pmu; +@@ -3726,6 +3727,9 @@ static int kvmhv_p9_guest_entry(struct kvm_vcpu *vcpu, u64 time_limit, + if (host_amr != vcpu->arch.amr) + mtspr(SPRN_AMR, host_amr); + ++ if (host_fscr != vcpu->arch.fscr) ++ mtspr(SPRN_FSCR, host_fscr); ++ + msr_check_and_set(MSR_FP | MSR_VEC | MSR_VSX); + store_fp_state(&vcpu->arch.fp); + #ifdef CONFIG_ALTIVEC +diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c +index 5ad5282641350..282f3d2388cc2 100644 +--- a/drivers/media/usb/uvc/uvc_driver.c ++++ b/drivers/media/usb/uvc/uvc_driver.c +@@ -1588,6 +1588,31 @@ static int uvc_scan_chain_forward(struct uvc_video_chain *chain, + return -EINVAL; + } + ++ /* ++ * Some devices reference an output terminal as the ++ * source of extension units. This is incorrect, as ++ * output terminals only have an input pin, and thus ++ * can't be connected to any entity in the forward ++ * direction. The resulting topology would cause issues ++ * when registering the media controller graph. To ++ * avoid this problem, connect the extension unit to ++ * the source of the output terminal instead. ++ */ ++ if (UVC_ENTITY_IS_OTERM(entity)) { ++ struct uvc_entity *source; ++ ++ source = uvc_entity_by_id(chain->dev, ++ entity->baSourceID[0]); ++ if (!source) { ++ uvc_trace(UVC_TRACE_DESCR, ++ "Can't connect extension unit %u in chain\n", ++ forward->id); ++ break; ++ } ++ ++ forward->baSourceID[0] = source->id; ++ } ++ + list_add_tail(&forward->chain, &chain->entities); + if (uvc_trace_param & UVC_TRACE_PROBE) { + if (!found) +@@ -1608,6 +1633,13 @@ static int uvc_scan_chain_forward(struct uvc_video_chain *chain, + return -EINVAL; + } + ++ if (UVC_ENTITY_IS_OTERM(entity)) { ++ uvc_trace(UVC_TRACE_DESCR, ++ "Unsupported connection between output terminals %u and %u\n", ++ entity->id, forward->id); ++ break; ++ } ++ + list_add_tail(&forward->chain, &chain->entities); + if (uvc_trace_param & UVC_TRACE_PROBE) { + if (!found) +diff --git a/drivers/xen/events/events_base.c b/drivers/xen/events/events_base.c +index 29bec07205142..af0f6ad32522c 100644 +--- a/drivers/xen/events/events_base.c ++++ b/drivers/xen/events/events_base.c +@@ -583,6 +583,9 @@ static void xen_irq_lateeoi_locked(struct irq_info *info, bool spurious) + } + + info->eoi_time = 0; ++ ++ /* is_active hasn't been reset yet, do it now. */ ++ smp_store_release(&info->is_active, 0); + do_unmask(info, EVT_MASK_REASON_EOI_PENDING); + } + +@@ -1807,10 +1810,22 @@ static void lateeoi_ack_dynirq(struct irq_data *data) + struct irq_info *info = info_for_irq(data->irq); + evtchn_port_t evtchn = info ? info->evtchn : 0; + +- if (VALID_EVTCHN(evtchn)) { +- do_mask(info, EVT_MASK_REASON_EOI_PENDING); +- ack_dynirq(data); +- } ++ if (!VALID_EVTCHN(evtchn)) ++ return; ++ ++ do_mask(info, EVT_MASK_REASON_EOI_PENDING); ++ ++ if (unlikely(irqd_is_setaffinity_pending(data)) && ++ likely(!irqd_irq_disabled(data))) { ++ do_mask(info, EVT_MASK_REASON_TEMPORARY); ++ ++ clear_evtchn(evtchn); ++ ++ irq_move_masked_irq(data); ++ ++ do_unmask(info, EVT_MASK_REASON_TEMPORARY); ++ } else ++ clear_evtchn(evtchn); + } + + static void lateeoi_mask_ack_dynirq(struct irq_data *data) |