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:
commit
d47e38b332
69 changed files with 612 additions and 318 deletions
|
|
@ -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.
|
||||||
|
|
|
||||||
2
Makefile
2
Makefile
|
|
@ -1,6 +1,6 @@
|
||||||
VERSION = 4
|
VERSION = 4
|
||||||
PATCHLEVEL = 9
|
PATCHLEVEL = 9
|
||||||
SUBLEVEL = 173
|
SUBLEVEL = 174
|
||||||
EXTRAVERSION =
|
EXTRAVERSION =
|
||||||
NAME = Roaring Lionus
|
NAME = Roaring Lionus
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -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),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 *
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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))
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 */
|
||||||
|
|
|
||||||
|
|
@ -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
Loading…
Reference in a new issue