This is the 4.9.174 stable release

-----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAlzSZtEACgkQONu9yGCS
 aT7tmg//ftpae8UyI8ixwMyOmza0J8IgzeM9ywu0PkeQXUdV7xaPTGblhQaSOzkY
 ax3Ltme26eKxEKmfYMpiIH+4sPfWcdhNVeEUwCG4wK2xni7uAYhlh2cWPqff5YP6
 5jPbZDe9vkyVOPt2vzJCjFXRNea2+8sR67I+PJyVKRNluislXqsRWEcBWKhzxZ8a
 /rJxVr8VUJB1DqhTa/xlyQghLV5Gm91RSectdM/WhTnH/Q6+4a+TA5DmwiZAOFcS
 yqYzLihCVjSANkN9UzmQDBt0137yK+X6KJsTiYp7SNgk+kHL3pWvXPW3aY6aF0nS
 L9qyQ/hxeX1U7lL89TagrQhPJVxsTcW0hYgOWd12CvpvGzpZn0+HdBzUv2wVt84j
 CfCkPPIfgCqKOPzwb+GnaWd6KHc2CUpQKQw/UkLFOqpuWm580SwgERfvVx1QjNyO
 WxL4JatP3MwwIIdRXrA0X57LRh0Q2IOq2pj4TSOObzx5777C77yH2PoftGFxYHxA
 XVL69a5bl/74BkhOlowUwu/ih2ehNMaSwgBmyLBszESV7MYYkefiD36UadvqxdyB
 YjGvpBWO3Mlgm9Klv3qHbI7Rj7YTDF/jXanMk3+/454JSiEralHDLxqbCI//tdoI
 Iz6LGoeQlZw7oy3UDHD7dD704ejyb/seKHmn+kqLgEGhVBKOdyY=
 =UlkE
 -----END PGP SIGNATURE-----

Merge 4.9.174 into android-4.9

Changes in 4.9.174
	ALSA: line6: use dynamic buffers
	ipv4: ip_do_fragment: Preserve skb_iif during fragmentation
	ipv6/flowlabel: wait rcu grace period before put_pid()
	ipv6: invert flowlabel sharing check in process and user mode
	packet: validate msg_namelen in send directly
	bnxt_en: Improve multicast address setup logic.
	net: phy: marvell: Fix buffer overrun with stats counters
	x86/suspend: fix false positive KASAN warning on suspend/resume
	mm/kasan: Switch to using __pa_symbol and lm_alias
	x86/unwind: Disable KASAN checks for non-current tasks
	arm64: kasan: avoid bad virt_to_pfn()
	kasan: add a prototype of task_struct to avoid warning
	kasan: avoid -Wmaybe-uninitialized warning
	kasan: remove redundant initialization of variable 'real_size'
	arm64: proc: Set PTE_NG for table entries to avoid traversing them twice
	kasan: prevent compiler from optimizing away memset in tests
	arm64: mm: print out correct page table entries
	arm64: mm: don't print out page table entries on EL0 faults
	caif: reduce stack size with KASAN
	USB: yurex: Fix protection fault after device removal
	USB: w1 ds2490: Fix bug caused by improper use of altsetting array
	usb: usbip: fix isoc packet num validation in get_pipe
	USB: core: Fix unterminated string returned by usb_string()
	USB: core: Fix bug caused by duplicate interface PM usage counter
	nvme-loop: init nvmet_ctrl fatal_err_work when allocate
	HID: logitech: check the return value of create_singlethread_workqueue
	HID: debug: fix race condition with between rdesc_show() and device removal
	rtc: sh: Fix invalid alarm warning for non-enabled alarm
	batman-adv: Reduce claim hash refcnt only for removed entry
	batman-adv: Reduce tt_local hash refcnt only for removed entry
	batman-adv: Reduce tt_global hash refcnt only for removed entry
	igb: Fix WARN_ONCE on runtime suspend
	net/mlx5: E-Switch, Fix esw manager vport indication for more vport commands
	bonding: show full hw address in sysfs for slave entries
	net: stmmac: don't overwrite discard_frame status
	net: stmmac: fix dropping of multi-descriptor RX frames
	net: stmmac: don't log oversized frames
	jffs2: fix use-after-free on symlink traversal
	debugfs: fix use-after-free on symlink traversal
	rtc: da9063: set uie_unsupported when relevant
	vfio/pci: use correct format characters
	scsi: core: add new RDAC LENOVO/DE_Series device
	scsi: storvsc: Fix calculation of sub-channel count
	net: hns: fix KASAN: use-after-free in hns_nic_net_xmit_hw()
	net: hns: Use NAPI_POLL_WEIGHT for hns driver
	net: hns: Fix WARNING when remove HNS driver with SMMU enabled
	hugetlbfs: fix memory leak for resv_map
	sh: fix multiple function definition build errors
	xsysace: Fix error handling in ace_setup
	ARM: orion: don't use using 64-bit DMA masks
	ARM: iop: don't use using 64-bit DMA masks
	perf/x86/amd: Update generic hardware cache events for Family 17h
	staging: iio: adt7316: allow adt751x to use internal vref for all dacs
	staging: iio: adt7316: fix the dac read calculation
	staging: iio: adt7316: fix the dac write calculation
	scsi: RDMA/srpt: Fix a credit leak for aborted commands
	Input: snvs_pwrkey - initialize necessary driver data before enabling IRQ
	selinux: never allow relabeling on context mounts
	x86/mce: Improve error message when kernel cannot recover, p2
	media: v4l2: i2c: ov7670: Fix PLL bypass register values
	Linux 4.9.174

Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
Greg Kroah-Hartman 2019-05-08 07:33:59 +02:00
commit d47e38b332
69 changed files with 612 additions and 318 deletions

View file

@ -365,11 +365,15 @@ autosuspend the interface's device. When the usage counter is = 0
then the interface is considered to be idle, and the kernel may then the interface is considered to be idle, and the kernel may
autosuspend the device. autosuspend the device.
Drivers need not be concerned about balancing changes to the usage Drivers must be careful to balance their overall changes to the usage
counter; the USB core will undo any remaining "get"s when a driver counter. Unbalanced "get"s will remain in effect when a driver is
is unbound from its interface. As a corollary, drivers must not call unbound from its interface, preventing the device from going into
any of the usb_autopm_* functions after their disconnect() routine has runtime suspend should the interface be bound to a driver again. On
returned. the other hand, drivers are allowed to achieve this balance by calling
the ``usb_autopm_*`` functions even after their ``disconnect`` routine
has returned -- say from within a work-queue routine -- provided they
retain an active reference to the interface (via ``usb_get_intf`` and
``usb_put_intf``).
Drivers using the async routines are responsible for their own Drivers using the async routines are responsible for their own
synchronization and mutual exclusion. synchronization and mutual exclusion.

View file

@ -1,6 +1,6 @@
VERSION = 4 VERSION = 4
PATCHLEVEL = 9 PATCHLEVEL = 9
SUBLEVEL = 173 SUBLEVEL = 174
EXTRAVERSION = EXTRAVERSION =
NAME = Roaring Lionus NAME = Roaring Lionus

View file

@ -300,7 +300,7 @@ static struct resource iop13xx_adma_2_resources[] = {
} }
}; };
static u64 iop13xx_adma_dmamask = DMA_BIT_MASK(64); static u64 iop13xx_adma_dmamask = DMA_BIT_MASK(32);
static struct iop_adma_platform_data iop13xx_adma_0_data = { static struct iop_adma_platform_data iop13xx_adma_0_data = {
.hw_id = 0, .hw_id = 0,
.pool_size = PAGE_SIZE, .pool_size = PAGE_SIZE,
@ -324,7 +324,7 @@ static struct platform_device iop13xx_adma_0_channel = {
.resource = iop13xx_adma_0_resources, .resource = iop13xx_adma_0_resources,
.dev = { .dev = {
.dma_mask = &iop13xx_adma_dmamask, .dma_mask = &iop13xx_adma_dmamask,
.coherent_dma_mask = DMA_BIT_MASK(64), .coherent_dma_mask = DMA_BIT_MASK(32),
.platform_data = (void *) &iop13xx_adma_0_data, .platform_data = (void *) &iop13xx_adma_0_data,
}, },
}; };
@ -336,7 +336,7 @@ static struct platform_device iop13xx_adma_1_channel = {
.resource = iop13xx_adma_1_resources, .resource = iop13xx_adma_1_resources,
.dev = { .dev = {
.dma_mask = &iop13xx_adma_dmamask, .dma_mask = &iop13xx_adma_dmamask,
.coherent_dma_mask = DMA_BIT_MASK(64), .coherent_dma_mask = DMA_BIT_MASK(32),
.platform_data = (void *) &iop13xx_adma_1_data, .platform_data = (void *) &iop13xx_adma_1_data,
}, },
}; };
@ -348,7 +348,7 @@ static struct platform_device iop13xx_adma_2_channel = {
.resource = iop13xx_adma_2_resources, .resource = iop13xx_adma_2_resources,
.dev = { .dev = {
.dma_mask = &iop13xx_adma_dmamask, .dma_mask = &iop13xx_adma_dmamask,
.coherent_dma_mask = DMA_BIT_MASK(64), .coherent_dma_mask = DMA_BIT_MASK(32),
.platform_data = (void *) &iop13xx_adma_2_data, .platform_data = (void *) &iop13xx_adma_2_data,
}, },
}; };

View file

@ -152,7 +152,7 @@ static struct resource iop13xx_tpmi_3_resources[] = {
} }
}; };
u64 iop13xx_tpmi_mask = DMA_BIT_MASK(64); u64 iop13xx_tpmi_mask = DMA_BIT_MASK(32);
static struct platform_device iop13xx_tpmi_0_device = { static struct platform_device iop13xx_tpmi_0_device = {
.name = "iop-tpmi", .name = "iop-tpmi",
.id = 0, .id = 0,
@ -160,7 +160,7 @@ static struct platform_device iop13xx_tpmi_0_device = {
.resource = iop13xx_tpmi_0_resources, .resource = iop13xx_tpmi_0_resources,
.dev = { .dev = {
.dma_mask = &iop13xx_tpmi_mask, .dma_mask = &iop13xx_tpmi_mask,
.coherent_dma_mask = DMA_BIT_MASK(64), .coherent_dma_mask = DMA_BIT_MASK(32),
}, },
}; };
@ -171,7 +171,7 @@ static struct platform_device iop13xx_tpmi_1_device = {
.resource = iop13xx_tpmi_1_resources, .resource = iop13xx_tpmi_1_resources,
.dev = { .dev = {
.dma_mask = &iop13xx_tpmi_mask, .dma_mask = &iop13xx_tpmi_mask,
.coherent_dma_mask = DMA_BIT_MASK(64), .coherent_dma_mask = DMA_BIT_MASK(32),
}, },
}; };
@ -182,7 +182,7 @@ static struct platform_device iop13xx_tpmi_2_device = {
.resource = iop13xx_tpmi_2_resources, .resource = iop13xx_tpmi_2_resources,
.dev = { .dev = {
.dma_mask = &iop13xx_tpmi_mask, .dma_mask = &iop13xx_tpmi_mask,
.coherent_dma_mask = DMA_BIT_MASK(64), .coherent_dma_mask = DMA_BIT_MASK(32),
}, },
}; };
@ -193,7 +193,7 @@ static struct platform_device iop13xx_tpmi_3_device = {
.resource = iop13xx_tpmi_3_resources, .resource = iop13xx_tpmi_3_resources,
.dev = { .dev = {
.dma_mask = &iop13xx_tpmi_mask, .dma_mask = &iop13xx_tpmi_mask,
.coherent_dma_mask = DMA_BIT_MASK(64), .coherent_dma_mask = DMA_BIT_MASK(32),
}, },
}; };

View file

@ -143,7 +143,7 @@ struct platform_device iop3xx_dma_0_channel = {
.resource = iop3xx_dma_0_resources, .resource = iop3xx_dma_0_resources,
.dev = { .dev = {
.dma_mask = &iop3xx_adma_dmamask, .dma_mask = &iop3xx_adma_dmamask,
.coherent_dma_mask = DMA_BIT_MASK(64), .coherent_dma_mask = DMA_BIT_MASK(32),
.platform_data = (void *) &iop3xx_dma_0_data, .platform_data = (void *) &iop3xx_dma_0_data,
}, },
}; };
@ -155,7 +155,7 @@ struct platform_device iop3xx_dma_1_channel = {
.resource = iop3xx_dma_1_resources, .resource = iop3xx_dma_1_resources,
.dev = { .dev = {
.dma_mask = &iop3xx_adma_dmamask, .dma_mask = &iop3xx_adma_dmamask,
.coherent_dma_mask = DMA_BIT_MASK(64), .coherent_dma_mask = DMA_BIT_MASK(32),
.platform_data = (void *) &iop3xx_dma_1_data, .platform_data = (void *) &iop3xx_dma_1_data,
}, },
}; };
@ -167,7 +167,7 @@ struct platform_device iop3xx_aau_channel = {
.resource = iop3xx_aau_resources, .resource = iop3xx_aau_resources,
.dev = { .dev = {
.dma_mask = &iop3xx_adma_dmamask, .dma_mask = &iop3xx_adma_dmamask,
.coherent_dma_mask = DMA_BIT_MASK(64), .coherent_dma_mask = DMA_BIT_MASK(32),
.platform_data = (void *) &iop3xx_aau_data, .platform_data = (void *) &iop3xx_aau_data,
}, },
}; };

View file

@ -605,7 +605,7 @@ static struct platform_device orion_xor0_shared = {
.resource = orion_xor0_shared_resources, .resource = orion_xor0_shared_resources,
.dev = { .dev = {
.dma_mask = &orion_xor_dmamask, .dma_mask = &orion_xor_dmamask,
.coherent_dma_mask = DMA_BIT_MASK(64), .coherent_dma_mask = DMA_BIT_MASK(32),
.platform_data = &orion_xor0_pdata, .platform_data = &orion_xor0_pdata,
}, },
}; };
@ -666,7 +666,7 @@ static struct platform_device orion_xor1_shared = {
.resource = orion_xor1_shared_resources, .resource = orion_xor1_shared_resources,
.dev = { .dev = {
.dma_mask = &orion_xor_dmamask, .dma_mask = &orion_xor_dmamask,
.coherent_dma_mask = DMA_BIT_MASK(64), .coherent_dma_mask = DMA_BIT_MASK(32),
.platform_data = &orion_xor1_pdata, .platform_data = &orion_xor1_pdata,
}, },
}; };

View file

@ -40,7 +40,7 @@ void hook_debug_fault_code(int nr, int (*fn)(unsigned long, unsigned int,
int sig, int code, const char *name); int sig, int code, const char *name);
struct mm_struct; struct mm_struct;
extern void show_pte(struct mm_struct *mm, unsigned long addr); extern void show_pte(unsigned long addr);
extern void __show_regs(struct pt_regs *); extern void __show_regs(struct pt_regs *);
extern void (*arm_pm_restart)(enum reboot_mode reboot_mode, const char *cmd); extern void (*arm_pm_restart)(enum reboot_mode reboot_mode, const char *cmd);

View file

@ -79,18 +79,33 @@ static inline int notify_page_fault(struct pt_regs *regs, unsigned int esr)
#endif #endif
/* /*
* Dump out the page tables associated with 'addr' in mm 'mm'. * Dump out the page tables associated with 'addr' in the currently active mm.
*/ */
void show_pte(struct mm_struct *mm, unsigned long addr) void show_pte(unsigned long addr)
{ {
struct mm_struct *mm;
pgd_t *pgd; pgd_t *pgd;
if (!mm) if (addr < TASK_SIZE) {
/* TTBR0 */
mm = current->active_mm;
if (mm == &init_mm) {
pr_alert("[%016lx] user address but active_mm is swapper\n",
addr);
return;
}
} else if (addr >= VA_START) {
/* TTBR1 */
mm = &init_mm; mm = &init_mm;
} else {
pr_alert("[%016lx] address between user and kernel address ranges\n",
addr);
return;
}
pr_alert("pgd = %p\n", mm->pgd); pr_alert("pgd = %p\n", mm->pgd);
pgd = pgd_offset(mm, addr); pgd = pgd_offset(mm, addr);
pr_alert("[%08lx] *pgd=%016llx", addr, pgd_val(*pgd)); pr_alert("[%016lx] *pgd=%016llx", addr, pgd_val(*pgd));
do { do {
pud_t *pud; pud_t *pud;
@ -176,8 +191,8 @@ static bool is_el1_instruction_abort(unsigned int esr)
/* /*
* The kernel tried to access some page that wasn't present. * The kernel tried to access some page that wasn't present.
*/ */
static void __do_kernel_fault(struct mm_struct *mm, unsigned long addr, static void __do_kernel_fault(unsigned long addr, unsigned int esr,
unsigned int esr, struct pt_regs *regs) struct pt_regs *regs)
{ {
/* /*
* Are we prepared to handle this kernel fault? * Are we prepared to handle this kernel fault?
@ -194,7 +209,7 @@ static void __do_kernel_fault(struct mm_struct *mm, unsigned long addr,
(addr < PAGE_SIZE) ? "NULL pointer dereference" : (addr < PAGE_SIZE) ? "NULL pointer dereference" :
"paging request", addr); "paging request", addr);
show_pte(mm, addr); show_pte(addr);
die("Oops", regs, esr); die("Oops", regs, esr);
bust_spinlocks(0); bust_spinlocks(0);
do_exit(SIGKILL); do_exit(SIGKILL);
@ -216,7 +231,6 @@ static void __do_user_fault(struct task_struct *tsk, unsigned long addr,
pr_info("%s[%d]: unhandled %s (%d) at 0x%08lx, esr 0x%03x\n", pr_info("%s[%d]: unhandled %s (%d) at 0x%08lx, esr 0x%03x\n",
tsk->comm, task_pid_nr(tsk), inf->name, sig, tsk->comm, task_pid_nr(tsk), inf->name, sig,
addr, esr); addr, esr);
show_pte(tsk->mm, addr);
show_regs(regs); show_regs(regs);
} }
@ -232,7 +246,6 @@ static void __do_user_fault(struct task_struct *tsk, unsigned long addr,
static void do_bad_area(unsigned long addr, unsigned int esr, struct pt_regs *regs) static void do_bad_area(unsigned long addr, unsigned int esr, struct pt_regs *regs)
{ {
struct task_struct *tsk = current; struct task_struct *tsk = current;
struct mm_struct *mm = tsk->active_mm;
const struct fault_info *inf; const struct fault_info *inf;
/* /*
@ -243,7 +256,7 @@ static void do_bad_area(unsigned long addr, unsigned int esr, struct pt_regs *re
inf = esr_to_fault_info(esr); inf = esr_to_fault_info(esr);
__do_user_fault(tsk, addr, esr, inf->sig, inf->code, regs); __do_user_fault(tsk, addr, esr, inf->sig, inf->code, regs);
} else } else
__do_kernel_fault(mm, addr, esr, regs); __do_kernel_fault(addr, esr, regs);
} }
#define VM_FAULT_BADMAP 0x010000 #define VM_FAULT_BADMAP 0x010000
@ -460,7 +473,7 @@ retry:
return 0; return 0;
no_context: no_context:
__do_kernel_fault(mm, addr, esr, regs); __do_kernel_fault(addr, esr, regs);
return 0; return 0;
} }

View file

@ -161,7 +161,7 @@ void __init kasan_init(void)
clear_pgds(KASAN_SHADOW_START, KASAN_SHADOW_END); clear_pgds(KASAN_SHADOW_START, KASAN_SHADOW_END);
vmemmap_populate(kimg_shadow_start, kimg_shadow_end, vmemmap_populate(kimg_shadow_start, kimg_shadow_end,
pfn_to_nid(virt_to_pfn(_text))); pfn_to_nid(virt_to_pfn(lm_alias(_text))));
/* /*
* vmemmap_populate() has populated the shadow region that covers the * vmemmap_populate() has populated the shadow region that covers the

View file

@ -190,7 +190,8 @@ ENDPROC(idmap_cpu_replace_ttbr1)
dc cvac, cur_\()\type\()p // Ensure any existing dirty dc cvac, cur_\()\type\()p // Ensure any existing dirty
dmb sy // lines are written back before dmb sy // lines are written back before
ldr \type, [cur_\()\type\()p] // loading the entry ldr \type, [cur_\()\type\()p] // loading the entry
tbz \type, #0, next_\()\type // Skip invalid entries tbz \type, #0, skip_\()\type // Skip invalid and
tbnz \type, #11, skip_\()\type // non-global entries
.endm .endm
.macro __idmap_kpti_put_pgtable_ent_ng, type .macro __idmap_kpti_put_pgtable_ent_ng, type
@ -250,8 +251,9 @@ ENTRY(idmap_kpti_install_ng_mappings)
add end_pgdp, cur_pgdp, #(PTRS_PER_PGD * 8) add end_pgdp, cur_pgdp, #(PTRS_PER_PGD * 8)
do_pgd: __idmap_kpti_get_pgtable_ent pgd do_pgd: __idmap_kpti_get_pgtable_ent pgd
tbnz pgd, #1, walk_puds tbnz pgd, #1, walk_puds
__idmap_kpti_put_pgtable_ent_ng pgd
next_pgd: next_pgd:
__idmap_kpti_put_pgtable_ent_ng pgd
skip_pgd:
add cur_pgdp, cur_pgdp, #8 add cur_pgdp, cur_pgdp, #8
cmp cur_pgdp, end_pgdp cmp cur_pgdp, end_pgdp
b.ne do_pgd b.ne do_pgd
@ -279,8 +281,9 @@ walk_puds:
add end_pudp, cur_pudp, #(PTRS_PER_PUD * 8) add end_pudp, cur_pudp, #(PTRS_PER_PUD * 8)
do_pud: __idmap_kpti_get_pgtable_ent pud do_pud: __idmap_kpti_get_pgtable_ent pud
tbnz pud, #1, walk_pmds tbnz pud, #1, walk_pmds
__idmap_kpti_put_pgtable_ent_ng pud
next_pud: next_pud:
__idmap_kpti_put_pgtable_ent_ng pud
skip_pud:
add cur_pudp, cur_pudp, 8 add cur_pudp, cur_pudp, 8
cmp cur_pudp, end_pudp cmp cur_pudp, end_pudp
b.ne do_pud b.ne do_pud
@ -299,8 +302,9 @@ walk_pmds:
add end_pmdp, cur_pmdp, #(PTRS_PER_PMD * 8) add end_pmdp, cur_pmdp, #(PTRS_PER_PMD * 8)
do_pmd: __idmap_kpti_get_pgtable_ent pmd do_pmd: __idmap_kpti_get_pgtable_ent pmd
tbnz pmd, #1, walk_ptes tbnz pmd, #1, walk_ptes
__idmap_kpti_put_pgtable_ent_ng pmd
next_pmd: next_pmd:
__idmap_kpti_put_pgtable_ent_ng pmd
skip_pmd:
add cur_pmdp, cur_pmdp, #8 add cur_pmdp, cur_pmdp, #8
cmp cur_pmdp, end_pmdp cmp cur_pmdp, end_pmdp
b.ne do_pmd b.ne do_pmd
@ -318,7 +322,7 @@ walk_ptes:
add end_ptep, cur_ptep, #(PTRS_PER_PTE * 8) add end_ptep, cur_ptep, #(PTRS_PER_PTE * 8)
do_pte: __idmap_kpti_get_pgtable_ent pte do_pte: __idmap_kpti_get_pgtable_ent pte
__idmap_kpti_put_pgtable_ent_ng pte __idmap_kpti_put_pgtable_ent_ng pte
next_pte: skip_pte:
add cur_ptep, cur_ptep, #8 add cur_ptep, cur_ptep, #8
cmp cur_ptep, end_ptep cmp cur_ptep, end_ptep
b.ne do_pte b.ne do_pte

View file

@ -180,10 +180,10 @@ static struct sh_machine_vector __initmv sh_of_generic_mv = {
struct sh_clk_ops; struct sh_clk_ops;
void __init arch_init_clk_ops(struct sh_clk_ops **ops, int idx) void __init __weak arch_init_clk_ops(struct sh_clk_ops **ops, int idx)
{ {
} }
void __init plat_irq_setup(void) void __init __weak plat_irq_setup(void)
{ {
} }

View file

@ -112,6 +112,110 @@ static __initconst const u64 amd_hw_cache_event_ids
}, },
}; };
static __initconst const u64 amd_hw_cache_event_ids_f17h
[PERF_COUNT_HW_CACHE_MAX]
[PERF_COUNT_HW_CACHE_OP_MAX]
[PERF_COUNT_HW_CACHE_RESULT_MAX] = {
[C(L1D)] = {
[C(OP_READ)] = {
[C(RESULT_ACCESS)] = 0x0040, /* Data Cache Accesses */
[C(RESULT_MISS)] = 0xc860, /* L2$ access from DC Miss */
},
[C(OP_WRITE)] = {
[C(RESULT_ACCESS)] = 0,
[C(RESULT_MISS)] = 0,
},
[C(OP_PREFETCH)] = {
[C(RESULT_ACCESS)] = 0xff5a, /* h/w prefetch DC Fills */
[C(RESULT_MISS)] = 0,
},
},
[C(L1I)] = {
[C(OP_READ)] = {
[C(RESULT_ACCESS)] = 0x0080, /* Instruction cache fetches */
[C(RESULT_MISS)] = 0x0081, /* Instruction cache misses */
},
[C(OP_WRITE)] = {
[C(RESULT_ACCESS)] = -1,
[C(RESULT_MISS)] = -1,
},
[C(OP_PREFETCH)] = {
[C(RESULT_ACCESS)] = 0,
[C(RESULT_MISS)] = 0,
},
},
[C(LL)] = {
[C(OP_READ)] = {
[C(RESULT_ACCESS)] = 0,
[C(RESULT_MISS)] = 0,
},
[C(OP_WRITE)] = {
[C(RESULT_ACCESS)] = 0,
[C(RESULT_MISS)] = 0,
},
[C(OP_PREFETCH)] = {
[C(RESULT_ACCESS)] = 0,
[C(RESULT_MISS)] = 0,
},
},
[C(DTLB)] = {
[C(OP_READ)] = {
[C(RESULT_ACCESS)] = 0xff45, /* All L2 DTLB accesses */
[C(RESULT_MISS)] = 0xf045, /* L2 DTLB misses (PT walks) */
},
[C(OP_WRITE)] = {
[C(RESULT_ACCESS)] = 0,
[C(RESULT_MISS)] = 0,
},
[C(OP_PREFETCH)] = {
[C(RESULT_ACCESS)] = 0,
[C(RESULT_MISS)] = 0,
},
},
[C(ITLB)] = {
[C(OP_READ)] = {
[C(RESULT_ACCESS)] = 0x0084, /* L1 ITLB misses, L2 ITLB hits */
[C(RESULT_MISS)] = 0xff85, /* L1 ITLB misses, L2 misses */
},
[C(OP_WRITE)] = {
[C(RESULT_ACCESS)] = -1,
[C(RESULT_MISS)] = -1,
},
[C(OP_PREFETCH)] = {
[C(RESULT_ACCESS)] = -1,
[C(RESULT_MISS)] = -1,
},
},
[C(BPU)] = {
[C(OP_READ)] = {
[C(RESULT_ACCESS)] = 0x00c2, /* Retired Branch Instr. */
[C(RESULT_MISS)] = 0x00c3, /* Retired Mispredicted BI */
},
[C(OP_WRITE)] = {
[C(RESULT_ACCESS)] = -1,
[C(RESULT_MISS)] = -1,
},
[C(OP_PREFETCH)] = {
[C(RESULT_ACCESS)] = -1,
[C(RESULT_MISS)] = -1,
},
},
[C(NODE)] = {
[C(OP_READ)] = {
[C(RESULT_ACCESS)] = 0,
[C(RESULT_MISS)] = 0,
},
[C(OP_WRITE)] = {
[C(RESULT_ACCESS)] = -1,
[C(RESULT_MISS)] = -1,
},
[C(OP_PREFETCH)] = {
[C(RESULT_ACCESS)] = -1,
[C(RESULT_MISS)] = -1,
},
},
};
/* /*
* AMD Performance Monitor K7 and later, up to and including Family 16h: * AMD Performance Monitor K7 and later, up to and including Family 16h:
*/ */
@ -731,9 +835,10 @@ __init int amd_pmu_init(void)
x86_pmu.amd_nb_constraints = 0; x86_pmu.amd_nb_constraints = 0;
} }
/* Events are common for all AMDs */ if (boot_cpu_data.x86 >= 0x17)
memcpy(hw_cache_event_ids, amd_hw_cache_event_ids, memcpy(hw_cache_event_ids, amd_hw_cache_event_ids_f17h, sizeof(hw_cache_event_ids));
sizeof(hw_cache_event_ids)); else
memcpy(hw_cache_event_ids, amd_hw_cache_event_ids, sizeof(hw_cache_event_ids));
return 0; return 0;
} }

View file

@ -55,13 +55,16 @@ extern int kstack_depth_to_print;
static inline unsigned long * static inline unsigned long *
get_frame_pointer(struct task_struct *task, struct pt_regs *regs) get_frame_pointer(struct task_struct *task, struct pt_regs *regs)
{ {
struct inactive_task_frame *frame;
if (regs) if (regs)
return (unsigned long *)regs->bp; return (unsigned long *)regs->bp;
if (task == current) if (task == current)
return __builtin_frame_address(0); return __builtin_frame_address(0);
return (unsigned long *)((struct inactive_task_frame *)task->thread.sp)->bp; frame = (struct inactive_task_frame *)task->thread.sp;
return (unsigned long *)READ_ONCE_NOCHECK(frame->bp);
} }
#else #else
static inline unsigned long * static inline unsigned long *

View file

@ -109,6 +109,15 @@ ENTRY(do_suspend_lowlevel)
movq pt_regs_r14(%rax), %r14 movq pt_regs_r14(%rax), %r14
movq pt_regs_r15(%rax), %r15 movq pt_regs_r15(%rax), %r15
#ifdef CONFIG_KASAN
/*
* The suspend path may have poisoned some areas deeper in the stack,
* which we now need to unpoison.
*/
movq %rsp, %rdi
call kasan_unpoison_task_stack_below
#endif
xorl %eax, %eax xorl %eax, %eax
addq $8, %rsp addq $8, %rsp
FRAME_END FRAME_END

View file

@ -148,6 +148,11 @@ static struct severity {
SER, MASK(MCI_STATUS_OVER|MCI_UC_SAR|MCI_ADDR|MCACOD, MCI_UC_SAR|MCI_ADDR|MCACOD_DATA), SER, MASK(MCI_STATUS_OVER|MCI_UC_SAR|MCI_ADDR|MCACOD, MCI_UC_SAR|MCI_ADDR|MCACOD_DATA),
KERNEL KERNEL
), ),
MCESEV(
PANIC, "Instruction fetch error in kernel",
SER, MASK(MCI_STATUS_OVER|MCI_UC_SAR|MCI_ADDR|MCACOD, MCI_UC_SAR|MCI_ADDR|MCACOD_INSTR),
KERNEL
),
#endif #endif
MCESEV( MCESEV(
PANIC, "Action required: unknown MCACOD", PANIC, "Action required: unknown MCACOD",

View file

@ -6,6 +6,21 @@
#define FRAME_HEADER_SIZE (sizeof(long) * 2) #define FRAME_HEADER_SIZE (sizeof(long) * 2)
/*
* This disables KASAN checking when reading a value from another task's stack,
* since the other task could be running on another CPU and could have poisoned
* the stack in the meantime.
*/
#define READ_ONCE_TASK_STACK(task, x) \
({ \
unsigned long val; \
if (task == current) \
val = READ_ONCE(x); \
else \
val = READ_ONCE_NOCHECK(x); \
val; \
})
unsigned long unwind_get_return_address(struct unwind_state *state) unsigned long unwind_get_return_address(struct unwind_state *state)
{ {
unsigned long addr; unsigned long addr;
@ -14,7 +29,8 @@ unsigned long unwind_get_return_address(struct unwind_state *state)
if (unwind_done(state)) if (unwind_done(state))
return 0; return 0;
addr = ftrace_graph_ret_addr(state->task, &state->graph_idx, *addr_p, addr = READ_ONCE_TASK_STACK(state->task, *addr_p);
addr = ftrace_graph_ret_addr(state->task, &state->graph_idx, addr,
addr_p); addr_p);
return __kernel_text_address(addr) ? addr : 0; return __kernel_text_address(addr) ? addr : 0;
@ -48,7 +64,7 @@ bool unwind_next_frame(struct unwind_state *state)
if (unwind_done(state)) if (unwind_done(state))
return false; return false;
next_bp = (unsigned long *)*state->bp; next_bp = (unsigned long *)READ_ONCE_TASK_STACK(state->task,*state->bp);
/* make sure the next frame's data is accessible */ /* make sure the next frame's data is accessible */
if (!update_stack_state(state, next_bp, FRAME_HEADER_SIZE)) if (!update_stack_state(state, next_bp, FRAME_HEADER_SIZE))

View file

@ -1062,6 +1062,8 @@ static int ace_setup(struct ace_device *ace)
return 0; return 0;
err_read: err_read:
/* prevent double queue cleanup */
ace->gd->queue = NULL;
put_disk(ace->gd); put_disk(ace->gd);
err_alloc_disk: err_alloc_disk:
blk_cleanup_queue(ace->queue); blk_cleanup_queue(ace->queue);

View file

@ -1058,10 +1058,15 @@ static int hid_debug_rdesc_show(struct seq_file *f, void *p)
seq_printf(f, "\n\n"); seq_printf(f, "\n\n");
/* dump parsed data and input mappings */ /* dump parsed data and input mappings */
if (down_interruptible(&hdev->driver_input_lock))
return 0;
hid_dump_device(hdev, f); hid_dump_device(hdev, f);
seq_printf(f, "\n"); seq_printf(f, "\n");
hid_dump_input_mapping(hdev, f); hid_dump_input_mapping(hdev, f);
up(&hdev->driver_input_lock);
return 0; return 0;
} }

View file

@ -1282,6 +1282,13 @@ static int hidpp_ff_init(struct hidpp_device *hidpp, u8 feature_index)
kfree(data); kfree(data);
return -ENOMEM; return -ENOMEM;
} }
data->wq = create_singlethread_workqueue("hidpp-ff-sendqueue");
if (!data->wq) {
kfree(data->effect_ids);
kfree(data);
return -ENOMEM;
}
data->hidpp = hidpp; data->hidpp = hidpp;
data->feature_index = feature_index; data->feature_index = feature_index;
data->version = version; data->version = version;
@ -1326,7 +1333,6 @@ static int hidpp_ff_init(struct hidpp_device *hidpp, u8 feature_index)
/* ignore boost value at response.fap.params[2] */ /* ignore boost value at response.fap.params[2] */
/* init the hardware command queue */ /* init the hardware command queue */
data->wq = create_singlethread_workqueue("hidpp-ff-sendqueue");
atomic_set(&data->workqueue_size, 0); atomic_set(&data->workqueue_size, 0);
/* initialize with zero autocenter to get wheel in usable state */ /* initialize with zero autocenter to get wheel in usable state */

View file

@ -2368,8 +2368,19 @@ static void srpt_queue_tm_rsp(struct se_cmd *cmd)
srpt_queue_response(cmd); srpt_queue_response(cmd);
} }
/*
* This function is called for aborted commands if no response is sent to the
* initiator. Make sure that the credits freed by aborting a command are
* returned to the initiator the next time a response is sent by incrementing
* ch->req_lim_delta.
*/
static void srpt_aborted_task(struct se_cmd *cmd) static void srpt_aborted_task(struct se_cmd *cmd)
{ {
struct srpt_send_ioctx *ioctx = container_of(cmd,
struct srpt_send_ioctx, cmd);
struct srpt_rdma_ch *ch = ioctx->ch;
atomic_inc(&ch->req_lim_delta);
} }
static int srpt_queue_status(struct se_cmd *cmd) static int srpt_queue_status(struct se_cmd *cmd)

Some files were not shown because too many files have changed in this diff Show more