Magellan Linux

Contents of /trunk/kernel-alx/patches-5.4/0173-5.4.74-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3637 - (show annotations) (download)
Mon Oct 24 12:40:44 2022 UTC (18 months, 1 week ago) by niro
File size: 50097 byte(s)
-add missing
1 diff --git a/Makefile b/Makefile
2 index f9a8d76a693eb..3be5a9c352b9c 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 = 73
10 +SUBLEVEL = 74
11 EXTRAVERSION =
12 NAME = Kleptomaniac Octopus
13
14 diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile
15 index 96abe558aea8b..cd8f3cdabfd07 100644
16 --- a/arch/arm64/Makefile
17 +++ b/arch/arm64/Makefile
18 @@ -10,7 +10,7 @@
19 #
20 # Copyright (C) 1995-2001 by Russell King
21
22 -LDFLAGS_vmlinux :=--no-undefined -X
23 +LDFLAGS_vmlinux :=--no-undefined -X -z norelro
24 CPPFLAGS_vmlinux.lds = -DTEXT_OFFSET=$(TEXT_OFFSET)
25 GZFLAGS :=-9
26
27 @@ -18,7 +18,7 @@ ifeq ($(CONFIG_RELOCATABLE), y)
28 # Pass --no-apply-dynamic-relocs to restore pre-binutils-2.27 behaviour
29 # for relative relocs, since this leads to better Image compression
30 # with the relocation offsets always being zero.
31 -LDFLAGS_vmlinux += -shared -Bsymbolic -z notext -z norelro \
32 +LDFLAGS_vmlinux += -shared -Bsymbolic -z notext \
33 $(call ld-option, --no-apply-dynamic-relocs)
34 endif
35
36 diff --git a/arch/arm64/kernel/cpu_errata.c b/arch/arm64/kernel/cpu_errata.c
37 index d2e738c455566..1e16c4e00e771 100644
38 --- a/arch/arm64/kernel/cpu_errata.c
39 +++ b/arch/arm64/kernel/cpu_errata.c
40 @@ -492,6 +492,12 @@ out_printmsg:
41 return required;
42 }
43
44 +static void cpu_enable_ssbd_mitigation(const struct arm64_cpu_capabilities *cap)
45 +{
46 + if (ssbd_state != ARM64_SSBD_FORCE_DISABLE)
47 + cap->matches(cap, SCOPE_LOCAL_CPU);
48 +}
49 +
50 /* known invulnerable cores */
51 static const struct midr_range arm64_ssb_cpus[] = {
52 MIDR_ALL_VERSIONS(MIDR_CORTEX_A35),
53 @@ -635,6 +641,12 @@ check_branch_predictor(const struct arm64_cpu_capabilities *entry, int scope)
54 return (need_wa > 0);
55 }
56
57 +static void
58 +cpu_enable_branch_predictor_hardening(const struct arm64_cpu_capabilities *cap)
59 +{
60 + cap->matches(cap, SCOPE_LOCAL_CPU);
61 +}
62 +
63 static const __maybe_unused struct midr_range tx2_family_cpus[] = {
64 MIDR_ALL_VERSIONS(MIDR_BRCM_VULCAN),
65 MIDR_ALL_VERSIONS(MIDR_CAVIUM_THUNDERX2),
66 @@ -894,9 +906,11 @@ const struct arm64_cpu_capabilities arm64_errata[] = {
67 },
68 #endif
69 {
70 + .desc = "Branch predictor hardening",
71 .capability = ARM64_HARDEN_BRANCH_PREDICTOR,
72 .type = ARM64_CPUCAP_LOCAL_CPU_ERRATUM,
73 .matches = check_branch_predictor,
74 + .cpu_enable = cpu_enable_branch_predictor_hardening,
75 },
76 #ifdef CONFIG_HARDEN_EL2_VECTORS
77 {
78 @@ -910,6 +924,7 @@ const struct arm64_cpu_capabilities arm64_errata[] = {
79 .capability = ARM64_SSBD,
80 .type = ARM64_CPUCAP_LOCAL_CPU_ERRATUM,
81 .matches = has_ssbd_mitigation,
82 + .cpu_enable = cpu_enable_ssbd_mitigation,
83 .midr_range_list = arm64_ssb_cpus,
84 },
85 #ifdef CONFIG_ARM64_ERRATUM_1418040
86 diff --git a/arch/openrisc/include/asm/uaccess.h b/arch/openrisc/include/asm/uaccess.h
87 index 17c24f14615fb..6839f8fcf76b2 100644
88 --- a/arch/openrisc/include/asm/uaccess.h
89 +++ b/arch/openrisc/include/asm/uaccess.h
90 @@ -164,19 +164,19 @@ struct __large_struct {
91
92 #define __get_user_nocheck(x, ptr, size) \
93 ({ \
94 - long __gu_err, __gu_val; \
95 - __get_user_size(__gu_val, (ptr), (size), __gu_err); \
96 - (x) = (__force __typeof__(*(ptr)))__gu_val; \
97 + long __gu_err; \
98 + __get_user_size((x), (ptr), (size), __gu_err); \
99 __gu_err; \
100 })
101
102 #define __get_user_check(x, ptr, size) \
103 ({ \
104 - long __gu_err = -EFAULT, __gu_val = 0; \
105 - const __typeof__(*(ptr)) * __gu_addr = (ptr); \
106 - if (access_ok(__gu_addr, size)) \
107 - __get_user_size(__gu_val, __gu_addr, (size), __gu_err); \
108 - (x) = (__force __typeof__(*(ptr)))__gu_val; \
109 + long __gu_err = -EFAULT; \
110 + const __typeof__(*(ptr)) *__gu_addr = (ptr); \
111 + if (access_ok(__gu_addr, size)) \
112 + __get_user_size((x), __gu_addr, (size), __gu_err); \
113 + else \
114 + (x) = (__typeof__(*(ptr))) 0; \
115 __gu_err; \
116 })
117
118 @@ -190,11 +190,13 @@ do { \
119 case 2: __get_user_asm(x, ptr, retval, "l.lhz"); break; \
120 case 4: __get_user_asm(x, ptr, retval, "l.lwz"); break; \
121 case 8: __get_user_asm2(x, ptr, retval); break; \
122 - default: (x) = __get_user_bad(); \
123 + default: (x) = (__typeof__(*(ptr)))__get_user_bad(); \
124 } \
125 } while (0)
126
127 #define __get_user_asm(x, addr, err, op) \
128 +{ \
129 + unsigned long __gu_tmp; \
130 __asm__ __volatile__( \
131 "1: "op" %1,0(%2)\n" \
132 "2:\n" \
133 @@ -208,10 +210,14 @@ do { \
134 " .align 2\n" \
135 " .long 1b,3b\n" \
136 ".previous" \
137 - : "=r"(err), "=r"(x) \
138 - : "r"(addr), "i"(-EFAULT), "0"(err))
139 + : "=r"(err), "=r"(__gu_tmp) \
140 + : "r"(addr), "i"(-EFAULT), "0"(err)); \
141 + (x) = (__typeof__(*(addr)))__gu_tmp; \
142 +}
143
144 #define __get_user_asm2(x, addr, err) \
145 +{ \
146 + unsigned long long __gu_tmp; \
147 __asm__ __volatile__( \
148 "1: l.lwz %1,0(%2)\n" \
149 "2: l.lwz %H1,4(%2)\n" \
150 @@ -228,8 +234,11 @@ do { \
151 " .long 1b,4b\n" \
152 " .long 2b,4b\n" \
153 ".previous" \
154 - : "=r"(err), "=&r"(x) \
155 - : "r"(addr), "i"(-EFAULT), "0"(err))
156 + : "=r"(err), "=&r"(__gu_tmp) \
157 + : "r"(addr), "i"(-EFAULT), "0"(err)); \
158 + (x) = (__typeof__(*(addr)))( \
159 + (__typeof__((x)-(x)))__gu_tmp); \
160 +}
161
162 /* more complex routines */
163
164 diff --git a/arch/x86/crypto/crc32c-pcl-intel-asm_64.S b/arch/x86/crypto/crc32c-pcl-intel-asm_64.S
165 index d9b734d0c8cc7..3c6e01520a973 100644
166 --- a/arch/x86/crypto/crc32c-pcl-intel-asm_64.S
167 +++ b/arch/x86/crypto/crc32c-pcl-intel-asm_64.S
168 @@ -170,7 +170,7 @@ continue_block:
169
170 ## branch into array
171 lea jump_table(%rip), bufp
172 - movzxw (bufp, %rax, 2), len
173 + movzwq (bufp, %rax, 2), len
174 lea crc_array(%rip), bufp
175 lea (bufp, len, 1), bufp
176 JMP_NOSPEC bufp
177 diff --git a/arch/x86/events/amd/ibs.c b/arch/x86/events/amd/ibs.c
178 index 26c36357c4c9c..a023cbe21230a 100644
179 --- a/arch/x86/events/amd/ibs.c
180 +++ b/arch/x86/events/amd/ibs.c
181 @@ -89,6 +89,7 @@ struct perf_ibs {
182 u64 max_period;
183 unsigned long offset_mask[1];
184 int offset_max;
185 + unsigned int fetch_count_reset_broken : 1;
186 struct cpu_perf_ibs __percpu *pcpu;
187
188 struct attribute **format_attrs;
189 @@ -363,7 +364,12 @@ perf_ibs_event_update(struct perf_ibs *perf_ibs, struct perf_event *event,
190 static inline void perf_ibs_enable_event(struct perf_ibs *perf_ibs,
191 struct hw_perf_event *hwc, u64 config)
192 {
193 - wrmsrl(hwc->config_base, hwc->config | config | perf_ibs->enable_mask);
194 + u64 tmp = hwc->config | config;
195 +
196 + if (perf_ibs->fetch_count_reset_broken)
197 + wrmsrl(hwc->config_base, tmp & ~perf_ibs->enable_mask);
198 +
199 + wrmsrl(hwc->config_base, tmp | perf_ibs->enable_mask);
200 }
201
202 /*
203 @@ -733,6 +739,13 @@ static __init void perf_event_ibs_init(void)
204 {
205 struct attribute **attr = ibs_op_format_attrs;
206
207 + /*
208 + * Some chips fail to reset the fetch count when it is written; instead
209 + * they need a 0-1 transition of IbsFetchEn.
210 + */
211 + if (boot_cpu_data.x86 >= 0x16 && boot_cpu_data.x86 <= 0x18)
212 + perf_ibs_fetch.fetch_count_reset_broken = 1;
213 +
214 perf_ibs_pmu_init(&perf_ibs_fetch, "ibs_fetch");
215
216 if (ibs_caps & IBS_CAPS_OPCNT) {
217 diff --git a/arch/x86/pci/intel_mid_pci.c b/arch/x86/pci/intel_mid_pci.c
218 index 43867bc853687..eea5a0f3b959b 100644
219 --- a/arch/x86/pci/intel_mid_pci.c
220 +++ b/arch/x86/pci/intel_mid_pci.c
221 @@ -33,6 +33,7 @@
222 #include <asm/hw_irq.h>
223 #include <asm/io_apic.h>
224 #include <asm/intel-mid.h>
225 +#include <asm/acpi.h>
226
227 #define PCIE_CAP_OFFSET 0x100
228
229 diff --git a/arch/x86/xen/enlighten_pv.c b/arch/x86/xen/enlighten_pv.c
230 index 6d4d8a5700b71..3e66feff524a8 100644
231 --- a/arch/x86/xen/enlighten_pv.c
232 +++ b/arch/x86/xen/enlighten_pv.c
233 @@ -1382,6 +1382,15 @@ asmlinkage __visible void __init xen_start_kernel(void)
234 x86_init.mpparse.get_smp_config = x86_init_uint_noop;
235
236 xen_boot_params_init_edd();
237 +
238 +#ifdef CONFIG_ACPI
239 + /*
240 + * Disable selecting "Firmware First mode" for correctable
241 + * memory errors, as this is the duty of the hypervisor to
242 + * decide.
243 + */
244 + acpi_disable_cmcff = 1;
245 +#endif
246 }
247
248 if (!boot_params.screen_info.orig_video_isVGA)
249 diff --git a/drivers/ata/ahci.h b/drivers/ata/ahci.h
250 index 3dbf398c92eaf..9ef62e647cd20 100644
251 --- a/drivers/ata/ahci.h
252 +++ b/drivers/ata/ahci.h
253 @@ -240,6 +240,8 @@ enum {
254 as default lpm_policy */
255 AHCI_HFLAG_SUSPEND_PHYS = (1 << 26), /* handle PHYs during
256 suspend/resume */
257 + AHCI_HFLAG_IGN_NOTSUPP_POWER_ON = (1 << 27), /* ignore -EOPNOTSUPP
258 + from phy_power_on() */
259
260 /* ap->flags bits */
261
262 diff --git a/drivers/ata/ahci_mvebu.c b/drivers/ata/ahci_mvebu.c
263 index d4bba3ace45d7..3ad46d26d9d51 100644
264 --- a/drivers/ata/ahci_mvebu.c
265 +++ b/drivers/ata/ahci_mvebu.c
266 @@ -227,7 +227,7 @@ static const struct ahci_mvebu_plat_data ahci_mvebu_armada_380_plat_data = {
267
268 static const struct ahci_mvebu_plat_data ahci_mvebu_armada_3700_plat_data = {
269 .plat_config = ahci_mvebu_armada_3700_config,
270 - .flags = AHCI_HFLAG_SUSPEND_PHYS,
271 + .flags = AHCI_HFLAG_SUSPEND_PHYS | AHCI_HFLAG_IGN_NOTSUPP_POWER_ON,
272 };
273
274 static const struct of_device_id ahci_mvebu_of_match[] = {
275 diff --git a/drivers/ata/libahci_platform.c b/drivers/ata/libahci_platform.c
276 index 129556fcf6be7..a1cbb894e5f0a 100644
277 --- a/drivers/ata/libahci_platform.c
278 +++ b/drivers/ata/libahci_platform.c
279 @@ -59,7 +59,7 @@ int ahci_platform_enable_phys(struct ahci_host_priv *hpriv)
280 }
281
282 rc = phy_power_on(hpriv->phys[i]);
283 - if (rc) {
284 + if (rc && !(rc == -EOPNOTSUPP && (hpriv->flags & AHCI_HFLAG_IGN_NOTSUPP_POWER_ON))) {
285 phy_exit(hpriv->phys[i]);
286 goto disable_phys;
287 }
288 diff --git a/drivers/ata/sata_rcar.c b/drivers/ata/sata_rcar.c
289 index 141ac600b64c8..44b0ed8f6bb8a 100644
290 --- a/drivers/ata/sata_rcar.c
291 +++ b/drivers/ata/sata_rcar.c
292 @@ -120,7 +120,7 @@
293 /* Descriptor table word 0 bit (when DTA32M = 1) */
294 #define SATA_RCAR_DTEND BIT(0)
295
296 -#define SATA_RCAR_DMA_BOUNDARY 0x1FFFFFFEUL
297 +#define SATA_RCAR_DMA_BOUNDARY 0x1FFFFFFFUL
298
299 /* Gen2 Physical Layer Control Registers */
300 #define RCAR_GEN2_PHY_CTL1_REG 0x1704
301 diff --git a/drivers/crypto/chelsio/chtls/chtls_cm.c b/drivers/crypto/chelsio/chtls/chtls_cm.c
302 index 9b410ffafc4dd..e2c64c943cfc7 100644
303 --- a/drivers/crypto/chelsio/chtls/chtls_cm.c
304 +++ b/drivers/crypto/chelsio/chtls/chtls_cm.c
305 @@ -692,14 +692,13 @@ static int chtls_pass_open_rpl(struct chtls_dev *cdev, struct sk_buff *skb)
306 if (rpl->status != CPL_ERR_NONE) {
307 pr_info("Unexpected PASS_OPEN_RPL status %u for STID %u\n",
308 rpl->status, stid);
309 - return CPL_RET_BUF_DONE;
310 + } else {
311 + cxgb4_free_stid(cdev->tids, stid, listen_ctx->lsk->sk_family);
312 + sock_put(listen_ctx->lsk);
313 + kfree(listen_ctx);
314 + module_put(THIS_MODULE);
315 }
316 - cxgb4_free_stid(cdev->tids, stid, listen_ctx->lsk->sk_family);
317 - sock_put(listen_ctx->lsk);
318 - kfree(listen_ctx);
319 - module_put(THIS_MODULE);
320 -
321 - return 0;
322 + return CPL_RET_BUF_DONE;
323 }
324
325 static int chtls_close_listsrv_rpl(struct chtls_dev *cdev, struct sk_buff *skb)
326 @@ -716,15 +715,13 @@ static int chtls_close_listsrv_rpl(struct chtls_dev *cdev, struct sk_buff *skb)
327 if (rpl->status != CPL_ERR_NONE) {
328 pr_info("Unexpected CLOSE_LISTSRV_RPL status %u for STID %u\n",
329 rpl->status, stid);
330 - return CPL_RET_BUF_DONE;
331 + } else {
332 + cxgb4_free_stid(cdev->tids, stid, listen_ctx->lsk->sk_family);
333 + sock_put(listen_ctx->lsk);
334 + kfree(listen_ctx);
335 + module_put(THIS_MODULE);
336 }
337 -
338 - cxgb4_free_stid(cdev->tids, stid, listen_ctx->lsk->sk_family);
339 - sock_put(listen_ctx->lsk);
340 - kfree(listen_ctx);
341 - module_put(THIS_MODULE);
342 -
343 - return 0;
344 + return CPL_RET_BUF_DONE;
345 }
346
347 static void chtls_purge_wr_queue(struct sock *sk)
348 @@ -1369,7 +1366,6 @@ static void add_to_reap_list(struct sock *sk)
349 struct chtls_sock *csk = sk->sk_user_data;
350
351 local_bh_disable();
352 - bh_lock_sock(sk);
353 release_tcp_port(sk); /* release the port immediately */
354
355 spin_lock(&reap_list_lock);
356 @@ -1378,7 +1374,6 @@ static void add_to_reap_list(struct sock *sk)
357 if (!csk->passive_reap_next)
358 schedule_work(&reap_task);
359 spin_unlock(&reap_list_lock);
360 - bh_unlock_sock(sk);
361 local_bh_enable();
362 }
363
364 diff --git a/drivers/crypto/chelsio/chtls/chtls_io.c b/drivers/crypto/chelsio/chtls/chtls_io.c
365 index a5903cfc83523..4c44d7c0c2c1f 100644
366 --- a/drivers/crypto/chelsio/chtls/chtls_io.c
367 +++ b/drivers/crypto/chelsio/chtls/chtls_io.c
368 @@ -1537,6 +1537,7 @@ skip_copy:
369 tp->urg_data = 0;
370
371 if ((avail + offset) >= skb->len) {
372 + struct sk_buff *next_skb;
373 if (ULP_SKB_CB(skb)->flags & ULPCB_FLAG_TLS_HDR) {
374 tp->copied_seq += skb->len;
375 hws->rcvpld = skb->hdr_len;
376 @@ -1546,8 +1547,10 @@ skip_copy:
377 chtls_free_skb(sk, skb);
378 buffers_freed++;
379 hws->copied_seq = 0;
380 - if (copied >= target &&
381 - !skb_peek(&sk->sk_receive_queue))
382 + next_skb = skb_peek(&sk->sk_receive_queue);
383 + if (copied >= target && !next_skb)
384 + break;
385 + if (ULP_SKB_CB(next_skb)->flags & ULPCB_FLAG_TLS_HDR)
386 break;
387 }
388 } while (len > 0);
389 diff --git a/drivers/infiniband/core/addr.c b/drivers/infiniband/core/addr.c
390 index 1753a9801b704..8beed4197e73e 100644
391 --- a/drivers/infiniband/core/addr.c
392 +++ b/drivers/infiniband/core/addr.c
393 @@ -645,13 +645,12 @@ static void process_one_req(struct work_struct *_work)
394 req->callback = NULL;
395
396 spin_lock_bh(&lock);
397 + /*
398 + * Although the work will normally have been canceled by the workqueue,
399 + * it can still be requeued as long as it is on the req_list.
400 + */
401 + cancel_delayed_work(&req->work);
402 if (!list_empty(&req->list)) {
403 - /*
404 - * Although the work will normally have been canceled by the
405 - * workqueue, it can still be requeued as long as it is on the
406 - * req_list.
407 - */
408 - cancel_delayed_work(&req->work);
409 list_del_init(&req->list);
410 kfree(req);
411 }
412 diff --git a/drivers/misc/cardreader/rtsx_pcr.c b/drivers/misc/cardreader/rtsx_pcr.c
413 index 4fd57052ddd3d..4c707d8dc3eb3 100644
414 --- a/drivers/misc/cardreader/rtsx_pcr.c
415 +++ b/drivers/misc/cardreader/rtsx_pcr.c
416 @@ -1189,10 +1189,6 @@ void rtsx_pci_init_ocp(struct rtsx_pcr *pcr)
417 rtsx_pci_write_register(pcr, REG_OCPGLITCH,
418 SD_OCP_GLITCH_MASK, pcr->hw_param.ocp_glitch);
419 rtsx_pci_enable_ocp(pcr);
420 - } else {
421 - /* OC power down */
422 - rtsx_pci_write_register(pcr, FPDCTL, OC_POWER_DOWN,
423 - OC_POWER_DOWN);
424 }
425 }
426 }
427 diff --git a/drivers/misc/cxl/pci.c b/drivers/misc/cxl/pci.c
428 index 25a9dd9c0c1b5..2ba899f5659ff 100644
429 --- a/drivers/misc/cxl/pci.c
430 +++ b/drivers/misc/cxl/pci.c
431 @@ -393,8 +393,8 @@ int cxl_calc_capp_routing(struct pci_dev *dev, u64 *chipid,
432 *capp_unit_id = get_capp_unit_id(np, *phb_index);
433 of_node_put(np);
434 if (!*capp_unit_id) {
435 - pr_err("cxl: invalid capp unit id (phb_index: %d)\n",
436 - *phb_index);
437 + pr_err("cxl: No capp unit found for PHB[%lld,%d]. Make sure the adapter is on a capi-compatible slot\n",
438 + *chipid, *phb_index);
439 return -ENODEV;
440 }
441
442 diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
443 index 4f4fd80762610..cdd3764760ed9 100644
444 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
445 +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
446 @@ -1160,16 +1160,6 @@ static void bnxt_queue_sp_work(struct bnxt *bp)
447 schedule_work(&bp->sp_task);
448 }
449
450 -static void bnxt_cancel_sp_work(struct bnxt *bp)
451 -{
452 - if (BNXT_PF(bp)) {
453 - flush_workqueue(bnxt_pf_wq);
454 - } else {
455 - cancel_work_sync(&bp->sp_task);
456 - cancel_delayed_work_sync(&bp->fw_reset_task);
457 - }
458 -}
459 -
460 static void bnxt_sched_reset(struct bnxt *bp, struct bnxt_rx_ring_info *rxr)
461 {
462 if (!rxr->bnapi->in_reset) {
463 @@ -4204,7 +4194,8 @@ static int bnxt_hwrm_do_send_msg(struct bnxt *bp, void *msg, u32 msg_len,
464 u32 bar_offset = BNXT_GRCPF_REG_CHIMP_COMM;
465 u16 dst = BNXT_HWRM_CHNL_CHIMP;
466
467 - if (BNXT_NO_FW_ACCESS(bp))
468 + if (BNXT_NO_FW_ACCESS(bp) &&
469 + le16_to_cpu(req->req_type) != HWRM_FUNC_RESET)
470 return -EBUSY;
471
472 if (msg_len > BNXT_HWRM_MAX_REQ_LEN) {
473 @@ -9193,7 +9184,10 @@ int bnxt_open_nic(struct bnxt *bp, bool irq_re_init, bool link_re_init)
474 {
475 int rc = 0;
476
477 - rc = __bnxt_open_nic(bp, irq_re_init, link_re_init);
478 + if (test_bit(BNXT_STATE_ABORT_ERR, &bp->state))
479 + rc = -EIO;
480 + if (!rc)
481 + rc = __bnxt_open_nic(bp, irq_re_init, link_re_init);
482 if (rc) {
483 netdev_err(bp->dev, "nic open fail (rc: %x)\n", rc);
484 dev_close(bp->dev);
485 @@ -11392,13 +11386,15 @@ static void bnxt_remove_one(struct pci_dev *pdev)
486 if (BNXT_PF(bp))
487 bnxt_sriov_disable(bp);
488
489 + pci_disable_pcie_error_reporting(pdev);
490 + unregister_netdev(dev);
491 clear_bit(BNXT_STATE_IN_FW_RESET, &bp->state);
492 - bnxt_cancel_sp_work(bp);
493 + /* Flush any pending tasks */
494 + cancel_work_sync(&bp->sp_task);
495 + cancel_delayed_work_sync(&bp->fw_reset_task);
496 bp->sp_event = 0;
497
498 bnxt_dl_fw_reporters_destroy(bp, true);
499 - pci_disable_pcie_error_reporting(pdev);
500 - unregister_netdev(dev);
501 bnxt_dl_unregister(bp);
502 bnxt_shutdown_tc(bp);
503
504 @@ -12045,6 +12041,9 @@ static pci_ers_result_t bnxt_io_error_detected(struct pci_dev *pdev,
505 return PCI_ERS_RESULT_DISCONNECT;
506 }
507
508 + if (state == pci_channel_io_frozen)
509 + set_bit(BNXT_STATE_PCI_CHANNEL_IO_FROZEN, &bp->state);
510 +
511 if (netif_running(netdev))
512 bnxt_close(netdev);
513
514 @@ -12068,7 +12067,7 @@ static pci_ers_result_t bnxt_io_slot_reset(struct pci_dev *pdev)
515 {
516 struct net_device *netdev = pci_get_drvdata(pdev);
517 struct bnxt *bp = netdev_priv(netdev);
518 - int err = 0;
519 + int err = 0, off;
520 pci_ers_result_t result = PCI_ERS_RESULT_DISCONNECT;
521
522 netdev_info(bp->dev, "PCI Slot Reset\n");
523 @@ -12080,6 +12079,20 @@ static pci_ers_result_t bnxt_io_slot_reset(struct pci_dev *pdev)
524 "Cannot re-enable PCI device after reset.\n");
525 } else {
526 pci_set_master(pdev);
527 + /* Upon fatal error, our device internal logic that latches to
528 + * BAR value is getting reset and will restore only upon
529 + * rewritting the BARs.
530 + *
531 + * As pci_restore_state() does not re-write the BARs if the
532 + * value is same as saved value earlier, driver needs to
533 + * write the BARs to 0 to force restore, in case of fatal error.
534 + */
535 + if (test_and_clear_bit(BNXT_STATE_PCI_CHANNEL_IO_FROZEN,
536 + &bp->state)) {
537 + for (off = PCI_BASE_ADDRESS_0;
538 + off <= PCI_BASE_ADDRESS_5; off += 4)
539 + pci_write_config_dword(bp->pdev, off, 0);
540 + }
541 pci_restore_state(pdev);
542 pci_save_state(pdev);
543
544 diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
545 index d2dd852d27da9..510ff01bdad8c 100644
546 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h
547 +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
548 @@ -1627,6 +1627,7 @@ struct bnxt {
549 #define BNXT_STATE_IN_FW_RESET 4
550 #define BNXT_STATE_ABORT_ERR 5
551 #define BNXT_STATE_FW_FATAL_COND 6
552 +#define BNXT_STATE_PCI_CHANNEL_IO_FROZEN 8
553
554 #define BNXT_NO_FW_ACCESS(bp) \
555 (test_bit(BNXT_STATE_FW_FATAL_COND, &(bp)->state) || \
556 diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_filter.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_filter.c
557 index 137ff00605d94..202af8dc79662 100644
558 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_filter.c
559 +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_filter.c
560 @@ -145,13 +145,13 @@ static int configure_filter_smac(struct adapter *adap, struct filter_entry *f)
561 int err;
562
563 /* do a set-tcb for smac-sel and CWR bit.. */
564 - err = set_tcb_tflag(adap, f, f->tid, TF_CCTRL_CWR_S, 1, 1);
565 - if (err)
566 - goto smac_err;
567 -
568 err = set_tcb_field(adap, f, f->tid, TCB_SMAC_SEL_W,
569 TCB_SMAC_SEL_V(TCB_SMAC_SEL_M),
570 TCB_SMAC_SEL_V(f->smt->idx), 1);
571 + if (err)
572 + goto smac_err;
573 +
574 + err = set_tcb_tflag(adap, f, f->tid, TF_CCTRL_CWR_S, 1, 1);
575 if (!err)
576 return 0;
577
578 @@ -612,6 +612,7 @@ int set_filter_wr(struct adapter *adapter, int fidx)
579 FW_FILTER_WR_DIRSTEERHASH_V(f->fs.dirsteerhash) |
580 FW_FILTER_WR_LPBK_V(f->fs.action == FILTER_SWITCH) |
581 FW_FILTER_WR_DMAC_V(f->fs.newdmac) |
582 + FW_FILTER_WR_SMAC_V(f->fs.newsmac) |
583 FW_FILTER_WR_INSVLAN_V(f->fs.newvlan == VLAN_INSERT ||
584 f->fs.newvlan == VLAN_REWRITE) |
585 FW_FILTER_WR_RMVLAN_V(f->fs.newvlan == VLAN_REMOVE ||
586 @@ -629,7 +630,7 @@ int set_filter_wr(struct adapter *adapter, int fidx)
587 FW_FILTER_WR_OVLAN_VLD_V(f->fs.val.ovlan_vld) |
588 FW_FILTER_WR_IVLAN_VLDM_V(f->fs.mask.ivlan_vld) |
589 FW_FILTER_WR_OVLAN_VLDM_V(f->fs.mask.ovlan_vld));
590 - fwr->smac_sel = 0;
591 + fwr->smac_sel = f->smt->idx;
592 fwr->rx_chan_rx_rpl_iq =
593 htons(FW_FILTER_WR_RX_CHAN_V(0) |
594 FW_FILTER_WR_RX_RPL_IQ_V(adapter->sge.fw_evtq.abs_id));
595 @@ -1048,11 +1049,8 @@ static void mk_act_open_req6(struct filter_entry *f, struct sk_buff *skb,
596 TX_QUEUE_V(f->fs.nat_mode) |
597 T5_OPT_2_VALID_F |
598 RX_CHANNEL_V(cxgb4_port_e2cchan(f->dev)) |
599 - CONG_CNTRL_V((f->fs.action == FILTER_DROP) |
600 - (f->fs.dirsteer << 1)) |
601 PACE_V((f->fs.maskhash) |
602 - ((f->fs.dirsteerhash) << 1)) |
603 - CCTRL_ECN_V(f->fs.action == FILTER_SWITCH));
604 + ((f->fs.dirsteerhash) << 1)));
605 }
606
607 static void mk_act_open_req(struct filter_entry *f, struct sk_buff *skb,
608 @@ -1088,11 +1086,8 @@ static void mk_act_open_req(struct filter_entry *f, struct sk_buff *skb,
609 TX_QUEUE_V(f->fs.nat_mode) |
610 T5_OPT_2_VALID_F |
611 RX_CHANNEL_V(cxgb4_port_e2cchan(f->dev)) |
612 - CONG_CNTRL_V((f->fs.action == FILTER_DROP) |
613 - (f->fs.dirsteer << 1)) |
614 PACE_V((f->fs.maskhash) |
615 - ((f->fs.dirsteerhash) << 1)) |
616 - CCTRL_ECN_V(f->fs.action == FILTER_SWITCH));
617 + ((f->fs.dirsteerhash) << 1)));
618 }
619
620 static int cxgb4_set_hash_filter(struct net_device *dev,
621 @@ -1748,6 +1743,20 @@ void hash_filter_rpl(struct adapter *adap, const struct cpl_act_open_rpl *rpl)
622 }
623 return;
624 }
625 + switch (f->fs.action) {
626 + case FILTER_PASS:
627 + if (f->fs.dirsteer)
628 + set_tcb_tflag(adap, f, tid,
629 + TF_DIRECT_STEER_S, 1, 1);
630 + break;
631 + case FILTER_DROP:
632 + set_tcb_tflag(adap, f, tid, TF_DROP_S, 1, 1);
633 + break;
634 + case FILTER_SWITCH:
635 + set_tcb_tflag(adap, f, tid, TF_LPBK_S, 1, 1);
636 + break;
637 + }
638 +
639 break;
640
641 default:
642 @@ -1808,22 +1817,11 @@ void filter_rpl(struct adapter *adap, const struct cpl_set_tcb_rpl *rpl)
643 if (ctx)
644 ctx->result = 0;
645 } else if (ret == FW_FILTER_WR_FLT_ADDED) {
646 - int err = 0;
647 -
648 - if (f->fs.newsmac)
649 - err = configure_filter_smac(adap, f);
650 -
651 - if (!err) {
652 - f->pending = 0; /* async setup completed */
653 - f->valid = 1;
654 - if (ctx) {
655 - ctx->result = 0;
656 - ctx->tid = idx;
657 - }
658 - } else {
659 - clear_filter(adap, f);
660 - if (ctx)
661 - ctx->result = err;
662 + f->pending = 0; /* async setup completed */
663 + f->valid = 1;
664 + if (ctx) {
665 + ctx->result = 0;
666 + ctx->tid = idx;
667 }
668 } else {
669 /* Something went wrong. Issue a warning about the
670 diff --git a/drivers/net/ethernet/chelsio/cxgb4/t4_tcb.h b/drivers/net/ethernet/chelsio/cxgb4/t4_tcb.h
671 index 1b9afb192f7f8..358f0fe402701 100644
672 --- a/drivers/net/ethernet/chelsio/cxgb4/t4_tcb.h
673 +++ b/drivers/net/ethernet/chelsio/cxgb4/t4_tcb.h
674 @@ -50,6 +50,10 @@
675 #define TCB_RQ_START_M 0x3ffffffULL
676 #define TCB_RQ_START_V(x) ((x) << TCB_RQ_START_S)
677
678 +#define TF_DROP_S 22
679 +#define TF_DIRECT_STEER_S 23
680 +#define TF_LPBK_S 59
681 +
682 #define TF_CCTRL_ECE_S 60
683 #define TF_CCTRL_CWR_S 61
684 #define TF_CCTRL_RFR_S 62
685 diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
686 index 7d7e712691b92..9b09dd95e8781 100644
687 --- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
688 +++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
689 @@ -2782,8 +2782,8 @@ static void hclgevf_uninit_hdev(struct hclgevf_dev *hdev)
690 hclgevf_uninit_msi(hdev);
691 }
692
693 - hclgevf_pci_uninit(hdev);
694 hclgevf_cmd_uninit(hdev);
695 + hclgevf_pci_uninit(hdev);
696 }
697
698 static int hclgevf_init_ae_dev(struct hnae3_ae_dev *ae_dev)
699 diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
700 index 48105a2eebe4d..91559a52c7adb 100644
701 --- a/drivers/net/ethernet/ibm/ibmvnic.c
702 +++ b/drivers/net/ethernet/ibm/ibmvnic.c
703 @@ -1735,9 +1735,13 @@ static int ibmvnic_set_mac(struct net_device *netdev, void *p)
704 int rc;
705
706 rc = 0;
707 - ether_addr_copy(adapter->mac_addr, addr->sa_data);
708 - if (adapter->state != VNIC_PROBED)
709 + if (!is_valid_ether_addr(addr->sa_data))
710 + return -EADDRNOTAVAIL;
711 +
712 + if (adapter->state != VNIC_PROBED) {
713 + ether_addr_copy(adapter->mac_addr, addr->sa_data);
714 rc = __ibmvnic_set_mac(netdev, addr->sa_data);
715 + }
716
717 return rc;
718 }
719 diff --git a/drivers/net/ethernet/mellanox/mlxsw/core.c b/drivers/net/ethernet/mellanox/mlxsw/core.c
720 index c7c3fc7d1126c..7277706847b18 100644
721 --- a/drivers/net/ethernet/mellanox/mlxsw/core.c
722 +++ b/drivers/net/ethernet/mellanox/mlxsw/core.c
723 @@ -1281,6 +1281,8 @@ void mlxsw_core_bus_device_unregister(struct mlxsw_core *mlxsw_core,
724 if (!reload)
725 devlink_resources_unregister(devlink, NULL);
726 mlxsw_core->bus->fini(mlxsw_core->bus_priv);
727 + if (!reload)
728 + devlink_free(devlink);
729
730 return;
731
732 diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c
733 index f838abdb35e1d..d8881ba773dee 100644
734 --- a/drivers/net/ethernet/realtek/r8169_main.c
735 +++ b/drivers/net/ethernet/realtek/r8169_main.c
736 @@ -6264,7 +6264,7 @@ static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
737 }
738
739 rtl_irq_disable(tp);
740 - napi_schedule_irqoff(&tp->napi);
741 + napi_schedule(&tp->napi);
742 out:
743 rtl_ack_events(tp, status);
744
745 @@ -6470,7 +6470,7 @@ static int rtl_open(struct net_device *dev)
746 rtl_request_firmware(tp);
747
748 retval = request_irq(pci_irq_vector(pdev, 0), rtl8169_interrupt,
749 - IRQF_NO_THREAD | IRQF_SHARED, dev->name, tp);
750 + IRQF_SHARED, dev->name, tp);
751 if (retval < 0)
752 goto err_release_fw_2;
753
754 diff --git a/drivers/net/ethernet/renesas/ravb_main.c b/drivers/net/ethernet/renesas/ravb_main.c
755 index 30cdabf64ccc1..551799fb3842d 100644
756 --- a/drivers/net/ethernet/renesas/ravb_main.c
757 +++ b/drivers/net/ethernet/renesas/ravb_main.c
758 @@ -1741,12 +1741,16 @@ static int ravb_hwtstamp_get(struct net_device *ndev, struct ifreq *req)
759 config.flags = 0;
760 config.tx_type = priv->tstamp_tx_ctrl ? HWTSTAMP_TX_ON :
761 HWTSTAMP_TX_OFF;
762 - if (priv->tstamp_rx_ctrl & RAVB_RXTSTAMP_TYPE_V2_L2_EVENT)
763 + switch (priv->tstamp_rx_ctrl & RAVB_RXTSTAMP_TYPE) {
764 + case RAVB_RXTSTAMP_TYPE_V2_L2_EVENT:
765 config.rx_filter = HWTSTAMP_FILTER_PTP_V2_L2_EVENT;
766 - else if (priv->tstamp_rx_ctrl & RAVB_RXTSTAMP_TYPE_ALL)
767 + break;
768 + case RAVB_RXTSTAMP_TYPE_ALL:
769 config.rx_filter = HWTSTAMP_FILTER_ALL;
770 - else
771 + break;
772 + default:
773 config.rx_filter = HWTSTAMP_FILTER_NONE;
774 + }
775
776 return copy_to_user(req->ifr_data, &config, sizeof(config)) ?
777 -EFAULT : 0;
778 diff --git a/drivers/net/gtp.c b/drivers/net/gtp.c
779 index 634bdea38ecb3..4e19c3149848b 100644
780 --- a/drivers/net/gtp.c
781 +++ b/drivers/net/gtp.c
782 @@ -663,10 +663,6 @@ static int gtp_newlink(struct net *src_net, struct net_device *dev,
783
784 gtp = netdev_priv(dev);
785
786 - err = gtp_encap_enable(gtp, data);
787 - if (err < 0)
788 - return err;
789 -
790 if (!data[IFLA_GTP_PDP_HASHSIZE]) {
791 hashsize = 1024;
792 } else {
793 @@ -677,12 +673,16 @@ static int gtp_newlink(struct net *src_net, struct net_device *dev,
794
795 err = gtp_hashtable_new(gtp, hashsize);
796 if (err < 0)
797 - goto out_encap;
798 + return err;
799 +
800 + err = gtp_encap_enable(gtp, data);
801 + if (err < 0)
802 + goto out_hashtable;
803
804 err = register_netdevice(dev);
805 if (err < 0) {
806 netdev_dbg(dev, "failed to register new netdev %d\n", err);
807 - goto out_hashtable;
808 + goto out_encap;
809 }
810
811 gn = net_generic(dev_net(dev), gtp_net_id);
812 @@ -693,11 +693,11 @@ static int gtp_newlink(struct net *src_net, struct net_device *dev,
813
814 return 0;
815
816 +out_encap:
817 + gtp_encap_disable(gtp);
818 out_hashtable:
819 kfree(gtp->addr_hash);
820 kfree(gtp->tid_hash);
821 -out_encap:
822 - gtp_encap_disable(gtp);
823 return err;
824 }
825
826 diff --git a/drivers/net/wireless/intersil/p54/p54pci.c b/drivers/net/wireless/intersil/p54/p54pci.c
827 index 80ad0b7eaef43..f8c6027cab6b4 100644
828 --- a/drivers/net/wireless/intersil/p54/p54pci.c
829 +++ b/drivers/net/wireless/intersil/p54/p54pci.c
830 @@ -329,10 +329,12 @@ static void p54p_tx(struct ieee80211_hw *dev, struct sk_buff *skb)
831 struct p54p_desc *desc;
832 dma_addr_t mapping;
833 u32 idx, i;
834 + __le32 device_addr;
835
836 spin_lock_irqsave(&priv->lock, flags);
837 idx = le32_to_cpu(ring_control->host_idx[1]);
838 i = idx % ARRAY_SIZE(ring_control->tx_data);
839 + device_addr = ((struct p54_hdr *)skb->data)->req_id;
840
841 mapping = pci_map_single(priv->pdev, skb->data, skb->len,
842 PCI_DMA_TODEVICE);
843 @@ -346,7 +348,7 @@ static void p54p_tx(struct ieee80211_hw *dev, struct sk_buff *skb)
844
845 desc = &ring_control->tx_data[i];
846 desc->host_addr = cpu_to_le32(mapping);
847 - desc->device_addr = ((struct p54_hdr *)skb->data)->req_id;
848 + desc->device_addr = device_addr;
849 desc->len = cpu_to_le16(skb->len);
850 desc->flags = 0;
851
852 diff --git a/drivers/phy/marvell/phy-mvebu-a3700-comphy.c b/drivers/phy/marvell/phy-mvebu-a3700-comphy.c
853 index 1a138be8bd6a0..810f25a476321 100644
854 --- a/drivers/phy/marvell/phy-mvebu-a3700-comphy.c
855 +++ b/drivers/phy/marvell/phy-mvebu-a3700-comphy.c
856 @@ -26,7 +26,6 @@
857 #define COMPHY_SIP_POWER_ON 0x82000001
858 #define COMPHY_SIP_POWER_OFF 0x82000002
859 #define COMPHY_SIP_PLL_LOCK 0x82000003
860 -#define COMPHY_FW_NOT_SUPPORTED (-1)
861
862 #define COMPHY_FW_MODE_SATA 0x1
863 #define COMPHY_FW_MODE_SGMII 0x2
864 @@ -112,10 +111,19 @@ static int mvebu_a3700_comphy_smc(unsigned long function, unsigned long lane,
865 unsigned long mode)
866 {
867 struct arm_smccc_res res;
868 + s32 ret;
869
870 arm_smccc_smc(function, lane, mode, 0, 0, 0, 0, 0, &res);
871 + ret = res.a0;
872
873 - return res.a0;
874 + switch (ret) {
875 + case SMCCC_RET_SUCCESS:
876 + return 0;
877 + case SMCCC_RET_NOT_SUPPORTED:
878 + return -EOPNOTSUPP;
879 + default:
880 + return -EINVAL;
881 + }
882 }
883
884 static int mvebu_a3700_comphy_get_fw_mode(int lane, int port,
885 @@ -220,7 +228,7 @@ static int mvebu_a3700_comphy_power_on(struct phy *phy)
886 }
887
888 ret = mvebu_a3700_comphy_smc(COMPHY_SIP_POWER_ON, lane->id, fw_param);
889 - if (ret == COMPHY_FW_NOT_SUPPORTED)
890 + if (ret == -EOPNOTSUPP)
891 dev_err(lane->dev,
892 "unsupported SMC call, try updating your firmware\n");
893
894 diff --git a/drivers/phy/marvell/phy-mvebu-cp110-comphy.c b/drivers/phy/marvell/phy-mvebu-cp110-comphy.c
895 index e3b87c94aaf69..849351b4805f5 100644
896 --- a/drivers/phy/marvell/phy-mvebu-cp110-comphy.c
897 +++ b/drivers/phy/marvell/phy-mvebu-cp110-comphy.c
898 @@ -123,7 +123,6 @@
899
900 #define COMPHY_SIP_POWER_ON 0x82000001
901 #define COMPHY_SIP_POWER_OFF 0x82000002
902 -#define COMPHY_FW_NOT_SUPPORTED (-1)
903
904 /*
905 * A lane is described by the following bitfields:
906 @@ -273,10 +272,19 @@ static int mvebu_comphy_smc(unsigned long function, unsigned long phys,
907 unsigned long lane, unsigned long mode)
908 {
909 struct arm_smccc_res res;
910 + s32 ret;
911
912 arm_smccc_smc(function, phys, lane, mode, 0, 0, 0, 0, &res);
913 + ret = res.a0;
914
915 - return res.a0;
916 + switch (ret) {
917 + case SMCCC_RET_SUCCESS:
918 + return 0;
919 + case SMCCC_RET_NOT_SUPPORTED:
920 + return -EOPNOTSUPP;
921 + default:
922 + return -EINVAL;
923 + }
924 }
925
926 static int mvebu_comphy_get_mode(bool fw_mode, int lane, int port,
927 @@ -819,7 +827,7 @@ static int mvebu_comphy_power_on(struct phy *phy)
928 if (!ret)
929 return ret;
930
931 - if (ret == COMPHY_FW_NOT_SUPPORTED)
932 + if (ret == -EOPNOTSUPP)
933 dev_err(priv->dev,
934 "unsupported SMC call, try updating your firmware\n");
935
936 diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c
937 index a8a538b34b535..16720c97a4dde 100644
938 --- a/drivers/tty/serial/amba-pl011.c
939 +++ b/drivers/tty/serial/amba-pl011.c
940 @@ -313,8 +313,9 @@ static void pl011_write(unsigned int val, const struct uart_amba_port *uap,
941 */
942 static int pl011_fifo_to_tty(struct uart_amba_port *uap)
943 {
944 - u16 status;
945 unsigned int ch, flag, fifotaken;
946 + int sysrq;
947 + u16 status;
948
949 for (fifotaken = 0; fifotaken != 256; fifotaken++) {
950 status = pl011_read(uap, REG_FR);
951 @@ -349,10 +350,12 @@ static int pl011_fifo_to_tty(struct uart_amba_port *uap)
952 flag = TTY_FRAME;
953 }
954
955 - if (uart_handle_sysrq_char(&uap->port, ch & 255))
956 - continue;
957 + spin_unlock(&uap->port.lock);
958 + sysrq = uart_handle_sysrq_char(&uap->port, ch & 255);
959 + spin_lock(&uap->port.lock);
960
961 - uart_insert_char(&uap->port, ch, UART011_DR_OE, ch, flag);
962 + if (!sysrq)
963 + uart_insert_char(&uap->port, ch, UART011_DR_OE, ch, flag);
964 }
965
966 return fifotaken;
967 diff --git a/drivers/tty/serial/qcom_geni_serial.c b/drivers/tty/serial/qcom_geni_serial.c
968 index 0b184256034fb..9b148f78323f0 100644
969 --- a/drivers/tty/serial/qcom_geni_serial.c
970 +++ b/drivers/tty/serial/qcom_geni_serial.c
971 @@ -970,7 +970,7 @@ static void qcom_geni_serial_set_termios(struct uart_port *uport,
972 sampling_rate = UART_OVERSAMPLING;
973 /* Sampling rate is halved for IP versions >= 2.5 */
974 ver = geni_se_get_qup_hw_version(&port->se);
975 - if (GENI_SE_VERSION_MAJOR(ver) >= 2 && GENI_SE_VERSION_MINOR(ver) >= 5)
976 + if (ver >= QUP_SE_VERSION_2_5)
977 sampling_rate /= 2;
978
979 clk_rate = get_clk_div_rate(baud, sampling_rate, &clk_div);
980 diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c
981 index 81401f386c9ce..246864bbb3e4e 100644
982 --- a/drivers/xen/gntdev.c
983 +++ b/drivers/xen/gntdev.c
984 @@ -831,17 +831,18 @@ struct gntdev_copy_batch {
985 s16 __user *status[GNTDEV_COPY_BATCH];
986 unsigned int nr_ops;
987 unsigned int nr_pages;
988 + bool writeable;
989 };
990
991 static int gntdev_get_page(struct gntdev_copy_batch *batch, void __user *virt,
992 - bool writeable, unsigned long *gfn)
993 + unsigned long *gfn)
994 {
995 unsigned long addr = (unsigned long)virt;
996 struct page *page;
997 unsigned long xen_pfn;
998 int ret;
999
1000 - ret = get_user_pages_fast(addr, 1, writeable ? FOLL_WRITE : 0, &page);
1001 + ret = get_user_pages_fast(addr, 1, batch->writeable ? FOLL_WRITE : 0, &page);
1002 if (ret < 0)
1003 return ret;
1004
1005 @@ -857,9 +858,13 @@ static void gntdev_put_pages(struct gntdev_copy_batch *batch)
1006 {
1007 unsigned int i;
1008
1009 - for (i = 0; i < batch->nr_pages; i++)
1010 + for (i = 0; i < batch->nr_pages; i++) {
1011 + if (batch->writeable && !PageDirty(batch->pages[i]))
1012 + set_page_dirty_lock(batch->pages[i]);
1013 put_page(batch->pages[i]);
1014 + }
1015 batch->nr_pages = 0;
1016 + batch->writeable = false;
1017 }
1018
1019 static int gntdev_copy(struct gntdev_copy_batch *batch)
1020 @@ -948,8 +953,9 @@ static int gntdev_grant_copy_seg(struct gntdev_copy_batch *batch,
1021 virt = seg->source.virt + copied;
1022 off = (unsigned long)virt & ~XEN_PAGE_MASK;
1023 len = min(len, (size_t)XEN_PAGE_SIZE - off);
1024 + batch->writeable = false;
1025
1026 - ret = gntdev_get_page(batch, virt, false, &gfn);
1027 + ret = gntdev_get_page(batch, virt, &gfn);
1028 if (ret < 0)
1029 return ret;
1030
1031 @@ -967,8 +973,9 @@ static int gntdev_grant_copy_seg(struct gntdev_copy_batch *batch,
1032 virt = seg->dest.virt + copied;
1033 off = (unsigned long)virt & ~XEN_PAGE_MASK;
1034 len = min(len, (size_t)XEN_PAGE_SIZE - off);
1035 + batch->writeable = true;
1036
1037 - ret = gntdev_get_page(batch, virt, true, &gfn);
1038 + ret = gntdev_get_page(batch, virt, &gfn);
1039 if (ret < 0)
1040 return ret;
1041
1042 diff --git a/fs/efivarfs/super.c b/fs/efivarfs/super.c
1043 index fa4f6447ddad6..9760a52800b42 100644
1044 --- a/fs/efivarfs/super.c
1045 +++ b/fs/efivarfs/super.c
1046 @@ -141,6 +141,9 @@ static int efivarfs_callback(efi_char16_t *name16, efi_guid_t vendor,
1047
1048 name[len + EFI_VARIABLE_GUID_LEN+1] = '\0';
1049
1050 + /* replace invalid slashes like kobject_set_name_vargs does for /sys/firmware/efi/vars. */
1051 + strreplace(name, '/', '!');
1052 +
1053 inode = efivarfs_get_inode(sb, d_inode(root), S_IFREG | 0644, 0,
1054 is_removable);
1055 if (!inode)
1056 diff --git a/fs/erofs/xattr.c b/fs/erofs/xattr.c
1057 index b766c3ee5fa8c..503bea20cde26 100644
1058 --- a/fs/erofs/xattr.c
1059 +++ b/fs/erofs/xattr.c
1060 @@ -473,8 +473,6 @@ static int erofs_xattr_generic_get(const struct xattr_handler *handler,
1061 return -EOPNOTSUPP;
1062 break;
1063 case EROFS_XATTR_INDEX_TRUSTED:
1064 - if (!capable(CAP_SYS_ADMIN))
1065 - return -EPERM;
1066 break;
1067 case EROFS_XATTR_INDEX_SECURITY:
1068 break;
1069 diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
1070 index f9022b7028754..40c262b3f9ff5 100644
1071 --- a/fs/fuse/dev.c
1072 +++ b/fs/fuse/dev.c
1073 @@ -786,15 +786,16 @@ static int fuse_try_move_page(struct fuse_copy_state *cs, struct page **pagep)
1074 struct page *newpage;
1075 struct pipe_buffer *buf = cs->pipebufs;
1076
1077 + get_page(oldpage);
1078 err = unlock_request(cs->req);
1079 if (err)
1080 - return err;
1081 + goto out_put_old;
1082
1083 fuse_copy_finish(cs);
1084
1085 err = pipe_buf_confirm(cs->pipe, buf);
1086 if (err)
1087 - return err;
1088 + goto out_put_old;
1089
1090 BUG_ON(!cs->nr_segs);
1091 cs->currbuf = buf;
1092 @@ -834,7 +835,7 @@ static int fuse_try_move_page(struct fuse_copy_state *cs, struct page **pagep)
1093 err = replace_page_cache_page(oldpage, newpage, GFP_KERNEL);
1094 if (err) {
1095 unlock_page(newpage);
1096 - return err;
1097 + goto out_put_old;
1098 }
1099
1100 get_page(newpage);
1101 @@ -853,14 +854,19 @@ static int fuse_try_move_page(struct fuse_copy_state *cs, struct page **pagep)
1102 if (err) {
1103 unlock_page(newpage);
1104 put_page(newpage);
1105 - return err;
1106 + goto out_put_old;
1107 }
1108
1109 unlock_page(oldpage);
1110 + /* Drop ref for ap->pages[] array */
1111 put_page(oldpage);
1112 cs->len = 0;
1113
1114 - return 0;
1115 + err = 0;
1116 +out_put_old:
1117 + /* Drop ref obtained in this function */
1118 + put_page(oldpage);
1119 + return err;
1120
1121 out_fallback_unlock:
1122 unlock_page(newpage);
1123 @@ -869,10 +875,10 @@ out_fallback:
1124 cs->offset = buf->offset;
1125
1126 err = lock_request(cs->req);
1127 - if (err)
1128 - return err;
1129 + if (!err)
1130 + err = 1;
1131
1132 - return 1;
1133 + goto out_put_old;
1134 }
1135
1136 static int fuse_ref_page(struct fuse_copy_state *cs, struct page *page,
1137 @@ -884,14 +890,16 @@ static int fuse_ref_page(struct fuse_copy_state *cs, struct page *page,
1138 if (cs->nr_segs == cs->pipe->buffers)
1139 return -EIO;
1140
1141 + get_page(page);
1142 err = unlock_request(cs->req);
1143 - if (err)
1144 + if (err) {
1145 + put_page(page);
1146 return err;
1147 + }
1148
1149 fuse_copy_finish(cs);
1150
1151 buf = cs->pipebufs;
1152 - get_page(page);
1153 buf->page = page;
1154 buf->offset = offset;
1155 buf->len = count;
1156 diff --git a/include/linux/mtd/pfow.h b/include/linux/mtd/pfow.h
1157 index 122f3439e1af2..c65d7a3be3c69 100644
1158 --- a/include/linux/mtd/pfow.h
1159 +++ b/include/linux/mtd/pfow.h
1160 @@ -128,7 +128,7 @@ static inline void print_drs_error(unsigned dsr)
1161
1162 if (!(dsr & DSR_AVAILABLE))
1163 printk(KERN_NOTICE"DSR.15: (0) Device not Available\n");
1164 - if (prog_status & 0x03)
1165 + if ((prog_status & 0x03) == 0x03)
1166 printk(KERN_NOTICE"DSR.9,8: (11) Attempt to program invalid "
1167 "half with 41h command\n");
1168 else if (prog_status & 0x02)
1169 diff --git a/include/linux/pm.h b/include/linux/pm.h
1170 index 4c441be03079d..c1d21e9a864f3 100644
1171 --- a/include/linux/pm.h
1172 +++ b/include/linux/pm.h
1173 @@ -598,7 +598,7 @@ struct dev_pm_info {
1174 #endif
1175 #ifdef CONFIG_PM
1176 struct hrtimer suspend_timer;
1177 - unsigned long timer_expires;
1178 + u64 timer_expires;
1179 struct work_struct work;
1180 wait_queue_head_t wait_queue;
1181 struct wake_irq *wakeirq;
1182 diff --git a/include/linux/qcom-geni-se.h b/include/linux/qcom-geni-se.h
1183 index dd464943f717a..5b90eff50bf6e 100644
1184 --- a/include/linux/qcom-geni-se.h
1185 +++ b/include/linux/qcom-geni-se.h
1186 @@ -229,6 +229,9 @@ struct geni_se {
1187 #define GENI_SE_VERSION_MINOR(ver) ((ver & HW_VER_MINOR_MASK) >> HW_VER_MINOR_SHFT)
1188 #define GENI_SE_VERSION_STEP(ver) (ver & HW_VER_STEP_MASK)
1189
1190 +/* QUP SE VERSION value for major number 2 and minor number 5 */
1191 +#define QUP_SE_VERSION_2_5 0x20050000
1192 +
1193 #if IS_ENABLED(CONFIG_QCOM_GENI_SE)
1194
1195 u32 geni_se_get_qup_hw_version(struct geni_se *se);
1196 diff --git a/include/net/netfilter/nf_tables.h b/include/net/netfilter/nf_tables.h
1197 index bc2c73f549622..a576bcbba2fcc 100644
1198 --- a/include/net/netfilter/nf_tables.h
1199 +++ b/include/net/netfilter/nf_tables.h
1200 @@ -872,6 +872,12 @@ static inline struct nft_expr *nft_expr_last(const struct nft_rule *rule)
1201 return (struct nft_expr *)&rule->data[rule->dlen];
1202 }
1203
1204 +static inline bool nft_expr_more(const struct nft_rule *rule,
1205 + const struct nft_expr *expr)
1206 +{
1207 + return expr != nft_expr_last(rule) && expr->ops;
1208 +}
1209 +
1210 static inline struct nft_userdata *nft_userdata(const struct nft_rule *rule)
1211 {
1212 return (void *)&rule->data[rule->dlen];
1213 diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
1214 index 77c6be96d6762..8649422e760cc 100644
1215 --- a/include/uapi/linux/bpf.h
1216 +++ b/include/uapi/linux/bpf.h
1217 @@ -1294,8 +1294,8 @@ union bpf_attr {
1218 * Return
1219 * The return value depends on the result of the test, and can be:
1220 *
1221 - * * 0, if the *skb* task belongs to the cgroup2.
1222 - * * 1, if the *skb* task does not belong to the cgroup2.
1223 + * * 0, if current task belongs to the cgroup2.
1224 + * * 1, if current task does not belong to the cgroup2.
1225 * * A negative error code, if an error occurred.
1226 *
1227 * int bpf_skb_change_tail(struct sk_buff *skb, u32 len, u64 flags)
1228 diff --git a/net/core/sock.c b/net/core/sock.c
1229 index 1b765e62658f0..33543d59a10d6 100644
1230 --- a/net/core/sock.c
1231 +++ b/net/core/sock.c
1232 @@ -923,7 +923,6 @@ set_rcvbuf:
1233 } else {
1234 sock_reset_flag(sk, SOCK_RCVTSTAMP);
1235 sock_reset_flag(sk, SOCK_RCVTSTAMPNS);
1236 - sock_reset_flag(sk, SOCK_TSTAMP_NEW);
1237 }
1238 break;
1239
1240 diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
1241 index 97f2b11ce2034..d3ced6a39bcf1 100644
1242 --- a/net/ipv4/tcp.c
1243 +++ b/net/ipv4/tcp.c
1244 @@ -484,6 +484,8 @@ static inline bool tcp_stream_is_readable(const struct tcp_sock *tp,
1245 return true;
1246 if (tcp_rmem_pressure(sk))
1247 return true;
1248 + if (tcp_receive_window(tp) <= inet_csk(sk)->icsk_ack.rcv_mss)
1249 + return true;
1250 }
1251 if (sk->sk_prot->stream_memory_read)
1252 return sk->sk_prot->stream_memory_read(sk);
1253 diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
1254 index 62f8ba4048180..54fd6bc5adcca 100644
1255 --- a/net/ipv4/tcp_input.c
1256 +++ b/net/ipv4/tcp_input.c
1257 @@ -4774,7 +4774,8 @@ void tcp_data_ready(struct sock *sk)
1258 int avail = tp->rcv_nxt - tp->copied_seq;
1259
1260 if (avail < sk->sk_rcvlowat && !tcp_rmem_pressure(sk) &&
1261 - !sock_flag(sk, SOCK_DONE))
1262 + !sock_flag(sk, SOCK_DONE) &&
1263 + tcp_receive_window(tp) > inet_csk(sk)->icsk_ack.rcv_mss)
1264 return;
1265
1266 sk->sk_data_ready(sk);
1267 diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c
1268 index ff2d2b514506e..5a77b7a177229 100644
1269 --- a/net/netfilter/nf_tables_api.c
1270 +++ b/net/netfilter/nf_tables_api.c
1271 @@ -254,7 +254,7 @@ static void nft_rule_expr_activate(const struct nft_ctx *ctx,
1272 struct nft_expr *expr;
1273
1274 expr = nft_expr_first(rule);
1275 - while (expr != nft_expr_last(rule) && expr->ops) {
1276 + while (nft_expr_more(rule, expr)) {
1277 if (expr->ops->activate)
1278 expr->ops->activate(ctx, expr);
1279
1280 @@ -269,7 +269,7 @@ static void nft_rule_expr_deactivate(const struct nft_ctx *ctx,
1281 struct nft_expr *expr;
1282
1283 expr = nft_expr_first(rule);
1284 - while (expr != nft_expr_last(rule) && expr->ops) {
1285 + while (nft_expr_more(rule, expr)) {
1286 if (expr->ops->deactivate)
1287 expr->ops->deactivate(ctx, expr, phase);
1288
1289 @@ -2642,7 +2642,7 @@ static void nf_tables_rule_destroy(const struct nft_ctx *ctx,
1290 * is called on error from nf_tables_newrule().
1291 */
1292 expr = nft_expr_first(rule);
1293 - while (expr != nft_expr_last(rule) && expr->ops) {
1294 + while (nft_expr_more(rule, expr)) {
1295 next = nft_expr_next(expr);
1296 nf_tables_expr_destroy(ctx, expr);
1297 expr = next;
1298 diff --git a/net/netfilter/nf_tables_offload.c b/net/netfilter/nf_tables_offload.c
1299 index 914cd0618d5a6..c480549a7f946 100644
1300 --- a/net/netfilter/nf_tables_offload.c
1301 +++ b/net/netfilter/nf_tables_offload.c
1302 @@ -37,7 +37,7 @@ struct nft_flow_rule *nft_flow_rule_create(struct net *net,
1303 struct nft_expr *expr;
1304
1305 expr = nft_expr_first(rule);
1306 - while (expr->ops && expr != nft_expr_last(rule)) {
1307 + while (nft_expr_more(rule, expr)) {
1308 if (expr->ops->offload_flags & NFT_OFFLOAD_F_ACTION)
1309 num_actions++;
1310
1311 @@ -61,7 +61,7 @@ struct nft_flow_rule *nft_flow_rule_create(struct net *net,
1312 ctx->net = net;
1313 ctx->dep.type = NFT_OFFLOAD_DEP_UNSPEC;
1314
1315 - while (expr->ops && expr != nft_expr_last(rule)) {
1316 + while (nft_expr_more(rule, expr)) {
1317 if (!expr->ops->offload) {
1318 err = -EOPNOTSUPP;
1319 goto err_out;
1320 diff --git a/net/sched/act_mpls.c b/net/sched/act_mpls.c
1321 index f496c99d98266..7954021ade33d 100644
1322 --- a/net/sched/act_mpls.c
1323 +++ b/net/sched/act_mpls.c
1324 @@ -408,6 +408,7 @@ static void __exit mpls_cleanup_module(void)
1325 module_init(mpls_init_module);
1326 module_exit(mpls_cleanup_module);
1327
1328 +MODULE_SOFTDEP("post: mpls_gso");
1329 MODULE_AUTHOR("Netronome Systems <oss-drivers@netronome.com>");
1330 MODULE_LICENSE("GPL");
1331 MODULE_DESCRIPTION("MPLS manipulation actions");
1332 diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c
1333 index 42e557d48e4e3..f4101a920d1f9 100644
1334 --- a/net/sched/sch_netem.c
1335 +++ b/net/sched/sch_netem.c
1336 @@ -330,7 +330,7 @@ static s64 tabledist(s64 mu, s32 sigma,
1337
1338 /* default uniform distribution */
1339 if (dist == NULL)
1340 - return ((rnd % (2 * sigma)) + mu) - sigma;
1341 + return ((rnd % (2 * (u32)sigma)) + mu) - sigma;
1342
1343 t = dist->table[rnd % dist->size];
1344 x = (sigma % NETEM_DIST_SCALE) * t;
1345 @@ -812,6 +812,10 @@ static void get_slot(struct netem_sched_data *q, const struct nlattr *attr)
1346 q->slot_config.max_packets = INT_MAX;
1347 if (q->slot_config.max_bytes == 0)
1348 q->slot_config.max_bytes = INT_MAX;
1349 +
1350 + /* capping dist_jitter to the range acceptable by tabledist() */
1351 + q->slot_config.dist_jitter = min_t(__s64, INT_MAX, abs(q->slot_config.dist_jitter));
1352 +
1353 q->slot.packets_left = q->slot_config.max_packets;
1354 q->slot.bytes_left = q->slot_config.max_bytes;
1355 if (q->slot_config.min_delay | q->slot_config.max_delay |
1356 @@ -1037,6 +1041,9 @@ static int netem_change(struct Qdisc *sch, struct nlattr *opt,
1357 if (tb[TCA_NETEM_SLOT])
1358 get_slot(q, tb[TCA_NETEM_SLOT]);
1359
1360 + /* capping jitter to the range acceptable by tabledist() */
1361 + q->jitter = min_t(s64, abs(q->jitter), INT_MAX);
1362 +
1363 return ret;
1364
1365 get_table_failure:
1366 diff --git a/net/tipc/msg.c b/net/tipc/msg.c
1367 index b0ed3c944b2d1..46e89c992c2dc 100644
1368 --- a/net/tipc/msg.c
1369 +++ b/net/tipc/msg.c
1370 @@ -140,12 +140,11 @@ int tipc_buf_append(struct sk_buff **headbuf, struct sk_buff **buf)
1371 if (fragid == FIRST_FRAGMENT) {
1372 if (unlikely(head))
1373 goto err;
1374 - if (skb_cloned(frag))
1375 - frag = skb_copy(frag, GFP_ATOMIC);
1376 + *buf = NULL;
1377 + frag = skb_unshare(frag, GFP_ATOMIC);
1378 if (unlikely(!frag))
1379 goto err;
1380 head = *headbuf = frag;
1381 - *buf = NULL;
1382 TIPC_SKB_CB(head)->tail = NULL;
1383 if (skb_is_nonlinear(head)) {
1384 skb_walk_frags(head, tail) {
1385 diff --git a/scripts/setlocalversion b/scripts/setlocalversion
1386 index a2998b118ef9e..45609dba7d724 100755
1387 --- a/scripts/setlocalversion
1388 +++ b/scripts/setlocalversion
1389 @@ -45,7 +45,7 @@ scm_version()
1390
1391 # Check for git and a git repo.
1392 if test -z "$(git rev-parse --show-cdup 2>/dev/null)" &&
1393 - head=`git rev-parse --verify --short HEAD 2>/dev/null`; then
1394 + head=$(git rev-parse --verify HEAD 2>/dev/null); then
1395
1396 # If we are at a tagged commit (like "v2.6.30-rc6"), we ignore
1397 # it, because this version is defined in the top level Makefile.
1398 @@ -59,11 +59,22 @@ scm_version()
1399 fi
1400 # If we are past a tagged commit (like
1401 # "v2.6.30-rc5-302-g72357d5"), we pretty print it.
1402 - if atag="`git describe 2>/dev/null`"; then
1403 - echo "$atag" | awk -F- '{printf("-%05d-%s", $(NF-1),$(NF))}'
1404 -
1405 - # If we don't have a tag at all we print -g{commitish}.
1406 + #
1407 + # Ensure the abbreviated sha1 has exactly 12
1408 + # hex characters, to make the output
1409 + # independent of git version, local
1410 + # core.abbrev settings and/or total number of
1411 + # objects in the current repository - passing
1412 + # --abbrev=12 ensures a minimum of 12, and the
1413 + # awk substr() then picks the 'g' and first 12
1414 + # hex chars.
1415 + if atag="$(git describe --abbrev=12 2>/dev/null)"; then
1416 + echo "$atag" | awk -F- '{printf("-%05d-%s", $(NF-1),substr($(NF),0,13))}'
1417 +
1418 + # If we don't have a tag at all we print -g{commitish},
1419 + # again using exactly 12 hex chars.
1420 else
1421 + head="$(echo $head | cut -c1-12)"
1422 printf '%s%s' -g $head
1423 fi
1424 fi
1425 diff --git a/security/integrity/evm/evm_main.c b/security/integrity/evm/evm_main.c
1426 index a2c393385db09..615094eda36d6 100644
1427 --- a/security/integrity/evm/evm_main.c
1428 +++ b/security/integrity/evm/evm_main.c
1429 @@ -183,6 +183,12 @@ static enum integrity_status evm_verify_hmac(struct dentry *dentry,
1430 break;
1431 case EVM_IMA_XATTR_DIGSIG:
1432 case EVM_XATTR_PORTABLE_DIGSIG:
1433 + /* accept xattr with non-empty signature field */
1434 + if (xattr_len <= sizeof(struct signature_v2_hdr)) {
1435 + evm_status = INTEGRITY_FAIL;
1436 + goto out;
1437 + }
1438 +
1439 hdr = (struct signature_v2_hdr *)xattr_data;
1440 digest.hdr.algo = hdr->hash_algo;
1441 rc = evm_calc_hash(dentry, xattr_name, xattr_value,
1442 diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h
1443 index 77c6be96d6762..8649422e760cc 100644
1444 --- a/tools/include/uapi/linux/bpf.h
1445 +++ b/tools/include/uapi/linux/bpf.h
1446 @@ -1294,8 +1294,8 @@ union bpf_attr {
1447 * Return
1448 * The return value depends on the result of the test, and can be:
1449 *
1450 - * * 0, if the *skb* task belongs to the cgroup2.
1451 - * * 1, if the *skb* task does not belong to the cgroup2.
1452 + * * 0, if current task belongs to the cgroup2.
1453 + * * 1, if current task does not belong to the cgroup2.
1454 * * A negative error code, if an error occurred.
1455 *
1456 * int bpf_skb_change_tail(struct sk_buff *skb, u32 len, u64 flags)
1457 diff --git a/tools/objtool/orc_gen.c b/tools/objtool/orc_gen.c
1458 index 27a4112848c2b..e8c34b0a8b00c 100644
1459 --- a/tools/objtool/orc_gen.c
1460 +++ b/tools/objtool/orc_gen.c
1461 @@ -88,11 +88,6 @@ static int create_orc_entry(struct section *u_sec, struct section *ip_relasec,
1462 struct orc_entry *orc;
1463 struct rela *rela;
1464
1465 - if (!insn_sec->sym) {
1466 - WARN("missing symbol for section %s", insn_sec->name);
1467 - return -1;
1468 - }
1469 -
1470 /* populate ORC data */
1471 orc = (struct orc_entry *)u_sec->data->d_buf + idx;
1472 memcpy(orc, o, sizeof(*orc));
1473 @@ -105,8 +100,32 @@ static int create_orc_entry(struct section *u_sec, struct section *ip_relasec,
1474 }
1475 memset(rela, 0, sizeof(*rela));
1476
1477 - rela->sym = insn_sec->sym;
1478 - rela->addend = insn_off;
1479 + if (insn_sec->sym) {
1480 + rela->sym = insn_sec->sym;
1481 + rela->addend = insn_off;
1482 + } else {
1483 + /*
1484 + * The Clang assembler doesn't produce section symbols, so we
1485 + * have to reference the function symbol instead:
1486 + */
1487 + rela->sym = find_symbol_containing(insn_sec, insn_off);
1488 + if (!rela->sym) {
1489 + /*
1490 + * Hack alert. This happens when we need to reference
1491 + * the NOP pad insn immediately after the function.
1492 + */
1493 + rela->sym = find_symbol_containing(insn_sec,
1494 + insn_off - 1);
1495 + }
1496 + if (!rela->sym) {
1497 + WARN("missing symbol for insn at offset 0x%lx\n",
1498 + insn_off);
1499 + return -1;
1500 + }
1501 +
1502 + rela->addend = insn_off - rela->sym->offset;
1503 + }
1504 +
1505 rela->type = R_X86_64_PC32;
1506 rela->offset = idx * sizeof(int);
1507