Contents of /trunk/kernel-alx/patches-5.4/0230-5.4.131-all-fixes.patch
Parent Directory | Revision Log
Revision 3635 -
(show annotations)
(download)
Mon Oct 24 12:34:12 2022 UTC (19 months ago) by niro
File size: 4656 byte(s)
Mon Oct 24 12:34:12 2022 UTC (19 months ago) by niro
File size: 4656 byte(s)
-sync kernel patches
1 | diff --git a/Makefile b/Makefile |
2 | index 4256dd594d18c..5e8716dbbadca 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,7 +1,7 @@ |
6 | # SPDX-License-Identifier: GPL-2.0 |
7 | VERSION = 5 |
8 | PATCHLEVEL = 4 |
9 | -SUBLEVEL = 130 |
10 | +SUBLEVEL = 131 |
11 | EXTRAVERSION = |
12 | NAME = Kleptomaniac Octopus |
13 | |
14 | diff --git a/arch/s390/include/asm/stacktrace.h b/arch/s390/include/asm/stacktrace.h |
15 | index 3679d224fd3c5..6836532f8d1a6 100644 |
16 | --- a/arch/s390/include/asm/stacktrace.h |
17 | +++ b/arch/s390/include/asm/stacktrace.h |
18 | @@ -79,12 +79,16 @@ struct stack_frame { |
19 | CALL_ARGS_4(arg1, arg2, arg3, arg4); \ |
20 | register unsigned long r4 asm("6") = (unsigned long)(arg5) |
21 | |
22 | -#define CALL_FMT_0 "=&d" (r2) : |
23 | -#define CALL_FMT_1 "+&d" (r2) : |
24 | -#define CALL_FMT_2 CALL_FMT_1 "d" (r3), |
25 | -#define CALL_FMT_3 CALL_FMT_2 "d" (r4), |
26 | -#define CALL_FMT_4 CALL_FMT_3 "d" (r5), |
27 | -#define CALL_FMT_5 CALL_FMT_4 "d" (r6), |
28 | +/* |
29 | + * To keep this simple mark register 2-6 as being changed (volatile) |
30 | + * by the called function, even though register 6 is saved/nonvolatile. |
31 | + */ |
32 | +#define CALL_FMT_0 "=&d" (r2) |
33 | +#define CALL_FMT_1 "+&d" (r2) |
34 | +#define CALL_FMT_2 CALL_FMT_1, "+&d" (r3) |
35 | +#define CALL_FMT_3 CALL_FMT_2, "+&d" (r4) |
36 | +#define CALL_FMT_4 CALL_FMT_3, "+&d" (r5) |
37 | +#define CALL_FMT_5 CALL_FMT_4, "+&d" (r6) |
38 | |
39 | #define CALL_CLOBBER_5 "0", "1", "14", "cc", "memory" |
40 | #define CALL_CLOBBER_4 CALL_CLOBBER_5 |
41 | @@ -105,7 +109,7 @@ struct stack_frame { |
42 | " brasl 14,%[_fn]\n" \ |
43 | " la 15,0(%[_prev])\n" \ |
44 | : [_prev] "=&a" (prev), CALL_FMT_##nr \ |
45 | - [_stack] "a" (stack), \ |
46 | + : [_stack] "a" (stack), \ |
47 | [_bc] "i" (offsetof(struct stack_frame, back_chain)), \ |
48 | [_fn] "X" (fn) : CALL_CLOBBER_##nr); \ |
49 | r2; \ |
50 | diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c |
51 | index 074cd170912aa..7341d22ed04f1 100644 |
52 | --- a/arch/x86/kvm/svm.c |
53 | +++ b/arch/x86/kvm/svm.c |
54 | @@ -1794,9 +1794,25 @@ static void sev_asid_free(struct kvm *kvm) |
55 | __sev_asid_free(sev->asid); |
56 | } |
57 | |
58 | -static void sev_unbind_asid(struct kvm *kvm, unsigned int handle) |
59 | +static void sev_decommission(unsigned int handle) |
60 | { |
61 | struct sev_data_decommission *decommission; |
62 | + |
63 | + if (!handle) |
64 | + return; |
65 | + |
66 | + decommission = kzalloc(sizeof(*decommission), GFP_KERNEL); |
67 | + if (!decommission) |
68 | + return; |
69 | + |
70 | + decommission->handle = handle; |
71 | + sev_guest_decommission(decommission, NULL); |
72 | + |
73 | + kfree(decommission); |
74 | +} |
75 | + |
76 | +static void sev_unbind_asid(struct kvm *kvm, unsigned int handle) |
77 | +{ |
78 | struct sev_data_deactivate *data; |
79 | |
80 | if (!handle) |
81 | @@ -1814,15 +1830,7 @@ static void sev_unbind_asid(struct kvm *kvm, unsigned int handle) |
82 | sev_guest_df_flush(NULL); |
83 | kfree(data); |
84 | |
85 | - decommission = kzalloc(sizeof(*decommission), GFP_KERNEL); |
86 | - if (!decommission) |
87 | - return; |
88 | - |
89 | - /* decommission handle */ |
90 | - decommission->handle = handle; |
91 | - sev_guest_decommission(decommission, NULL); |
92 | - |
93 | - kfree(decommission); |
94 | + sev_decommission(handle); |
95 | } |
96 | |
97 | static struct page **sev_pin_memory(struct kvm *kvm, unsigned long uaddr, |
98 | @@ -1960,6 +1968,7 @@ static void sev_vm_destroy(struct kvm *kvm) |
99 | list_for_each_safe(pos, q, head) { |
100 | __unregister_enc_region_locked(kvm, |
101 | list_entry(pos, struct enc_region, list)); |
102 | + cond_resched(); |
103 | } |
104 | } |
105 | |
106 | @@ -6475,8 +6484,10 @@ static int sev_launch_start(struct kvm *kvm, struct kvm_sev_cmd *argp) |
107 | |
108 | /* Bind ASID to this guest */ |
109 | ret = sev_bind_asid(kvm, start->handle, error); |
110 | - if (ret) |
111 | + if (ret) { |
112 | + sev_decommission(start->handle); |
113 | goto e_free_session; |
114 | + } |
115 | |
116 | /* return handle to userspace */ |
117 | params.handle = start->handle; |
118 | diff --git a/drivers/xen/events/events_base.c b/drivers/xen/events/events_base.c |
119 | index 9cc77f0397797..de825df4abf6a 100644 |
120 | --- a/drivers/xen/events/events_base.c |
121 | +++ b/drivers/xen/events/events_base.c |
122 | @@ -525,6 +525,9 @@ static void xen_irq_lateeoi_locked(struct irq_info *info, bool spurious) |
123 | } |
124 | |
125 | info->eoi_time = 0; |
126 | + |
127 | + /* is_active hasn't been reset yet, do it now. */ |
128 | + smp_store_release(&info->is_active, 0); |
129 | do_unmask(info, EVT_MASK_REASON_EOI_PENDING); |
130 | } |
131 | |
132 | @@ -1781,10 +1784,22 @@ static void lateeoi_ack_dynirq(struct irq_data *data) |
133 | struct irq_info *info = info_for_irq(data->irq); |
134 | evtchn_port_t evtchn = info ? info->evtchn : 0; |
135 | |
136 | - if (VALID_EVTCHN(evtchn)) { |
137 | - do_mask(info, EVT_MASK_REASON_EOI_PENDING); |
138 | - ack_dynirq(data); |
139 | - } |
140 | + if (!VALID_EVTCHN(evtchn)) |
141 | + return; |
142 | + |
143 | + do_mask(info, EVT_MASK_REASON_EOI_PENDING); |
144 | + |
145 | + if (unlikely(irqd_is_setaffinity_pending(data)) && |
146 | + likely(!irqd_irq_disabled(data))) { |
147 | + do_mask(info, EVT_MASK_REASON_TEMPORARY); |
148 | + |
149 | + clear_evtchn(evtchn); |
150 | + |
151 | + irq_move_masked_irq(data); |
152 | + |
153 | + do_unmask(info, EVT_MASK_REASON_TEMPORARY); |
154 | + } else |
155 | + clear_evtchn(evtchn); |
156 | } |
157 | |
158 | static void lateeoi_mask_ack_dynirq(struct irq_data *data) |