This is the 5.4.145 stable release

-----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAmE9pNwACgkQONu9yGCS
 aT5g2Q//ZEiIQBvw6uZEA3z1Y6tuKFyIxxwOu24EbCTvB1oXXQX/XXQQPWori1Ny
 OpjuQwXJr2LW+/wEKvUEj8mTrpFD+LsZmXRLBHCw9EqqD5RURDqUZt+xh+4xtV/S
 2EgF0nCO9+84wo628Lc1C2LBJZZEo/kD7LnGeln+BXwRS1FQvGfD+5KIpOR2YzqI
 hrCtVfO5ZQpv59PrAQkfwnfITk9BM1cwA7LCD75WEN59405ZV3mzFyTdvz8s0iGt
 akxmwajLNGjQ/ro567tjpsWiK7EF26mNRTMZqu1jK6h/KjU9sQ4DzCqB+p5TPh/9
 mj/Rzq1lSjLodsR0OznKBqFIVaqXyTU+0cMItjos9MBsG/4GOj8ixbXdFRG99WmK
 bNsYucotSrE9ApYwsmqYaNcHcGeLUIsYCDFCQp3++oeF59+FA7Pp7B4bI/zcYRwY
 aqbfTkMzo8/e4OF0B2LCx+8r0xol1SoLwBfcP3hb7rlKp9OkSYsKrJ/29CUuINe1
 YC5HdrPf2HP36jlVCll5rQa+ERaxtNSCozgwxHG/x2yeOmiVqxdE+vUUmyRidah8
 DvYklCM7upUDi1ujbOwbor9R1jQSXkWMFK76EBB3GJPgguFNyczFXm8xBzfRLQvw
 H6YjIfnxNt+DLPn5uXIEhU7ISTkUno9i1BEd2NoeT1UiYTlk2bw=
 =/lic
 -----END PGP SIGNATURE-----
gpgsig -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCgAdFiEEdQaENiSDAlGTDEbB7G51OISzHs0FAmE+VUgACgkQ7G51OISz
 Hs0D+A//c+QInKUmZ5jcHXXqaiD0JYt5+arGOIBAgIjRcWDL3yJpuuP5nwZRnuRf
 N0SyJjZIpb/WyS27zEaHwOg7xKkhCqagix/J9qdNDP94W0xoGKdXsxotnixXXjMo
 tY9RUqwA45i412x6RA4sXHBmyhgPwSuoLnHk+qVF4xOBD2rshVXzv6zQAO51Lg4J
 3/a2agXlrreCGtHmnKwn47pW+mkHEaquCmcXaz/6PNbWDHwZpmmtCRlsvMW1PyMe
 7TZ/mQ3fofSX3bxuzzYWmddcGTNtwe/IsmEFZmhC3Vl4BGtqE2YKj3439zca1572
 6ttLDy9K3pAg/rf0NhIe7nIlogmJyunP6U8CVnuAwH0esixWxyXSSXUKTOXhKYFG
 jgv/+adhqjSZQhm1p1HY8KItsJE8o5m87b2UKMe1UKGExAJ66qJsgZtuufbEDA5r
 S+qnQEzE4lfaYmCH6WBtn6a1fodONw/KmsJwk5UhNlv2BVS8LQpcpADVRmq/mCDj
 FpCe7uFJVaDnxpUc1Trv6D6YJpL6n1KIUQcVyExtmBtpuKK/KTLs+NP5hpUZ9xtV
 ftAEiZkplJP+qACdCeZt5QukiHBIfds32sUZ4PDp3ANbMmY6UpTWGQyZq+7PNL4d
 +OzCCDzlXRdZioua6z8oTaAkabo2pcK5ao7GXSor35mU6JZvMVg=
 =Z0Kz
 -----END PGP SIGNATURE-----

Merge tag 'v5.4.145' into 5.4-2.3.x-imx

This is the 5.4.145 stable release

Signed-off-by: Andrey Zhizhikin <andrey.zhizhikin@leica-geosystems.com>
This commit is contained in:
Andrey Zhizhikin 2021-09-12 19:30:13 +00:00
commit e4dba8435a
48 changed files with 320 additions and 130 deletions

View File

@ -1,7 +1,7 @@
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
VERSION = 5 VERSION = 5
PATCHLEVEL = 4 PATCHLEVEL = 4
SUBLEVEL = 144 SUBLEVEL = 145
EXTRAVERSION = EXTRAVERSION =
NAME = Kleptomaniac Octopus NAME = Kleptomaniac Octopus

View File

@ -29,6 +29,7 @@ config ARC
select GENERIC_SMP_IDLE_THREAD select GENERIC_SMP_IDLE_THREAD
select HAVE_ARCH_KGDB select HAVE_ARCH_KGDB
select HAVE_ARCH_TRACEHOOK select HAVE_ARCH_TRACEHOOK
select HAVE_COPY_THREAD_TLS
select HAVE_DEBUG_STACKOVERFLOW select HAVE_DEBUG_STACKOVERFLOW
select HAVE_FUTEX_CMPXCHG if FUTEX select HAVE_FUTEX_CMPXCHG if FUTEX
select HAVE_IOREMAP_PROT select HAVE_IOREMAP_PROT

View File

@ -11,6 +11,7 @@
#include <linux/types.h> #include <linux/types.h>
int sys_clone_wrapper(int, int, int, int, int); int sys_clone_wrapper(int, int, int, int, int);
int sys_clone3_wrapper(void *, size_t);
int sys_cacheflush(uint32_t, uint32_t uint32_t); int sys_cacheflush(uint32_t, uint32_t uint32_t);
int sys_arc_settls(void *); int sys_arc_settls(void *);
int sys_arc_gettls(void); int sys_arc_gettls(void);

View File

@ -21,6 +21,7 @@
#define __ARCH_WANT_SET_GET_RLIMIT #define __ARCH_WANT_SET_GET_RLIMIT
#define __ARCH_WANT_SYS_EXECVE #define __ARCH_WANT_SYS_EXECVE
#define __ARCH_WANT_SYS_CLONE #define __ARCH_WANT_SYS_CLONE
#define __ARCH_WANT_SYS_CLONE3
#define __ARCH_WANT_SYS_VFORK #define __ARCH_WANT_SYS_VFORK
#define __ARCH_WANT_SYS_FORK #define __ARCH_WANT_SYS_FORK
#define __ARCH_WANT_TIME32_SYSCALLS #define __ARCH_WANT_TIME32_SYSCALLS

View File

@ -35,6 +35,18 @@ ENTRY(sys_clone_wrapper)
b .Lret_from_system_call b .Lret_from_system_call
END(sys_clone_wrapper) END(sys_clone_wrapper)
ENTRY(sys_clone3_wrapper)
SAVE_CALLEE_SAVED_USER
bl @sys_clone3
DISCARD_CALLEE_SAVED_USER
GET_CURR_THR_INFO_FLAGS r10
btst r10, TIF_SYSCALL_TRACE
bnz tracesys_exit
b .Lret_from_system_call
END(sys_clone3_wrapper)
ENTRY(ret_from_fork) ENTRY(ret_from_fork)
; when the forked child comes here from the __switch_to function ; when the forked child comes here from the __switch_to function
; r0 has the last task pointer. ; r0 has the last task pointer.

View File

@ -171,9 +171,8 @@ asmlinkage void ret_from_fork(void);
* | user_r25 | * | user_r25 |
* ------------------ <===== END of PAGE * ------------------ <===== END of PAGE
*/ */
int copy_thread(unsigned long clone_flags, int copy_thread_tls(unsigned long clone_flags, unsigned long usp,
unsigned long usp, unsigned long kthread_arg, unsigned long kthread_arg, struct task_struct *p, unsigned long tls)
struct task_struct *p)
{ {
struct pt_regs *c_regs; /* child's pt_regs */ struct pt_regs *c_regs; /* child's pt_regs */
unsigned long *childksp; /* to unwind out of __switch_to() */ unsigned long *childksp; /* to unwind out of __switch_to() */
@ -231,7 +230,7 @@ int copy_thread(unsigned long clone_flags,
* set task's userland tls data ptr from 4th arg * set task's userland tls data ptr from 4th arg
* clone C-lib call is difft from clone sys-call * clone C-lib call is difft from clone sys-call
*/ */
task_thread_info(p)->thr_ptr = regs->r3; task_thread_info(p)->thr_ptr = tls;
} else { } else {
/* Normal fork case: set parent's TLS ptr in child */ /* Normal fork case: set parent's TLS ptr in child */
task_thread_info(p)->thr_ptr = task_thread_info(p)->thr_ptr =

View File

@ -7,6 +7,7 @@
#include <asm/syscalls.h> #include <asm/syscalls.h>
#define sys_clone sys_clone_wrapper #define sys_clone sys_clone_wrapper
#define sys_clone3 sys_clone3_wrapper
#undef __SYSCALL #undef __SYSCALL
#define __SYSCALL(nr, call) [nr] = (call), #define __SYSCALL(nr, call) [nr] = (call),

View File

@ -17,10 +17,14 @@ CFLAGS_REMOVE_return_address.o = -pg
# Object file lists. # Object file lists.
obj-y := elf.o entry-common.o irq.o opcodes.o \ obj-y := elf.o entry-common.o irq.o opcodes.o \
process.o ptrace.o reboot.o return_address.o \ process.o ptrace.o reboot.o \
setup.o signal.o sigreturn_codes.o \ setup.o signal.o sigreturn_codes.o \
stacktrace.o sys_arm.o time.o traps.o stacktrace.o sys_arm.o time.o traps.o
ifneq ($(CONFIG_ARM_UNWIND),y)
obj-$(CONFIG_FRAME_POINTER) += return_address.o
endif
obj-$(CONFIG_ATAGS) += atags_parse.o obj-$(CONFIG_ATAGS) += atags_parse.o
obj-$(CONFIG_ATAGS_PROC) += atags_proc.o obj-$(CONFIG_ATAGS_PROC) += atags_proc.o
obj-$(CONFIG_DEPRECATED_PARAM_STRUCT) += atags_compat.o obj-$(CONFIG_DEPRECATED_PARAM_STRUCT) += atags_compat.o

View File

@ -7,8 +7,6 @@
*/ */
#include <linux/export.h> #include <linux/export.h>
#include <linux/ftrace.h> #include <linux/ftrace.h>
#if defined(CONFIG_FRAME_POINTER) && !defined(CONFIG_ARM_UNWIND)
#include <linux/sched.h> #include <linux/sched.h>
#include <asm/stacktrace.h> #include <asm/stacktrace.h>
@ -53,6 +51,4 @@ void *return_address(unsigned int level)
return NULL; return NULL;
} }
#endif /* if defined(CONFIG_FRAME_POINTER) && !defined(CONFIG_ARM_UNWIND) */
EXPORT_SYMBOL_GPL(return_address); EXPORT_SYMBOL_GPL(return_address);

View File

@ -44,9 +44,6 @@ p_end: .long _end
p_pstack: .long _platform_stack_top p_pstack: .long _platform_stack_top
#endif #endif
.globl _zimage_start
/* Clang appears to require the .weak directive to be after the symbol
* is defined. See https://bugs.llvm.org/show_bug.cgi?id=38921 */
.weak _zimage_start .weak _zimage_start
_zimage_start: _zimage_start:
.globl _zimage_start_lib .globl _zimage_start_lib

View File

@ -90,6 +90,7 @@ struct perf_ibs {
unsigned long offset_mask[1]; unsigned long offset_mask[1];
int offset_max; int offset_max;
unsigned int fetch_count_reset_broken : 1; unsigned int fetch_count_reset_broken : 1;
unsigned int fetch_ignore_if_zero_rip : 1;
struct cpu_perf_ibs __percpu *pcpu; struct cpu_perf_ibs __percpu *pcpu;
struct attribute **format_attrs; struct attribute **format_attrs;
@ -663,6 +664,10 @@ fail:
if (check_rip && (ibs_data.regs[2] & IBS_RIP_INVALID)) { if (check_rip && (ibs_data.regs[2] & IBS_RIP_INVALID)) {
regs.flags &= ~PERF_EFLAGS_EXACT; regs.flags &= ~PERF_EFLAGS_EXACT;
} else { } else {
/* Workaround for erratum #1197 */
if (perf_ibs->fetch_ignore_if_zero_rip && !(ibs_data.regs[1]))
goto out;
set_linear_ip(&regs, ibs_data.regs[1]); set_linear_ip(&regs, ibs_data.regs[1]);
regs.flags |= PERF_EFLAGS_EXACT; regs.flags |= PERF_EFLAGS_EXACT;
} }
@ -756,6 +761,9 @@ static __init void perf_event_ibs_init(void)
if (boot_cpu_data.x86 >= 0x16 && boot_cpu_data.x86 <= 0x18) if (boot_cpu_data.x86 >= 0x16 && boot_cpu_data.x86 <= 0x18)
perf_ibs_fetch.fetch_count_reset_broken = 1; perf_ibs_fetch.fetch_count_reset_broken = 1;
if (boot_cpu_data.x86 == 0x19 && boot_cpu_data.x86_model < 0x10)
perf_ibs_fetch.fetch_ignore_if_zero_rip = 1;
perf_ibs_pmu_init(&perf_ibs_fetch, "ibs_fetch"); perf_ibs_pmu_init(&perf_ibs_fetch, "ibs_fetch");
if (ibs_caps & IBS_CAPS_OPCNT) { if (ibs_caps & IBS_CAPS_OPCNT) {

View File

@ -18,8 +18,6 @@
#include "../perf_event.h" #include "../perf_event.h"
#include "iommu.h" #include "iommu.h"
#define COUNTER_SHIFT 16
/* iommu pmu conf masks */ /* iommu pmu conf masks */
#define GET_CSOURCE(x) ((x)->conf & 0xFFULL) #define GET_CSOURCE(x) ((x)->conf & 0xFFULL)
#define GET_DEVID(x) (((x)->conf >> 8) & 0xFFFFULL) #define GET_DEVID(x) (((x)->conf >> 8) & 0xFFFFULL)
@ -285,22 +283,31 @@ static void perf_iommu_start(struct perf_event *event, int flags)
WARN_ON_ONCE(!(hwc->state & PERF_HES_UPTODATE)); WARN_ON_ONCE(!(hwc->state & PERF_HES_UPTODATE));
hwc->state = 0; hwc->state = 0;
/*
* To account for power-gating, which prevents write to
* the counter, we need to enable the counter
* before setting up counter register.
*/
perf_iommu_enable_event(event);
if (flags & PERF_EF_RELOAD) { if (flags & PERF_EF_RELOAD) {
u64 prev_raw_count = local64_read(&hwc->prev_count); u64 count = 0;
struct amd_iommu *iommu = perf_event_2_iommu(event); struct amd_iommu *iommu = perf_event_2_iommu(event);
/*
* Since the IOMMU PMU only support counting mode,
* the counter always start with value zero.
*/
amd_iommu_pc_set_reg(iommu, hwc->iommu_bank, hwc->iommu_cntr, amd_iommu_pc_set_reg(iommu, hwc->iommu_bank, hwc->iommu_cntr,
IOMMU_PC_COUNTER_REG, &prev_raw_count); IOMMU_PC_COUNTER_REG, &count);
} }
perf_iommu_enable_event(event);
perf_event_update_userpage(event); perf_event_update_userpage(event);
} }
static void perf_iommu_read(struct perf_event *event) static void perf_iommu_read(struct perf_event *event)
{ {
u64 count, prev, delta; u64 count;
struct hw_perf_event *hwc = &event->hw; struct hw_perf_event *hwc = &event->hw;
struct amd_iommu *iommu = perf_event_2_iommu(event); struct amd_iommu *iommu = perf_event_2_iommu(event);
@ -311,14 +318,11 @@ static void perf_iommu_read(struct perf_event *event)
/* IOMMU pc counter register is only 48 bits */ /* IOMMU pc counter register is only 48 bits */
count &= GENMASK_ULL(47, 0); count &= GENMASK_ULL(47, 0);
prev = local64_read(&hwc->prev_count); /*
if (local64_cmpxchg(&hwc->prev_count, prev, count) != prev) * Since the counter always start with value zero,
return; * simply just accumulate the count for the event.
*/
/* Handle 48-bit counter overflow */ local64_add(count, &event->count);
delta = (count << COUNTER_SHIFT) - (prev << COUNTER_SHIFT);
delta >>= COUNTER_SHIFT;
local64_add(delta, &event->count);
} }
static void perf_iommu_stop(struct perf_event *event, int flags) static void perf_iommu_stop(struct perf_event *event, int flags)
@ -328,15 +332,16 @@ static void perf_iommu_stop(struct perf_event *event, int flags)
if (hwc->state & PERF_HES_UPTODATE) if (hwc->state & PERF_HES_UPTODATE)
return; return;
/*
* To account for power-gating, in which reading the counter would
* return zero, we need to read the register before disabling.
*/
perf_iommu_read(event);
hwc->state |= PERF_HES_UPTODATE;
perf_iommu_disable_event(event); perf_iommu_disable_event(event);
WARN_ON_ONCE(hwc->state & PERF_HES_STOPPED); WARN_ON_ONCE(hwc->state & PERF_HES_STOPPED);
hwc->state |= PERF_HES_STOPPED; hwc->state |= PERF_HES_STOPPED;
if (hwc->state & PERF_HES_UPTODATE)
return;
perf_iommu_read(event);
hwc->state |= PERF_HES_UPTODATE;
} }
static int perf_iommu_add(struct perf_event *event, int flags) static int perf_iommu_add(struct perf_event *event, int flags)

View File

@ -217,6 +217,7 @@ static struct pmu pmu_class = {
.stop = pmu_event_stop, .stop = pmu_event_stop,
.read = pmu_event_read, .read = pmu_event_read,
.capabilities = PERF_PMU_CAP_NO_EXCLUDE, .capabilities = PERF_PMU_CAP_NO_EXCLUDE,
.module = THIS_MODULE,
}; };
static int power_cpu_exit(unsigned int cpu) static int power_cpu_exit(unsigned int cpu)

View File

@ -62,7 +62,7 @@ static struct pt_cap_desc {
PT_CAP(single_range_output, 0, CPUID_ECX, BIT(2)), PT_CAP(single_range_output, 0, CPUID_ECX, BIT(2)),
PT_CAP(output_subsys, 0, CPUID_ECX, BIT(3)), PT_CAP(output_subsys, 0, CPUID_ECX, BIT(3)),
PT_CAP(payloads_lip, 0, CPUID_ECX, BIT(31)), PT_CAP(payloads_lip, 0, CPUID_ECX, BIT(31)),
PT_CAP(num_address_ranges, 1, CPUID_EAX, 0x3), PT_CAP(num_address_ranges, 1, CPUID_EAX, 0x7),
PT_CAP(mtc_periods, 1, CPUID_EAX, 0xffff0000), PT_CAP(mtc_periods, 1, CPUID_EAX, 0xffff0000),
PT_CAP(cycle_thresholds, 1, CPUID_EBX, 0xffff), PT_CAP(cycle_thresholds, 1, CPUID_EBX, 0xffff),
PT_CAP(psb_periods, 1, CPUID_EBX, 0xffff0000), PT_CAP(psb_periods, 1, CPUID_EBX, 0xffff0000),

View File

@ -388,10 +388,11 @@ static const struct dmi_system_id reboot_dmi_table[] __initconst = {
}, },
{ /* Handle problems with rebooting on the OptiPlex 990. */ { /* Handle problems with rebooting on the OptiPlex 990. */
.callback = set_pci_reboot, .callback = set_pci_reboot,
.ident = "Dell OptiPlex 990", .ident = "Dell OptiPlex 990 BIOS A0x",
.matches = { .matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 990"), DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 990"),
DMI_MATCH(DMI_BIOS_VERSION, "A0"),
}, },
}, },
{ /* Handle problems with rebooting on Dell 300's */ { /* Handle problems with rebooting on Dell 300's */

View File

@ -27,7 +27,7 @@ config XTENSA
select HAVE_DMA_CONTIGUOUS select HAVE_DMA_CONTIGUOUS
select HAVE_EXIT_THREAD select HAVE_EXIT_THREAD
select HAVE_FUNCTION_TRACER select HAVE_FUNCTION_TRACER
select HAVE_FUTEX_CMPXCHG if !MMU select HAVE_FUTEX_CMPXCHG if !MMU && FUTEX
select HAVE_HW_BREAKPOINT if PERF_EVENTS select HAVE_HW_BREAKPOINT if PERF_EVENTS
select HAVE_IRQ_TIME_ACCOUNTING select HAVE_IRQ_TIME_ACCOUNTING
select HAVE_OPROFILE select HAVE_OPROFILE

View File

@ -230,7 +230,7 @@ config BLK_DEV_LOOP_MIN_COUNT
dynamically allocated with the /dev/loop-control interface. dynamically allocated with the /dev/loop-control interface.
config BLK_DEV_CRYPTOLOOP config BLK_DEV_CRYPTOLOOP
tristate "Cryptoloop Support" tristate "Cryptoloop Support (DEPRECATED)"
select CRYPTO select CRYPTO
select CRYPTO_CBC select CRYPTO_CBC
depends on BLK_DEV_LOOP depends on BLK_DEV_LOOP
@ -242,7 +242,7 @@ config BLK_DEV_CRYPTOLOOP
WARNING: This device is not safe for journaled file systems like WARNING: This device is not safe for journaled file systems like
ext3 or Reiserfs. Please use the Device Mapper crypto module ext3 or Reiserfs. Please use the Device Mapper crypto module
instead, which can be configured to be on-disk compatible with the instead, which can be configured to be on-disk compatible with the
cryptoloop device. cryptoloop device. cryptoloop support will be removed in Linux 5.16.
source "drivers/block/drbd/Kconfig" source "drivers/block/drbd/Kconfig"

View File

@ -189,6 +189,8 @@ init_cryptoloop(void)
if (rc) if (rc)
printk(KERN_ERR "cryptoloop: loop_register_transfer failed\n"); printk(KERN_ERR "cryptoloop: loop_register_transfer failed\n");
else
pr_warn("the cryptoloop driver has been deprecated and will be removed in in Linux 5.16\n");
return rc; return rc;
} }

View File

@ -585,21 +585,21 @@ static const struct ipu_rgb def_bgra_16 = {
.bits_per_pixel = 16, .bits_per_pixel = 16,
}; };
#define Y_OFFSET(pix, x, y) ((x) + pix->width * (y)) #define Y_OFFSET(pix, x, y) ((x) + pix->bytesperline * (y))
#define U_OFFSET(pix, x, y) ((pix->width * pix->height) + \ #define U_OFFSET(pix, x, y) ((pix->bytesperline * pix->height) + \
(pix->width * ((y) / 2) / 2) + (x) / 2) (pix->bytesperline * ((y) / 2) / 2) + (x) / 2)
#define V_OFFSET(pix, x, y) ((pix->width * pix->height) + \ #define V_OFFSET(pix, x, y) ((pix->bytesperline * pix->height) + \
(pix->width * pix->height / 4) + \ (pix->bytesperline * pix->height / 4) + \
(pix->width * ((y) / 2) / 2) + (x) / 2) (pix->bytesperline * ((y) / 2) / 2) + (x) / 2)
#define U2_OFFSET(pix, x, y) ((pix->width * pix->height) + \ #define U2_OFFSET(pix, x, y) ((pix->bytesperline * pix->height) + \
(pix->width * (y) / 2) + (x) / 2) (pix->bytesperline * (y) / 2) + (x) / 2)
#define V2_OFFSET(pix, x, y) ((pix->width * pix->height) + \ #define V2_OFFSET(pix, x, y) ((pix->bytesperline * pix->height) + \
(pix->width * pix->height / 2) + \ (pix->bytesperline * pix->height / 2) + \
(pix->width * (y) / 2) + (x) / 2) (pix->bytesperline * (y) / 2) + (x) / 2)
#define UV_OFFSET(pix, x, y) ((pix->width * pix->height) + \ #define UV_OFFSET(pix, x, y) ((pix->bytesperline * pix->height) + \
(pix->width * ((y) / 2)) + (x)) (pix->bytesperline * ((y) / 2)) + (x))
#define UV2_OFFSET(pix, x, y) ((pix->width * pix->height) + \ #define UV2_OFFSET(pix, x, y) ((pix->bytesperline * pix->height) + \
(pix->width * y) + (x)) (pix->bytesperline * y) + (x))
#define NUM_ALPHA_CHANNELS 7 #define NUM_ALPHA_CHANNELS 7

View File

@ -1346,7 +1346,7 @@ static int stk_camera_probe(struct usb_interface *interface,
if (!dev->isoc_ep) { if (!dev->isoc_ep) {
pr_err("Could not find isoc-in endpoint\n"); pr_err("Could not find isoc-in endpoint\n");
err = -ENODEV; err = -ENODEV;
goto error; goto error_put;
} }
dev->vsettings.palette = V4L2_PIX_FMT_RGB565; dev->vsettings.palette = V4L2_PIX_FMT_RGB565;
dev->vsettings.mode = MODE_VGA; dev->vsettings.mode = MODE_VGA;
@ -1359,10 +1359,12 @@ static int stk_camera_probe(struct usb_interface *interface,
err = stk_register_video_device(dev); err = stk_register_video_device(dev);
if (err) if (err)
goto error; goto error_put;
return 0; return 0;
error_put:
usb_put_intf(interface);
error: error:
v4l2_ctrl_handler_free(hdl); v4l2_ctrl_handler_free(hdl);
v4l2_device_unregister(&dev->v4l2_dev); v4l2_device_unregister(&dev->v4l2_dev);

View File

@ -275,6 +275,12 @@ void gem_ptp_rxstamp(struct macb *bp, struct sk_buff *skb,
if (GEM_BFEXT(DMA_RXVALID, desc->addr)) { if (GEM_BFEXT(DMA_RXVALID, desc->addr)) {
desc_ptp = macb_ptp_desc(bp, desc); desc_ptp = macb_ptp_desc(bp, desc);
/* Unlikely but check */
if (!desc_ptp) {
dev_warn_ratelimited(&bp->pdev->dev,
"Timestamp not supported in BD\n");
return;
}
gem_hw_timestamp(bp, desc_ptp->ts_1, desc_ptp->ts_2, &ts); gem_hw_timestamp(bp, desc_ptp->ts_1, desc_ptp->ts_2, &ts);
memset(shhwtstamps, 0, sizeof(struct skb_shared_hwtstamps)); memset(shhwtstamps, 0, sizeof(struct skb_shared_hwtstamps));
shhwtstamps->hwtstamp = ktime_set(ts.tv_sec, ts.tv_nsec); shhwtstamps->hwtstamp = ktime_set(ts.tv_sec, ts.tv_nsec);
@ -307,8 +313,11 @@ int gem_ptp_txstamp(struct macb_queue *queue, struct sk_buff *skb,
if (CIRC_SPACE(head, tail, PTP_TS_BUFFER_SIZE) == 0) if (CIRC_SPACE(head, tail, PTP_TS_BUFFER_SIZE) == 0)
return -ENOMEM; return -ENOMEM;
skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
desc_ptp = macb_ptp_desc(queue->bp, desc); desc_ptp = macb_ptp_desc(queue->bp, desc);
/* Unlikely but check */
if (!desc_ptp)
return -EINVAL;
skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
tx_timestamp = &queue->tx_timestamps[head]; tx_timestamp = &queue->tx_timestamps[head];
tx_timestamp->skb = skb; tx_timestamp->skb = skb;
/* ensure ts_1/ts_2 is loaded after ctrl (TX_USED check) */ /* ensure ts_1/ts_2 is loaded after ctrl (TX_USED check) */

View File

@ -559,7 +559,12 @@ static int qed_enable_msix(struct qed_dev *cdev,
rc = cnt; rc = cnt;
} }
if (rc > 0) { /* For VFs, we should return with an error in case we didn't get the
* exact number of msix vectors as we requested.
* Not doing that will lead to a crash when starting queues for
* this VF.
*/
if ((IS_PF(cdev) && rc > 0) || (IS_VF(cdev) && rc == cnt)) {
/* MSI-x configuration was achieved */ /* MSI-x configuration was achieved */
int_params->out.int_mode = QED_INT_MODE_MSIX; int_params->out.int_mode = QED_INT_MODE_MSIX;
int_params->out.num_vectors = rc; int_params->out.num_vectors = rc;

View File

@ -1773,6 +1773,7 @@ static void qede_sync_free_irqs(struct qede_dev *edev)
} }
edev->int_info.used_cnt = 0; edev->int_info.used_cnt = 0;
edev->int_info.msix_cnt = 0;
} }
static int qede_req_msix_irqs(struct qede_dev *edev) static int qede_req_msix_irqs(struct qede_dev *edev)
@ -2317,7 +2318,6 @@ static int qede_load(struct qede_dev *edev, enum qede_load_mode mode,
goto out; goto out;
err4: err4:
qede_sync_free_irqs(edev); qede_sync_free_irqs(edev);
memset(&edev->int_info.msix_cnt, 0, sizeof(struct qed_int_info));
err3: err3:
qede_napi_disable_remove(edev); qede_napi_disable_remove(edev);
err2: err2:

View File

@ -4713,6 +4713,7 @@ static void rtl_hw_start_8168g(struct rtl8169_private *tp)
rtl_eri_clear_bits(tp, 0x1b0, ERIAR_MASK_0011, BIT(12)); rtl_eri_clear_bits(tp, 0x1b0, ERIAR_MASK_0011, BIT(12));
rtl_pcie_state_l2l3_disable(tp); rtl_pcie_state_l2l3_disable(tp);
rtl_hw_aspm_clkreq_enable(tp, true);
} }
static void rtl_hw_start_8168g_1(struct rtl8169_private *tp) static void rtl_hw_start_8168g_1(struct rtl8169_private *tp)

View File

@ -939,10 +939,8 @@ temac_start_xmit(struct sk_buff *skb, struct net_device *ndev)
wmb(); wmb();
lp->dma_out(lp, TX_TAILDESC_PTR, tail_p); /* DMA start */ lp->dma_out(lp, TX_TAILDESC_PTR, tail_p); /* DMA start */
if (temac_check_tx_bd_space(lp, MAX_SKB_FRAGS + 1)) { if (temac_check_tx_bd_space(lp, MAX_SKB_FRAGS + 1))
netdev_info(ndev, "%s -> netif_stop_queue\n", __func__);
netif_stop_queue(ndev); netif_stop_queue(ndev);
}
return NETDEV_TX_OK; return NETDEV_TX_OK;
} }

View File

@ -3282,12 +3282,12 @@ static void fixup_mpss_256(struct pci_dev *dev)
{ {
dev->pcie_mpss = 1; /* 256 bytes */ dev->pcie_mpss = 1; /* 256 bytes */
} }
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SOLARFLARE, DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SOLARFLARE,
PCI_DEVICE_ID_SOLARFLARE_SFC4000A_0, fixup_mpss_256); PCI_DEVICE_ID_SOLARFLARE_SFC4000A_0, fixup_mpss_256);
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SOLARFLARE, DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SOLARFLARE,
PCI_DEVICE_ID_SOLARFLARE_SFC4000A_1, fixup_mpss_256); PCI_DEVICE_ID_SOLARFLARE_SFC4000A_1, fixup_mpss_256);
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SOLARFLARE, DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SOLARFLARE,
PCI_DEVICE_ID_SOLARFLARE_SFC4000B, fixup_mpss_256); PCI_DEVICE_ID_SOLARFLARE_SFC4000B, fixup_mpss_256);
/* /*
* Intel 5000 and 5100 Memory controllers have an erratum with read completion * Intel 5000 and 5100 Memory controllers have an erratum with read completion

View File

@ -46,7 +46,8 @@ static int zynqmp_reset_status(struct reset_controller_dev *rcdev,
unsigned long id) unsigned long id)
{ {
struct zynqmp_reset_data *priv = to_zynqmp_reset_data(rcdev); struct zynqmp_reset_data *priv = to_zynqmp_reset_data(rcdev);
int val, err; int err;
u32 val;
err = priv->eemi_ops->reset_get_status(ZYNQMP_RESET_ID + id, &val); err = priv->eemi_ops->reset_get_status(ZYNQMP_RESET_ID + id, &val);
if (err) if (err)

View File

@ -197,12 +197,13 @@ static void xhci_ring_dump_segment(struct seq_file *s,
int i; int i;
dma_addr_t dma; dma_addr_t dma;
union xhci_trb *trb; union xhci_trb *trb;
char str[XHCI_MSG_MAX];
for (i = 0; i < TRBS_PER_SEGMENT; i++) { for (i = 0; i < TRBS_PER_SEGMENT; i++) {
trb = &seg->trbs[i]; trb = &seg->trbs[i];
dma = seg->dma + i * sizeof(*trb); dma = seg->dma + i * sizeof(*trb);
seq_printf(s, "%pad: %s\n", &dma, seq_printf(s, "%pad: %s\n", &dma,
xhci_decode_trb(le32_to_cpu(trb->generic.field[0]), xhci_decode_trb(str, XHCI_MSG_MAX, le32_to_cpu(trb->generic.field[0]),
le32_to_cpu(trb->generic.field[1]), le32_to_cpu(trb->generic.field[1]),
le32_to_cpu(trb->generic.field[2]), le32_to_cpu(trb->generic.field[2]),
le32_to_cpu(trb->generic.field[3]))); le32_to_cpu(trb->generic.field[3])));
@ -340,9 +341,10 @@ static int xhci_portsc_show(struct seq_file *s, void *unused)
{ {
struct xhci_port *port = s->private; struct xhci_port *port = s->private;
u32 portsc; u32 portsc;
char str[XHCI_MSG_MAX];
portsc = readl(port->addr); portsc = readl(port->addr);
seq_printf(s, "%s\n", xhci_decode_portsc(portsc)); seq_printf(s, "%s\n", xhci_decode_portsc(str, portsc));
return 0; return 0;
} }

View File

@ -134,6 +134,13 @@ static int xhci_rcar_download_firmware(struct usb_hcd *hcd)
const struct soc_device_attribute *attr; const struct soc_device_attribute *attr;
const char *firmware_name; const char *firmware_name;
/*
* According to the datasheet, "Upon the completion of FW Download,
* there is no need to write or reload FW".
*/
if (readl(regs + RCAR_USB3_DL_CTRL) & RCAR_USB3_DL_CTRL_FW_SUCCESS)
return 0;
attr = soc_device_match(rcar_quirks_match); attr = soc_device_match(rcar_quirks_match);
if (attr) if (attr)
quirks = (uintptr_t)attr->data; quirks = (uintptr_t)attr->data;

View File

@ -25,8 +25,6 @@
#include "xhci.h" #include "xhci.h"
#include "xhci-dbgcap.h" #include "xhci-dbgcap.h"
#define XHCI_MSG_MAX 500
DECLARE_EVENT_CLASS(xhci_log_msg, DECLARE_EVENT_CLASS(xhci_log_msg,
TP_PROTO(struct va_format *vaf), TP_PROTO(struct va_format *vaf),
TP_ARGS(vaf), TP_ARGS(vaf),
@ -122,6 +120,7 @@ DECLARE_EVENT_CLASS(xhci_log_trb,
__field(u32, field1) __field(u32, field1)
__field(u32, field2) __field(u32, field2)
__field(u32, field3) __field(u32, field3)
__dynamic_array(char, str, XHCI_MSG_MAX)
), ),
TP_fast_assign( TP_fast_assign(
__entry->type = ring->type; __entry->type = ring->type;
@ -131,7 +130,7 @@ DECLARE_EVENT_CLASS(xhci_log_trb,
__entry->field3 = le32_to_cpu(trb->field[3]); __entry->field3 = le32_to_cpu(trb->field[3]);
), ),
TP_printk("%s: %s", xhci_ring_type_string(__entry->type), TP_printk("%s: %s", xhci_ring_type_string(__entry->type),
xhci_decode_trb(__entry->field0, __entry->field1, xhci_decode_trb(__get_str(str), XHCI_MSG_MAX, __entry->field0, __entry->field1,
__entry->field2, __entry->field3) __entry->field2, __entry->field3)
) )
); );
@ -523,6 +522,7 @@ DECLARE_EVENT_CLASS(xhci_log_portsc,
TP_STRUCT__entry( TP_STRUCT__entry(
__field(u32, portnum) __field(u32, portnum)
__field(u32, portsc) __field(u32, portsc)
__dynamic_array(char, str, XHCI_MSG_MAX)
), ),
TP_fast_assign( TP_fast_assign(
__entry->portnum = portnum; __entry->portnum = portnum;
@ -530,7 +530,7 @@ DECLARE_EVENT_CLASS(xhci_log_portsc,
), ),
TP_printk("port-%d: %s", TP_printk("port-%d: %s",
__entry->portnum, __entry->portnum,
xhci_decode_portsc(__entry->portsc) xhci_decode_portsc(__get_str(str), __entry->portsc)
) )
); );

View File

@ -22,6 +22,9 @@
#include "xhci-ext-caps.h" #include "xhci-ext-caps.h"
#include "pci-quirks.h" #include "pci-quirks.h"
/* max buffer size for trace and debug messages */
#define XHCI_MSG_MAX 500
/* xHCI PCI Configuration Registers */ /* xHCI PCI Configuration Registers */
#define XHCI_SBRN_OFFSET (0x60) #define XHCI_SBRN_OFFSET (0x60)
@ -2229,15 +2232,14 @@ static inline char *xhci_slot_state_string(u32 state)
} }
} }
static inline const char *xhci_decode_trb(u32 field0, u32 field1, u32 field2, static inline const char *xhci_decode_trb(char *str, size_t size,
u32 field3) u32 field0, u32 field1, u32 field2, u32 field3)
{ {
static char str[256];
int type = TRB_FIELD_TO_TYPE(field3); int type = TRB_FIELD_TO_TYPE(field3);
switch (type) { switch (type) {
case TRB_LINK: case TRB_LINK:
sprintf(str, snprintf(str, size,
"LINK %08x%08x intr %d type '%s' flags %c:%c:%c:%c", "LINK %08x%08x intr %d type '%s' flags %c:%c:%c:%c",
field1, field0, GET_INTR_TARGET(field2), field1, field0, GET_INTR_TARGET(field2),
xhci_trb_type_string(type), xhci_trb_type_string(type),
@ -2254,7 +2256,7 @@ static inline const char *xhci_decode_trb(u32 field0, u32 field1, u32 field2,
case TRB_HC_EVENT: case TRB_HC_EVENT:
case TRB_DEV_NOTE: case TRB_DEV_NOTE:
case TRB_MFINDEX_WRAP: case TRB_MFINDEX_WRAP:
sprintf(str, snprintf(str, size,
"TRB %08x%08x status '%s' len %d slot %d ep %d type '%s' flags %c:%c", "TRB %08x%08x status '%s' len %d slot %d ep %d type '%s' flags %c:%c",
field1, field0, field1, field0,
xhci_trb_comp_code_string(GET_COMP_CODE(field2)), xhci_trb_comp_code_string(GET_COMP_CODE(field2)),
@ -2267,7 +2269,8 @@ static inline const char *xhci_decode_trb(u32 field0, u32 field1, u32 field2,
break; break;
case TRB_SETUP: case TRB_SETUP:
sprintf(str, "bRequestType %02x bRequest %02x wValue %02x%02x wIndex %02x%02x wLength %d length %d TD size %d intr %d type '%s' flags %c:%c:%c", snprintf(str, size,
"bRequestType %02x bRequest %02x wValue %02x%02x wIndex %02x%02x wLength %d length %d TD size %d intr %d type '%s' flags %c:%c:%c",
field0 & 0xff, field0 & 0xff,
(field0 & 0xff00) >> 8, (field0 & 0xff00) >> 8,
(field0 & 0xff000000) >> 24, (field0 & 0xff000000) >> 24,
@ -2284,7 +2287,8 @@ static inline const char *xhci_decode_trb(u32 field0, u32 field1, u32 field2,
field3 & TRB_CYCLE ? 'C' : 'c'); field3 & TRB_CYCLE ? 'C' : 'c');
break; break;
case TRB_DATA: case TRB_DATA:
sprintf(str, "Buffer %08x%08x length %d TD size %d intr %d type '%s' flags %c:%c:%c:%c:%c:%c:%c", snprintf(str, size,
"Buffer %08x%08x length %d TD size %d intr %d type '%s' flags %c:%c:%c:%c:%c:%c:%c",
field1, field0, TRB_LEN(field2), GET_TD_SIZE(field2), field1, field0, TRB_LEN(field2), GET_TD_SIZE(field2),
GET_INTR_TARGET(field2), GET_INTR_TARGET(field2),
xhci_trb_type_string(type), xhci_trb_type_string(type),
@ -2297,7 +2301,8 @@ static inline const char *xhci_decode_trb(u32 field0, u32 field1, u32 field2,
field3 & TRB_CYCLE ? 'C' : 'c'); field3 & TRB_CYCLE ? 'C' : 'c');
break; break;
case TRB_STATUS: case TRB_STATUS:
sprintf(str, "Buffer %08x%08x length %d TD size %d intr %d type '%s' flags %c:%c:%c:%c", snprintf(str, size,
"Buffer %08x%08x length %d TD size %d intr %d type '%s' flags %c:%c:%c:%c",
field1, field0, TRB_LEN(field2), GET_TD_SIZE(field2), field1, field0, TRB_LEN(field2), GET_TD_SIZE(field2),
GET_INTR_TARGET(field2), GET_INTR_TARGET(field2),
xhci_trb_type_string(type), xhci_trb_type_string(type),
@ -2310,7 +2315,7 @@ static inline const char *xhci_decode_trb(u32 field0, u32 field1, u32 field2,
case TRB_ISOC: case TRB_ISOC:
case TRB_EVENT_DATA: case TRB_EVENT_DATA:
case TRB_TR_NOOP: case TRB_TR_NOOP:
sprintf(str, snprintf(str, size,
"Buffer %08x%08x length %d TD size %d intr %d type '%s' flags %c:%c:%c:%c:%c:%c:%c:%c", "Buffer %08x%08x length %d TD size %d intr %d type '%s' flags %c:%c:%c:%c:%c:%c:%c:%c",
field1, field0, TRB_LEN(field2), GET_TD_SIZE(field2), field1, field0, TRB_LEN(field2), GET_TD_SIZE(field2),
GET_INTR_TARGET(field2), GET_INTR_TARGET(field2),
@ -2327,21 +2332,21 @@ static inline const char *xhci_decode_trb(u32 field0, u32 field1, u32 field2,
case TRB_CMD_NOOP: case TRB_CMD_NOOP:
case TRB_ENABLE_SLOT: case TRB_ENABLE_SLOT:
sprintf(str, snprintf(str, size,
"%s: flags %c", "%s: flags %c",
xhci_trb_type_string(type), xhci_trb_type_string(type),
field3 & TRB_CYCLE ? 'C' : 'c'); field3 & TRB_CYCLE ? 'C' : 'c');
break; break;
case TRB_DISABLE_SLOT: case TRB_DISABLE_SLOT:
case TRB_NEG_BANDWIDTH: case TRB_NEG_BANDWIDTH:
sprintf(str, snprintf(str, size,
"%s: slot %d flags %c", "%s: slot %d flags %c",
xhci_trb_type_string(type), xhci_trb_type_string(type),
TRB_TO_SLOT_ID(field3), TRB_TO_SLOT_ID(field3),
field3 & TRB_CYCLE ? 'C' : 'c'); field3 & TRB_CYCLE ? 'C' : 'c');
break; break;
case TRB_ADDR_DEV: case TRB_ADDR_DEV:
sprintf(str, snprintf(str, size,
"%s: ctx %08x%08x slot %d flags %c:%c", "%s: ctx %08x%08x slot %d flags %c:%c",
xhci_trb_type_string(type), xhci_trb_type_string(type),
field1, field0, field1, field0,
@ -2350,7 +2355,7 @@ static inline const char *xhci_decode_trb(u32 field0, u32 field1, u32 field2,
field3 & TRB_CYCLE ? 'C' : 'c'); field3 & TRB_CYCLE ? 'C' : 'c');
break; break;
case TRB_CONFIG_EP: case TRB_CONFIG_EP:
sprintf(str, snprintf(str, size,
"%s: ctx %08x%08x slot %d flags %c:%c", "%s: ctx %08x%08x slot %d flags %c:%c",
xhci_trb_type_string(type), xhci_trb_type_string(type),
field1, field0, field1, field0,
@ -2359,7 +2364,7 @@ static inline const char *xhci_decode_trb(u32 field0, u32 field1, u32 field2,
field3 & TRB_CYCLE ? 'C' : 'c'); field3 & TRB_CYCLE ? 'C' : 'c');
break; break;
case TRB_EVAL_CONTEXT: case TRB_EVAL_CONTEXT:
sprintf(str, snprintf(str, size,
"%s: ctx %08x%08x slot %d flags %c", "%s: ctx %08x%08x slot %d flags %c",
xhci_trb_type_string(type), xhci_trb_type_string(type),
field1, field0, field1, field0,
@ -2367,7 +2372,7 @@ static inline const char *xhci_decode_trb(u32 field0, u32 field1, u32 field2,
field3 & TRB_CYCLE ? 'C' : 'c'); field3 & TRB_CYCLE ? 'C' : 'c');
break; break;
case TRB_RESET_EP: case TRB_RESET_EP:
sprintf(str, snprintf(str, size,
"%s: ctx %08x%08x slot %d ep %d flags %c:%c", "%s: ctx %08x%08x slot %d ep %d flags %c:%c",
xhci_trb_type_string(type), xhci_trb_type_string(type),
field1, field0, field1, field0,
@ -2388,7 +2393,7 @@ static inline const char *xhci_decode_trb(u32 field0, u32 field1, u32 field2,
field3 & TRB_CYCLE ? 'C' : 'c'); field3 & TRB_CYCLE ? 'C' : 'c');
break; break;
case TRB_SET_DEQ: case TRB_SET_DEQ:
sprintf(str, snprintf(str, size,
"%s: deq %08x%08x stream %d slot %d ep %d flags %c", "%s: deq %08x%08x stream %d slot %d ep %d flags %c",
xhci_trb_type_string(type), xhci_trb_type_string(type),
field1, field0, field1, field0,
@ -2399,14 +2404,14 @@ static inline const char *xhci_decode_trb(u32 field0, u32 field1, u32 field2,
field3 & TRB_CYCLE ? 'C' : 'c'); field3 & TRB_CYCLE ? 'C' : 'c');
break; break;
case TRB_RESET_DEV: case TRB_RESET_DEV:
sprintf(str, snprintf(str, size,
"%s: slot %d flags %c", "%s: slot %d flags %c",
xhci_trb_type_string(type), xhci_trb_type_string(type),
TRB_TO_SLOT_ID(field3), TRB_TO_SLOT_ID(field3),
field3 & TRB_CYCLE ? 'C' : 'c'); field3 & TRB_CYCLE ? 'C' : 'c');
break; break;
case TRB_FORCE_EVENT: case TRB_FORCE_EVENT:
sprintf(str, snprintf(str, size,
"%s: event %08x%08x vf intr %d vf id %d flags %c", "%s: event %08x%08x vf intr %d vf id %d flags %c",
xhci_trb_type_string(type), xhci_trb_type_string(type),
field1, field0, field1, field0,
@ -2415,14 +2420,14 @@ static inline const char *xhci_decode_trb(u32 field0, u32 field1, u32 field2,
field3 & TRB_CYCLE ? 'C' : 'c'); field3 & TRB_CYCLE ? 'C' : 'c');
break; break;
case TRB_SET_LT: case TRB_SET_LT:
sprintf(str, snprintf(str, size,
"%s: belt %d flags %c", "%s: belt %d flags %c",
xhci_trb_type_string(type), xhci_trb_type_string(type),
TRB_TO_BELT(field3), TRB_TO_BELT(field3),
field3 & TRB_CYCLE ? 'C' : 'c'); field3 & TRB_CYCLE ? 'C' : 'c');
break; break;
case TRB_GET_BW: case TRB_GET_BW:
sprintf(str, snprintf(str, size,
"%s: ctx %08x%08x slot %d speed %d flags %c", "%s: ctx %08x%08x slot %d speed %d flags %c",
xhci_trb_type_string(type), xhci_trb_type_string(type),
field1, field0, field1, field0,
@ -2431,7 +2436,7 @@ static inline const char *xhci_decode_trb(u32 field0, u32 field1, u32 field2,
field3 & TRB_CYCLE ? 'C' : 'c'); field3 & TRB_CYCLE ? 'C' : 'c');
break; break;
case TRB_FORCE_HEADER: case TRB_FORCE_HEADER:
sprintf(str, snprintf(str, size,
"%s: info %08x%08x%08x pkt type %d roothub port %d flags %c", "%s: info %08x%08x%08x pkt type %d roothub port %d flags %c",
xhci_trb_type_string(type), xhci_trb_type_string(type),
field2, field1, field0 & 0xffffffe0, field2, field1, field0 & 0xffffffe0,
@ -2440,7 +2445,7 @@ static inline const char *xhci_decode_trb(u32 field0, u32 field1, u32 field2,
field3 & TRB_CYCLE ? 'C' : 'c'); field3 & TRB_CYCLE ? 'C' : 'c');
break; break;
default: default:
sprintf(str, snprintf(str, size,
"type '%s' -> raw %08x %08x %08x %08x", "type '%s' -> raw %08x %08x %08x %08x",
xhci_trb_type_string(type), xhci_trb_type_string(type),
field0, field1, field2, field3); field0, field1, field2, field3);
@ -2565,9 +2570,8 @@ static inline const char *xhci_portsc_link_state_string(u32 portsc)
return "Unknown"; return "Unknown";
} }
static inline const char *xhci_decode_portsc(u32 portsc) static inline const char *xhci_decode_portsc(char *str, u32 portsc)
{ {
static char str[256];
int ret; int ret;
ret = sprintf(str, "%s %s %s Link:%s PortSpeed:%d ", ret = sprintf(str, "%s %s %s Link:%s PortSpeed:%d ",

View File

@ -72,14 +72,12 @@ static int mtu3_ep_enable(struct mtu3_ep *mep)
u32 interval = 0; u32 interval = 0;
u32 mult = 0; u32 mult = 0;
u32 burst = 0; u32 burst = 0;
int max_packet;
int ret; int ret;
desc = mep->desc; desc = mep->desc;
comp_desc = mep->comp_desc; comp_desc = mep->comp_desc;
mep->type = usb_endpoint_type(desc); mep->type = usb_endpoint_type(desc);
max_packet = usb_endpoint_maxp(desc); mep->maxp = usb_endpoint_maxp(desc);
mep->maxp = max_packet & GENMASK(10, 0);
switch (mtu->g.speed) { switch (mtu->g.speed) {
case USB_SPEED_SUPER: case USB_SPEED_SUPER:
@ -100,7 +98,7 @@ static int mtu3_ep_enable(struct mtu3_ep *mep)
usb_endpoint_xfer_int(desc)) { usb_endpoint_xfer_int(desc)) {
interval = desc->bInterval; interval = desc->bInterval;
interval = clamp_val(interval, 1, 16) - 1; interval = clamp_val(interval, 1, 16) - 1;
burst = (max_packet & GENMASK(12, 11)) >> 11; mult = usb_endpoint_maxp_mult(desc) - 1;
} }
break; break;
default: default:

View File

@ -226,8 +226,10 @@ static int read_mos_reg(struct usb_serial *serial, unsigned int serial_portnum,
int status; int status;
buf = kmalloc(1, GFP_KERNEL); buf = kmalloc(1, GFP_KERNEL);
if (!buf) if (!buf) {
*data = 0;
return -ENOMEM; return -ENOMEM;
}
status = usb_control_msg(usbdev, pipe, request, requesttype, value, status = usb_control_msg(usbdev, pipe, request, requesttype, value,
index, buf, 1, MOS_WDR_TIMEOUT); index, buf, 1, MOS_WDR_TIMEOUT);

View File

@ -543,7 +543,7 @@ again:
* inode has not been flagged as nocompress. This flag can * inode has not been flagged as nocompress. This flag can
* change at any time if we discover bad compression ratios. * change at any time if we discover bad compression ratios.
*/ */
if (nr_pages > 1 && inode_need_compress(inode, start, end)) { if (inode_need_compress(inode, start, end)) {
WARN_ON(pages); WARN_ON(pages);
pages = kcalloc(nr_pages, sizeof(struct page *), GFP_NOFS); pages = kcalloc(nr_pages, sizeof(struct page *), GFP_NOFS);
if (!pages) { if (!pages) {

View File

@ -305,3 +305,47 @@ err_kfree:
return ERR_PTR(err); return ERR_PTR(err);
} }
EXPORT_SYMBOL_GPL(fscrypt_get_symlink); EXPORT_SYMBOL_GPL(fscrypt_get_symlink);
/**
* fscrypt_symlink_getattr() - set the correct st_size for encrypted symlinks
* @path: the path for the encrypted symlink being queried
* @stat: the struct being filled with the symlink's attributes
*
* Override st_size of encrypted symlinks to be the length of the decrypted
* symlink target (or the no-key encoded symlink target, if the key is
* unavailable) rather than the length of the encrypted symlink target. This is
* necessary for st_size to match the symlink target that userspace actually
* sees. POSIX requires this, and some userspace programs depend on it.
*
* This requires reading the symlink target from disk if needed, setting up the
* inode's encryption key if possible, and then decrypting or encoding the
* symlink target. This makes lstat() more heavyweight than is normally the
* case. However, decrypted symlink targets will be cached in ->i_link, so
* usually the symlink won't have to be read and decrypted again later if/when
* it is actually followed, readlink() is called, or lstat() is called again.
*
* Return: 0 on success, -errno on failure
*/
int fscrypt_symlink_getattr(const struct path *path, struct kstat *stat)
{
struct dentry *dentry = path->dentry;
struct inode *inode = d_inode(dentry);
const char *link;
DEFINE_DELAYED_CALL(done);
/*
* To get the symlink target that userspace will see (whether it's the
* decrypted target or the no-key encoded target), we can just get it in
* the same way the VFS does during path resolution and readlink().
*/
link = READ_ONCE(inode->i_link);
if (!link) {
link = inode->i_op->get_link(dentry, inode, &done);
if (IS_ERR(link))
return PTR_ERR(link);
}
stat->size = strlen(link);
do_delayed_call(&done);
return 0;
}
EXPORT_SYMBOL_GPL(fscrypt_symlink_getattr);

View File

@ -750,6 +750,12 @@ int ext4_write_inline_data_end(struct inode *inode, loff_t pos, unsigned len,
ext4_write_lock_xattr(inode, &no_expand); ext4_write_lock_xattr(inode, &no_expand);
BUG_ON(!ext4_has_inline_data(inode)); BUG_ON(!ext4_has_inline_data(inode));
/*
* ei->i_inline_off may have changed since ext4_write_begin()
* called ext4_try_to_write_inline_data()
*/
(void) ext4_find_inline_data_nolock(inode);
kaddr = kmap_atomic(page); kaddr = kmap_atomic(page);
ext4_write_inline_data(inode, &iloc, kaddr, pos, len); ext4_write_inline_data(inode, &iloc, kaddr, pos, len);
kunmap_atomic(kaddr); kunmap_atomic(kaddr);

View File

@ -52,10 +52,19 @@ static const char *ext4_encrypted_get_link(struct dentry *dentry,
return paddr; return paddr;
} }
static int ext4_encrypted_symlink_getattr(const struct path *path,
struct kstat *stat, u32 request_mask,
unsigned int query_flags)
{
ext4_getattr(path, stat, request_mask, query_flags);
return fscrypt_symlink_getattr(path, stat);
}
const struct inode_operations ext4_encrypted_symlink_inode_operations = { const struct inode_operations ext4_encrypted_symlink_inode_operations = {
.get_link = ext4_encrypted_get_link, .get_link = ext4_encrypted_get_link,
.setattr = ext4_setattr, .setattr = ext4_setattr,
.getattr = ext4_getattr, .getattr = ext4_encrypted_symlink_getattr,
.listxattr = ext4_listxattr, .listxattr = ext4_listxattr,
}; };

View File

@ -1256,9 +1256,18 @@ static const char *f2fs_encrypted_get_link(struct dentry *dentry,
return target; return target;
} }
static int f2fs_encrypted_symlink_getattr(const struct path *path,
struct kstat *stat, u32 request_mask,
unsigned int query_flags)
{
f2fs_getattr(path, stat, request_mask, query_flags);
return fscrypt_symlink_getattr(path, stat);
}
const struct inode_operations f2fs_encrypted_symlink_inode_operations = { const struct inode_operations f2fs_encrypted_symlink_inode_operations = {
.get_link = f2fs_encrypted_get_link, .get_link = f2fs_encrypted_get_link,
.getattr = f2fs_getattr, .getattr = f2fs_encrypted_symlink_getattr,
.setattr = f2fs_setattr, .setattr = f2fs_setattr,
#ifdef CONFIG_F2FS_FS_XATTR #ifdef CONFIG_F2FS_FS_XATTR
.listxattr = f2fs_listxattr, .listxattr = f2fs_listxattr,

View File

@ -1629,6 +1629,16 @@ static const char *ubifs_get_link(struct dentry *dentry,
return fscrypt_get_symlink(inode, ui->data, ui->data_len, done); return fscrypt_get_symlink(inode, ui->data, ui->data_len, done);
} }
static int ubifs_symlink_getattr(const struct path *path, struct kstat *stat,
u32 request_mask, unsigned int query_flags)
{
ubifs_getattr(path, stat, request_mask, query_flags);
if (IS_ENCRYPTED(d_inode(path->dentry)))
return fscrypt_symlink_getattr(path, stat);
return 0;
}
const struct address_space_operations ubifs_file_address_operations = { const struct address_space_operations ubifs_file_address_operations = {
.readpage = ubifs_readpage, .readpage = ubifs_readpage,
.writepage = ubifs_writepage, .writepage = ubifs_writepage,
@ -1654,7 +1664,7 @@ const struct inode_operations ubifs_file_inode_operations = {
const struct inode_operations ubifs_symlink_inode_operations = { const struct inode_operations ubifs_symlink_inode_operations = {
.get_link = ubifs_get_link, .get_link = ubifs_get_link,
.setattr = ubifs_setattr, .setattr = ubifs_setattr,
.getattr = ubifs_getattr, .getattr = ubifs_symlink_getattr,
#ifdef CONFIG_UBIFS_FS_XATTR #ifdef CONFIG_UBIFS_FS_XATTR
.listxattr = ubifs_listxattr, .listxattr = ubifs_listxattr,
#endif #endif

View File

@ -298,6 +298,7 @@ extern int __fscrypt_encrypt_symlink(struct inode *inode, const char *target,
extern const char *fscrypt_get_symlink(struct inode *inode, const void *caddr, extern const char *fscrypt_get_symlink(struct inode *inode, const void *caddr,
unsigned int max_size, unsigned int max_size,
struct delayed_call *done); struct delayed_call *done);
int fscrypt_symlink_getattr(const struct path *path, struct kstat *stat);
static inline void fscrypt_set_ops(struct super_block *sb, static inline void fscrypt_set_ops(struct super_block *sb,
const struct fscrypt_operations *s_cop) const struct fscrypt_operations *s_cop)
{ {
@ -585,6 +586,12 @@ static inline const char *fscrypt_get_symlink(struct inode *inode,
return ERR_PTR(-EOPNOTSUPP); return ERR_PTR(-EOPNOTSUPP);
} }
static inline int fscrypt_symlink_getattr(const struct path *path,
struct kstat *stat)
{
return -EOPNOTSUPP;
}
static inline void fscrypt_set_ops(struct super_block *sb, static inline void fscrypt_set_ops(struct super_block *sb,
const struct fscrypt_operations *s_cop) const struct fscrypt_operations *s_cop)
{ {

View File

@ -76,6 +76,25 @@ static inline struct kthread *to_kthread(struct task_struct *k)
return (__force void *)k->set_child_tid; return (__force void *)k->set_child_tid;
} }
/*
* Variant of to_kthread() that doesn't assume @p is a kthread.
*
* Per construction; when:
*
* (p->flags & PF_KTHREAD) && p->set_child_tid
*
* the task is both a kthread and struct kthread is persistent. However
* PF_KTHREAD on it's own is not, kernel_thread() can exec() (See umh.c and
* begin_new_exec()).
*/
static inline struct kthread *__to_kthread(struct task_struct *p)
{
void *kthread = (__force void *)p->set_child_tid;
if (kthread && !(p->flags & PF_KTHREAD))
kthread = NULL;
return kthread;
}
void free_kthread_struct(struct task_struct *k) void free_kthread_struct(struct task_struct *k)
{ {
struct kthread *kthread; struct kthread *kthread;
@ -176,10 +195,11 @@ void *kthread_data(struct task_struct *task)
*/ */
void *kthread_probe_data(struct task_struct *task) void *kthread_probe_data(struct task_struct *task)
{ {
struct kthread *kthread = to_kthread(task); struct kthread *kthread = __to_kthread(task);
void *data = NULL; void *data = NULL;
probe_kernel_read(&data, &kthread->data, sizeof(data)); if (kthread)
probe_kernel_read(&data, &kthread->data, sizeof(data));
return data; return data;
} }
@ -490,9 +510,9 @@ void kthread_set_per_cpu(struct task_struct *k, int cpu)
set_bit(KTHREAD_IS_PER_CPU, &kthread->flags); set_bit(KTHREAD_IS_PER_CPU, &kthread->flags);
} }
bool kthread_is_per_cpu(struct task_struct *k) bool kthread_is_per_cpu(struct task_struct *p)
{ {
struct kthread *kthread = to_kthread(k); struct kthread *kthread = __to_kthread(p);
if (!kthread) if (!kthread)
return false; return false;
@ -1272,11 +1292,9 @@ EXPORT_SYMBOL(kthread_destroy_worker);
*/ */
void kthread_associate_blkcg(struct cgroup_subsys_state *css) void kthread_associate_blkcg(struct cgroup_subsys_state *css)
{ {
struct kthread *kthread; struct kthread *kthread = __to_kthread(current);
if (!(current->flags & PF_KTHREAD))
return;
kthread = to_kthread(current);
if (!kthread) if (!kthread)
return; return;
@ -1298,13 +1316,10 @@ EXPORT_SYMBOL(kthread_associate_blkcg);
*/ */
struct cgroup_subsys_state *kthread_blkcg(void) struct cgroup_subsys_state *kthread_blkcg(void)
{ {
struct kthread *kthread; struct kthread *kthread = __to_kthread(current);
if (current->flags & PF_KTHREAD) { if (kthread)
kthread = to_kthread(current); return kthread->blkcg_css;
if (kthread)
return kthread->blkcg_css;
}
return NULL; return NULL;
} }
EXPORT_SYMBOL(kthread_blkcg); EXPORT_SYMBOL(kthread_blkcg);

View File

@ -7301,7 +7301,7 @@ int can_migrate_task(struct task_struct *p, struct lb_env *env)
return 0; return 0;
/* Disregard pcpu kthreads; they are where they need to be. */ /* Disregard pcpu kthreads; they are where they need to be. */
if ((p->flags & PF_KTHREAD) && kthread_is_per_cpu(p)) if (kthread_is_per_cpu(p))
return 0; return 0;
if (!cpumask_test_cpu(env->dst_cpu, p->cpus_ptr)) { if (!cpumask_test_cpu(env->dst_cpu, p->cpus_ptr)) {

View File

@ -906,7 +906,7 @@ static inline void __free_one_page(struct page *page,
unsigned int max_order; unsigned int max_order;
struct capture_control *capc = task_capc(zone); struct capture_control *capc = task_capc(zone);
max_order = min_t(unsigned int, MAX_ORDER, pageblock_order + 1); max_order = min_t(unsigned int, MAX_ORDER - 1, pageblock_order);
VM_BUG_ON(!zone_is_initialized(zone)); VM_BUG_ON(!zone_is_initialized(zone));
VM_BUG_ON_PAGE(page->flags & PAGE_FLAGS_CHECK_AT_PREP, page); VM_BUG_ON_PAGE(page->flags & PAGE_FLAGS_CHECK_AT_PREP, page);
@ -919,7 +919,7 @@ static inline void __free_one_page(struct page *page,
VM_BUG_ON_PAGE(bad_range(zone, page), page); VM_BUG_ON_PAGE(bad_range(zone, page), page);
continue_merging: continue_merging:
while (order < max_order - 1) { while (order < max_order) {
if (compaction_capture(capc, page, order, migratetype)) { if (compaction_capture(capc, page, order, migratetype)) {
__mod_zone_freepage_state(zone, -(1 << order), __mod_zone_freepage_state(zone, -(1 << order),
migratetype); migratetype);
@ -945,7 +945,7 @@ continue_merging:
pfn = combined_pfn; pfn = combined_pfn;
order++; order++;
} }
if (max_order < MAX_ORDER) { if (order < MAX_ORDER - 1) {
/* If we are here, it means order is >= pageblock_order. /* If we are here, it means order is >= pageblock_order.
* We want to prevent merge between freepages on isolate * We want to prevent merge between freepages on isolate
* pageblock and normal pageblock. Without this, pageblock * pageblock and normal pageblock. Without this, pageblock
@ -966,7 +966,7 @@ continue_merging:
is_migrate_isolate(buddy_mt))) is_migrate_isolate(buddy_mt)))
goto done_merging; goto done_merging;
} }
max_order++; max_order = order + 1;
goto continue_merging; goto continue_merging;
} }

View File

@ -460,6 +460,23 @@ out_bh_enable:
local_bh_enable(); local_bh_enable();
} }
/*
* The device used for looking up which routing table to use for sending an ICMP
* error is preferably the source whenever it is set, which should ensure the
* icmp error can be sent to the source host, else lookup using the routing
* table of the destination device, else use the main routing table (index 0).
*/
static struct net_device *icmp_get_route_lookup_dev(struct sk_buff *skb)
{
struct net_device *route_lookup_dev = NULL;
if (skb->dev)
route_lookup_dev = skb->dev;
else if (skb_dst(skb))
route_lookup_dev = skb_dst(skb)->dev;
return route_lookup_dev;
}
static struct rtable *icmp_route_lookup(struct net *net, static struct rtable *icmp_route_lookup(struct net *net,
struct flowi4 *fl4, struct flowi4 *fl4,
struct sk_buff *skb_in, struct sk_buff *skb_in,
@ -468,6 +485,7 @@ static struct rtable *icmp_route_lookup(struct net *net,
int type, int code, int type, int code,
struct icmp_bxm *param) struct icmp_bxm *param)
{ {
struct net_device *route_lookup_dev;
struct rtable *rt, *rt2; struct rtable *rt, *rt2;
struct flowi4 fl4_dec; struct flowi4 fl4_dec;
int err; int err;
@ -482,7 +500,8 @@ static struct rtable *icmp_route_lookup(struct net *net,
fl4->flowi4_proto = IPPROTO_ICMP; fl4->flowi4_proto = IPPROTO_ICMP;
fl4->fl4_icmp_type = type; fl4->fl4_icmp_type = type;
fl4->fl4_icmp_code = code; fl4->fl4_icmp_code = code;
fl4->flowi4_oif = l3mdev_master_ifindex(skb_dst(skb_in)->dev); route_lookup_dev = icmp_get_route_lookup_dev(skb_in);
fl4->flowi4_oif = l3mdev_master_ifindex(route_lookup_dev);
security_skb_classify_flow(skb_in, flowi4_to_flowi(fl4)); security_skb_classify_flow(skb_in, flowi4_to_flowi(fl4));
rt = ip_route_output_key_hash(net, fl4, skb_in); rt = ip_route_output_key_hash(net, fl4, skb_in);
@ -506,7 +525,7 @@ static struct rtable *icmp_route_lookup(struct net *net,
if (err) if (err)
goto relookup_failed; goto relookup_failed;
if (inet_addr_type_dev_table(net, skb_dst(skb_in)->dev, if (inet_addr_type_dev_table(net, route_lookup_dev,
fl4_dec.saddr) == RTN_LOCAL) { fl4_dec.saddr) == RTN_LOCAL) {
rt2 = __ip_route_output_key(net, &fl4_dec); rt2 = __ip_route_output_key(net, &fl4_dec);
if (IS_ERR(rt2)) if (IS_ERR(rt2))

View File

@ -2730,6 +2730,7 @@ int ip_check_mc_rcu(struct in_device *in_dev, __be32 mc_addr, __be32 src_addr, u
rv = 1; rv = 1;
} else if (im) { } else if (im) {
if (src_addr) { if (src_addr) {
spin_lock_bh(&im->lock);
for (psf = im->sources; psf; psf = psf->sf_next) { for (psf = im->sources; psf; psf = psf->sf_next) {
if (psf->sf_inaddr == src_addr) if (psf->sf_inaddr == src_addr)
break; break;
@ -2740,6 +2741,7 @@ int ip_check_mc_rcu(struct in_device *in_dev, __be32 mc_addr, __be32 src_addr, u
im->sfcount[MCAST_EXCLUDE]; im->sfcount[MCAST_EXCLUDE];
else else
rv = im->sfcount[MCAST_EXCLUDE] != 0; rv = im->sfcount[MCAST_EXCLUDE] != 0;
spin_unlock_bh(&im->lock);
} else } else
rv = 1; /* unspecified source; tentatively allow */ rv = 1; /* unspecified source; tentatively allow */
} }

View File

@ -1736,7 +1736,7 @@ static int snd_pcm_lib_ioctl_fifo_size(struct snd_pcm_substream *substream,
channels = params_channels(params); channels = params_channels(params);
frame_size = snd_pcm_format_size(format, channels); frame_size = snd_pcm_format_size(format, channels);
if (frame_size > 0) if (frame_size > 0)
params->fifo_size /= (unsigned)frame_size; params->fifo_size /= frame_size;
} }
return 0; return 0;
} }

View File

@ -9160,6 +9160,16 @@ static int patch_alc269(struct hda_codec *codec)
snd_hda_pick_fixup(codec, alc269_fixup_models, snd_hda_pick_fixup(codec, alc269_fixup_models,
alc269_fixup_tbl, alc269_fixups); alc269_fixup_tbl, alc269_fixups);
/* FIXME: both TX300 and ROG Strix G17 have the same SSID, and
* the quirk breaks the latter (bko#214101).
* Clear the wrong entry.
*/
if (codec->fixup_id == ALC282_FIXUP_ASUS_TX300 &&
codec->core.vendor_id == 0x10ec0294) {
codec_dbg(codec, "Clear wrong fixup for ASUS ROG Strix G17\n");
codec->fixup_id = HDA_FIXUP_ID_NOT_SET;
}
snd_hda_pick_pin_fixup(codec, alc269_pin_fixup_tbl, alc269_fixups, true); snd_hda_pick_pin_fixup(codec, alc269_pin_fixup_tbl, alc269_fixups, true);
snd_hda_pick_pin_fixup(codec, alc269_fallback_pin_fixup_tbl, alc269_fixups, false); snd_hda_pick_pin_fixup(codec, alc269_fallback_pin_fixup_tbl, alc269_fixups, false);
snd_hda_pick_fixup(codec, NULL, alc269_fixup_vendor_tbl, snd_hda_pick_fixup(codec, NULL, alc269_fixup_vendor_tbl,

View File

@ -1841,6 +1841,7 @@ static const struct registration_quirk registration_quirks[] = {
REG_QUIRK_ENTRY(0x0951, 0x16ed, 2), /* Kingston HyperX Cloud Alpha S */ REG_QUIRK_ENTRY(0x0951, 0x16ed, 2), /* Kingston HyperX Cloud Alpha S */
REG_QUIRK_ENTRY(0x0951, 0x16ea, 2), /* Kingston HyperX Cloud Flight S */ REG_QUIRK_ENTRY(0x0951, 0x16ea, 2), /* Kingston HyperX Cloud Flight S */
REG_QUIRK_ENTRY(0x0ecb, 0x1f46, 2), /* JBL Quantum 600 */ REG_QUIRK_ENTRY(0x0ecb, 0x1f46, 2), /* JBL Quantum 600 */
REG_QUIRK_ENTRY(0x0ecb, 0x1f47, 2), /* JBL Quantum 800 */
REG_QUIRK_ENTRY(0x0ecb, 0x2039, 2), /* JBL Quantum 400 */ REG_QUIRK_ENTRY(0x0ecb, 0x2039, 2), /* JBL Quantum 400 */
REG_QUIRK_ENTRY(0x0ecb, 0x203c, 2), /* JBL Quantum 600 */ REG_QUIRK_ENTRY(0x0ecb, 0x203c, 2), /* JBL Quantum 600 */
REG_QUIRK_ENTRY(0x0ecb, 0x203e, 2), /* JBL Quantum 800 */ REG_QUIRK_ENTRY(0x0ecb, 0x203e, 2), /* JBL Quantum 800 */