This is the 4.19.44 stable release
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAlzdoMwACgkQONu9yGCS aT5H9RAAkvsM0ryV/0BLcS7bAc2qXHz3shwcqMRHeqLSHCI728Ew3vbrenquQ9ou I1I2gXVjVr3fT5IrNeEKC/RJg5EvUBD25dm3Iei9cTf8kqnnFaEqQFe+jIvVOMfR zr//hEG3lOO5tLtyK1pnZxrW1uKl7B+1O64bVMpHSola+5teV51r/PxqYM5lNKYm A0YhhcrTZ4f1ZY1nctgb3g5XousPHJAMhe8ACv6zO7I+eWwn410nUeAJL7WK8SvL UqW0xgLAkKsYrriaDCPC9VeOVMUetCHeT9KbYQ8W9p+kb5bMQua4d/YJtCxulnqH TAQosuCVSVoq+jQIZS+El4+teCQW/aAkHFGo+08e9ti+trEliz2u2PxiloZoGlxl M4iIPwjkp7YJ9WHoVdNjObPiv5vt+2pWDEPhB7p++nsk5/2ArbShqWVDREj09SRp RpOJ7UGl+Nckk8IppfQgRUOlVyMW6a+Fw7GX7dxnyh9U1g48w5ebNTVeUvKxQVCJ a99U9qqGRgmEsgicnOXs4tRMYuU0gn3j0Qjhd9G2xYijh8ElMLgTJyv+2JiUIavC nXmSVW3G54dR7N94aDfWm/z85w/uFmTmT4BiqNuc4/gHVyyk12Q9RbsV4T617xls wiCkGoLKlpi9cp6abxB9H+oav9PdZd9ztwZMSB35k1AIgh6oeo0= =v14F -----END PGP SIGNATURE----- Merge 4.19.44 into android-4.19 Changes in 4.19.44 bfq: update internal depth state when queue depth changes platform/x86: sony-laptop: Fix unintentional fall-through platform/x86: thinkpad_acpi: Disable Bluetooth for some machines platform/x86: dell-laptop: fix rfkill functionality hwmon: (pwm-fan) Disable PWM if fetching cooling data fails kernfs: fix barrier usage in __kernfs_new_node() virt: vbox: Sanity-check parameter types for hgcm-calls coming from userspace USB: serial: fix unthrottle races iio: adc: xilinx: fix potential use-after-free on remove iio: adc: xilinx: fix potential use-after-free on probe iio: adc: xilinx: prevent touching unclocked h/w on remove acpi/nfit: Always dump _DSM output payload libnvdimm/namespace: Fix a potential NULL pointer dereference HID: input: add mapping for Expose/Overview key HID: input: add mapping for keyboard Brightness Up/Down/Toggle keys HID: input: add mapping for "Toggle Display" key libnvdimm/btt: Fix a kmemdup failure check s390/dasd: Fix capacity calculation for large volumes mac80211: fix unaligned access in mesh table hash function mac80211: Increase MAX_MSG_LEN cfg80211: Handle WMM rules in regulatory domain intersection mac80211: fix memory accounting with A-MSDU aggregation nl80211: Add NL80211_FLAG_CLEAR_SKB flag for other NL commands libnvdimm/pmem: fix a possible OOB access when read and write pmem s390/3270: fix lockdep false positive on view->lock drm/amd/display: extending AUX SW Timeout clocksource/drivers/npcm: select TIMER_OF clocksource/drivers/oxnas: Fix OX820 compatible selftests: fib_tests: Fix 'Command line is not complete' errors mISDN: Check address length before reading address family vxge: fix return of a free'd memblock on a failed dma mapping qede: fix write to free'd pointer error and double free of ptp afs: Unlock pages for __pagevec_release() drm/amd/display: If one stream full updates, full update all planes s390/pkey: add one more argument space for debug feature entry x86/build/lto: Fix truncated .bss with -fdata-sections x86/reboot, efi: Use EFI reboot for Acer TravelMate X514-51T KVM: fix spectrev1 gadgets KVM: x86: avoid misreporting level-triggered irqs as edge-triggered in tracing tools lib traceevent: Fix missing equality check for strcmp ipmi: ipmi_si_hardcode.c: init si_type array to fix a crash ocelot: Don't sleep in atomic context (irqs_disabled()) scsi: aic7xxx: fix EISA support mm: fix inactive list balancing between NUMA nodes and cgroups init: initialize jump labels before command line option parsing selftests: netfilter: check icmp pkttoobig errors are set as related ipvs: do not schedule icmp errors from tunnels netfilter: ctnetlink: don't use conntrack/expect object addresses as id netfilter: nf_tables: prevent shift wrap in nft_chain_parse_hook() MIPS: perf: ath79: Fix perfcount IRQ assignment s390: ctcm: fix ctcm_new_device error return code drm/sun4i: Set device driver data at bind time for use in unbind drm/sun4i: Fix component unbinding and component master deletion selftests/net: correct the return value for run_netsocktests netfilter: fix nf_l4proto_log_invalid to log invalid packets gpu: ipu-v3: dp: fix CSC handling drm/imx: don't skip DP channel disable for background plane ARM: 8856/1: NOMMU: Fix CCR register faulty initialization when MPU is disabled spi: Micrel eth switch: declare missing of table spi: ST ST95HF NFC: declare missing of table drm/sun4i: Unbind components before releasing DRM and memory Input: synaptics-rmi4 - fix possible double free RDMA/hns: Bugfix for mapping user db mm/memory_hotplug.c: drop memory device reference after find_memory_block() powerpc/smp: Fix NMI IPI timeout powerpc/smp: Fix NMI IPI xmon timeout net: dsa: mv88e6xxx: fix few issues in mv88e6390x_port_set_cmode mm/memory.c: fix modifying of page protection by insert_pfn() usb: typec: Fix unchecked return value netfilter: nf_tables: use-after-free in dynamic operations netfilter: nf_tables: add missing ->release_ops() in error path of newrule() net: fec: manage ahb clock in runtime pm mlxsw: spectrum_switchdev: Add MDB entries in prepare phase mlxsw: core: Do not use WQ_MEM_RECLAIM for EMAD workqueue mlxsw: core: Do not use WQ_MEM_RECLAIM for mlxsw ordered workqueue mlxsw: core: Do not use WQ_MEM_RECLAIM for mlxsw workqueue net/tls: fix the IV leaks net: strparser: partially revert "strparser: Call skb_unclone conditionally" NFC: nci: Add some bounds checking in nci_hci_cmd_received() nfc: nci: Potential off by one in ->pipes[] array x86/kprobes: Avoid kretprobe recursion bug cw1200: fix missing unlock on error in cw1200_hw_scan() mwl8k: Fix rate_idx underflow rtlwifi: rtl8723ae: Fix missing break in switch statement Don't jump to compute_result state from check_result state um: Don't hardcode path as it is architecture dependent powerpc/64s: Include cpu header bonding: fix arp_validate toggling in active-backup mode bridge: Fix error path for kobject_init_and_add() dpaa_eth: fix SG frame cleanup fib_rules: return 0 directly if an exactly same rule exists when NLM_F_EXCL not supplied ipv4: Fix raw socket lookup for local traffic net: dsa: Fix error cleanup path in dsa_init_module net: ethernet: stmmac: dwmac-sun8i: enable support of unicast filtering net: macb: Change interrupt and napi enable order in open net: seeq: fix crash caused by not set dev.parent net: ucc_geth - fix Oops when changing number of buffers in the ring packet: Fix error path in packet_init selinux: do not report error on connect(AF_UNSPEC) vlan: disable SIOCSHWTSTAMP in container vrf: sit mtu should not be updated when vrf netdev is the link tuntap: fix dividing by zero in ebpf queue selection tuntap: synchronize through tfiles array instead of tun->numqueues isdn: bas_gigaset: use usb_fill_int_urb() properly tipc: fix hanging clients using poll with EPOLLOUT flag drivers/virt/fsl_hypervisor.c: dereferencing error pointers in ioctl drivers/virt/fsl_hypervisor.c: prevent integer overflow in ioctl powerpc/book3s/64: check for NULL pointer in pgd_alloc() powerpc/powernv/idle: Restore IAMR after idle powerpc/booke64: set RI in default MSR PCI: hv: Fix a memory leak in hv_eject_device_work() PCI: hv: Add hv_pci_remove_slots() when we unload the driver PCI: hv: Add pci_destroy_slot() in pci_devices_present_work(), if necessary Linux 4.19.44 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
commit
0b63cd6d63
118 changed files with 1113 additions and 380 deletions
Makefile
arch
arm/kernel
mips/ath79
powerpc
um/drivers
x86
block
drivers
acpi/nfit
char/ipmi
clocksource
gpu
hid
hwmon
iio/adc
infiniband/hw/hns
input/rmi4
irqchip
isdn
md
net
bonding
dsa/mv88e6xxx
ethernet
cadence
freescale
mellanox/mlxsw
mscc
neterion/vxge
qlogic/qede
seeq
stmicro/stmmac
phy
tun.cwireless
nfc/st95hf
nvdimm
pci/controller
platform/x86
s390
scsi/aic7xxx
usb
virt
fs
include
init
mm
net
8021q
bridge
core
dsa
ipv4
ipv6
mac80211
netfilter
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 19
|
||||
SUBLEVEL = 43
|
||||
SUBLEVEL = 44
|
||||
EXTRAVERSION =
|
||||
NAME = "People's Front"
|
||||
|
||||
|
|
|
@ -133,9 +133,9 @@ __secondary_data:
|
|||
*/
|
||||
.text
|
||||
__after_proc_init:
|
||||
#ifdef CONFIG_ARM_MPU
|
||||
M_CLASS(movw r12, #:lower16:BASEADDR_V7M_SCB)
|
||||
M_CLASS(movt r12, #:upper16:BASEADDR_V7M_SCB)
|
||||
#ifdef CONFIG_ARM_MPU
|
||||
M_CLASS(ldr r3, [r12, 0x50])
|
||||
AR_CLASS(mrc p15, 0, r3, c0, c1, 4) @ Read ID_MMFR0
|
||||
and r3, r3, #(MMFR0_PMSA) @ PMSA field
|
||||
|
|
|
@ -211,12 +211,6 @@ const char *get_system_type(void)
|
|||
return ath79_sys_type;
|
||||
}
|
||||
|
||||
int get_c0_perfcount_int(void)
|
||||
{
|
||||
return ATH79_MISC_IRQ(5);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(get_c0_perfcount_int);
|
||||
|
||||
unsigned int get_c0_compare_int(void)
|
||||
{
|
||||
return CP0_LEGACY_COMPARE_IRQ;
|
||||
|
|
|
@ -83,6 +83,9 @@ static inline pgd_t *pgd_alloc(struct mm_struct *mm)
|
|||
|
||||
pgd = kmem_cache_alloc(PGT_CACHE(PGD_INDEX_SIZE),
|
||||
pgtable_gfp_flags(mm, GFP_KERNEL));
|
||||
if (unlikely(!pgd))
|
||||
return pgd;
|
||||
|
||||
/*
|
||||
* Don't scan the PGD for pointers, it contains references to PUDs but
|
||||
* those references are not full pointers and so can't be recognised by
|
||||
|
|
|
@ -41,7 +41,7 @@
|
|||
#if defined(CONFIG_PPC_BOOK3E_64)
|
||||
#define MSR_64BIT MSR_CM
|
||||
|
||||
#define MSR_ (MSR_ME | MSR_CE)
|
||||
#define MSR_ (MSR_ME | MSR_RI | MSR_CE)
|
||||
#define MSR_KERNEL (MSR_ | MSR_64BIT)
|
||||
#define MSR_USER32 (MSR_ | MSR_PR | MSR_EE)
|
||||
#define MSR_USER64 (MSR_USER32 | MSR_64BIT)
|
||||
|
|
|
@ -170,6 +170,9 @@ core_idle_lock_held:
|
|||
bne- core_idle_lock_held
|
||||
blr
|
||||
|
||||
/* Reuse an unused pt_regs slot for IAMR */
|
||||
#define PNV_POWERSAVE_IAMR _DAR
|
||||
|
||||
/*
|
||||
* Pass requested state in r3:
|
||||
* r3 - PNV_THREAD_NAP/SLEEP/WINKLE in POWER8
|
||||
|
@ -200,6 +203,12 @@ pnv_powersave_common:
|
|||
/* Continue saving state */
|
||||
SAVE_GPR(2, r1)
|
||||
SAVE_NVGPRS(r1)
|
||||
|
||||
BEGIN_FTR_SECTION
|
||||
mfspr r5, SPRN_IAMR
|
||||
std r5, PNV_POWERSAVE_IAMR(r1)
|
||||
END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
|
||||
|
||||
mfcr r5
|
||||
std r5,_CCR(r1)
|
||||
std r1,PACAR1(r13)
|
||||
|
@ -924,6 +933,17 @@ BEGIN_FTR_SECTION
|
|||
END_FTR_SECTION_IFSET(CPU_FTR_HVMODE)
|
||||
REST_NVGPRS(r1)
|
||||
REST_GPR(2, r1)
|
||||
|
||||
BEGIN_FTR_SECTION
|
||||
/* IAMR was saved in pnv_powersave_common() */
|
||||
ld r5, PNV_POWERSAVE_IAMR(r1)
|
||||
mtspr SPRN_IAMR, r5
|
||||
/*
|
||||
* We don't need an isync here because the upcoming mtmsrd is
|
||||
* execution synchronizing.
|
||||
*/
|
||||
END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
|
||||
|
||||
ld r4,PACAKMSR(r13)
|
||||
ld r5,_LINK(r1)
|
||||
ld r6,_CCR(r1)
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
//
|
||||
// Copyright 2018, Michael Ellerman, IBM Corporation.
|
||||
|
||||
#include <linux/cpu.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/seq_buf.h>
|
||||
|
|
|
@ -338,13 +338,12 @@ void arch_send_call_function_ipi_mask(const struct cpumask *mask)
|
|||
* NMI IPIs may not be recoverable, so should not be used as ongoing part of
|
||||
* a running system. They can be used for crash, debug, halt/reboot, etc.
|
||||
*
|
||||
* NMI IPIs are globally single threaded. No more than one in progress at
|
||||
* any time.
|
||||
*
|
||||
* The IPI call waits with interrupts disabled until all targets enter the
|
||||
* NMI handler, then the call returns.
|
||||
* NMI handler, then returns. Subsequent IPIs can be issued before targets
|
||||
* have returned from their handlers, so there is no guarantee about
|
||||
* concurrency or re-entrancy.
|
||||
*
|
||||
* No new NMI can be initiated until targets exit the handler.
|
||||
* A new NMI can be issued before all targets exit the handler.
|
||||
*
|
||||
* The IPI call may time out without all targets entering the NMI handler.
|
||||
* In that case, there is some logic to recover (and ignore subsequent
|
||||
|
@ -355,7 +354,7 @@ void arch_send_call_function_ipi_mask(const struct cpumask *mask)
|
|||
|
||||
static atomic_t __nmi_ipi_lock = ATOMIC_INIT(0);
|
||||
static struct cpumask nmi_ipi_pending_mask;
|
||||
static int nmi_ipi_busy_count = 0;
|
||||
static bool nmi_ipi_busy = false;
|
||||
static void (*nmi_ipi_function)(struct pt_regs *) = NULL;
|
||||
|
||||
static void nmi_ipi_lock_start(unsigned long *flags)
|
||||
|
@ -394,7 +393,7 @@ static void nmi_ipi_unlock_end(unsigned long *flags)
|
|||
*/
|
||||
int smp_handle_nmi_ipi(struct pt_regs *regs)
|
||||
{
|
||||
void (*fn)(struct pt_regs *);
|
||||
void (*fn)(struct pt_regs *) = NULL;
|
||||
unsigned long flags;
|
||||
int me = raw_smp_processor_id();
|
||||
int ret = 0;
|
||||
|
@ -405,29 +404,17 @@ int smp_handle_nmi_ipi(struct pt_regs *regs)
|
|||
* because the caller may have timed out.
|
||||
*/
|
||||
nmi_ipi_lock_start(&flags);
|
||||
if (!nmi_ipi_busy_count)
|
||||
goto out;
|
||||
if (!cpumask_test_cpu(me, &nmi_ipi_pending_mask))
|
||||
goto out;
|
||||
|
||||
fn = nmi_ipi_function;
|
||||
if (!fn)
|
||||
goto out;
|
||||
|
||||
cpumask_clear_cpu(me, &nmi_ipi_pending_mask);
|
||||
nmi_ipi_busy_count++;
|
||||
nmi_ipi_unlock();
|
||||
|
||||
ret = 1;
|
||||
|
||||
fn(regs);
|
||||
|
||||
nmi_ipi_lock();
|
||||
if (nmi_ipi_busy_count > 1) /* Can race with caller time-out */
|
||||
nmi_ipi_busy_count--;
|
||||
out:
|
||||
if (cpumask_test_cpu(me, &nmi_ipi_pending_mask)) {
|
||||
cpumask_clear_cpu(me, &nmi_ipi_pending_mask);
|
||||
fn = READ_ONCE(nmi_ipi_function);
|
||||
WARN_ON_ONCE(!fn);
|
||||
ret = 1;
|
||||
}
|
||||
nmi_ipi_unlock_end(&flags);
|
||||
|
||||
if (fn)
|
||||
fn(regs);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -453,7 +440,7 @@ static void do_smp_send_nmi_ipi(int cpu, bool safe)
|
|||
* - cpu is the target CPU (must not be this CPU), or NMI_IPI_ALL_OTHERS.
|
||||
* - fn is the target callback function.
|
||||
* - delay_us > 0 is the delay before giving up waiting for targets to
|
||||
* complete executing the handler, == 0 specifies indefinite delay.
|
||||
* begin executing the handler, == 0 specifies indefinite delay.
|
||||
*/
|
||||
int __smp_send_nmi_ipi(int cpu, void (*fn)(struct pt_regs *), u64 delay_us, bool safe)
|
||||
{
|
||||
|
@ -467,31 +454,33 @@ int __smp_send_nmi_ipi(int cpu, void (*fn)(struct pt_regs *), u64 delay_us, bool
|
|||
if (unlikely(!smp_ops))
|
||||
return 0;
|
||||
|
||||
/* Take the nmi_ipi_busy count/lock with interrupts hard disabled */
|
||||
nmi_ipi_lock_start(&flags);
|
||||
while (nmi_ipi_busy_count) {
|
||||
while (nmi_ipi_busy) {
|
||||
nmi_ipi_unlock_end(&flags);
|
||||
spin_until_cond(nmi_ipi_busy_count == 0);
|
||||
spin_until_cond(!nmi_ipi_busy);
|
||||
nmi_ipi_lock_start(&flags);
|
||||
}
|
||||
|
||||
nmi_ipi_busy = true;
|
||||
nmi_ipi_function = fn;
|
||||
|
||||
WARN_ON_ONCE(!cpumask_empty(&nmi_ipi_pending_mask));
|
||||
|
||||
if (cpu < 0) {
|
||||
/* ALL_OTHERS */
|
||||
cpumask_copy(&nmi_ipi_pending_mask, cpu_online_mask);
|
||||
cpumask_clear_cpu(me, &nmi_ipi_pending_mask);
|
||||
} else {
|
||||
/* cpumask starts clear */
|
||||
cpumask_set_cpu(cpu, &nmi_ipi_pending_mask);
|
||||
}
|
||||
nmi_ipi_busy_count++;
|
||||
|
||||
nmi_ipi_unlock();
|
||||
|
||||
/* Interrupts remain hard disabled */
|
||||
|
||||
do_smp_send_nmi_ipi(cpu, safe);
|
||||
|
||||
nmi_ipi_lock();
|
||||
/* nmi_ipi_busy_count is held here, so unlock/lock is okay */
|
||||
/* nmi_ipi_busy is set here, so unlock/lock is okay */
|
||||
while (!cpumask_empty(&nmi_ipi_pending_mask)) {
|
||||
nmi_ipi_unlock();
|
||||
udelay(1);
|
||||
|
@ -503,29 +492,15 @@ int __smp_send_nmi_ipi(int cpu, void (*fn)(struct pt_regs *), u64 delay_us, bool
|
|||
}
|
||||
}
|
||||
|
||||
while (nmi_ipi_busy_count > 1) {
|
||||
nmi_ipi_unlock();
|
||||
udelay(1);
|
||||
nmi_ipi_lock();
|
||||
if (delay_us) {
|
||||
delay_us--;
|
||||
if (!delay_us)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!cpumask_empty(&nmi_ipi_pending_mask)) {
|
||||
/* Timeout waiting for CPUs to call smp_handle_nmi_ipi */
|
||||
ret = 0;
|
||||
cpumask_clear(&nmi_ipi_pending_mask);
|
||||
}
|
||||
if (nmi_ipi_busy_count > 1) {
|
||||
/* Timeout waiting for CPUs to execute fn */
|
||||
ret = 0;
|
||||
nmi_ipi_busy_count = 1;
|
||||
}
|
||||
|
||||
nmi_ipi_busy_count--;
|
||||
nmi_ipi_function = NULL;
|
||||
nmi_ipi_busy = false;
|
||||
|
||||
nmi_ipi_unlock_end(&flags);
|
||||
|
||||
return ret;
|
||||
|
@ -593,17 +568,8 @@ void crash_send_ipi(void (*crash_ipi_callback)(struct pt_regs *))
|
|||
static void nmi_stop_this_cpu(struct pt_regs *regs)
|
||||
{
|
||||
/*
|
||||
* This is a special case because it never returns, so the NMI IPI
|
||||
* handling would never mark it as done, which makes any later
|
||||
* smp_send_nmi_ipi() call spin forever. Mark it done now.
|
||||
*
|
||||
* IRQs are already hard disabled by the smp_handle_nmi_ipi.
|
||||
*/
|
||||
nmi_ipi_lock();
|
||||
if (nmi_ipi_busy_count > 1)
|
||||
nmi_ipi_busy_count--;
|
||||
nmi_ipi_unlock();
|
||||
|
||||
spin_begin();
|
||||
while (1)
|
||||
spin_cpu_relax();
|
||||
|
|
|
@ -168,7 +168,7 @@ int port_connection(int fd, int *socket, int *pid_out)
|
|||
{
|
||||
int new, err;
|
||||
char *argv[] = { "/usr/sbin/in.telnetd", "-L",
|
||||
"/usr/lib/uml/port-helper", NULL };
|
||||
OS_LIB_PATH "/uml/port-helper", NULL };
|
||||
struct port_pre_exec_data data;
|
||||
|
||||
new = accept(fd, NULL, 0);
|
||||
|
|
|
@ -749,11 +749,16 @@ asm(
|
|||
NOKPROBE_SYMBOL(kretprobe_trampoline);
|
||||
STACK_FRAME_NON_STANDARD(kretprobe_trampoline);
|
||||
|
||||
static struct kprobe kretprobe_kprobe = {
|
||||
.addr = (void *)kretprobe_trampoline,
|
||||
};
|
||||
|
||||
/*
|
||||
* Called from kretprobe_trampoline
|
||||
*/
|
||||
__visible __used void *trampoline_handler(struct pt_regs *regs)
|
||||
{
|
||||
struct kprobe_ctlblk *kcb;
|
||||
struct kretprobe_instance *ri = NULL;
|
||||
struct hlist_head *head, empty_rp;
|
||||
struct hlist_node *tmp;
|
||||
|
@ -763,6 +768,17 @@ __visible __used void *trampoline_handler(struct pt_regs *regs)
|
|||
void *frame_pointer;
|
||||
bool skipped = false;
|
||||
|
||||
preempt_disable();
|
||||
|
||||
/*
|
||||
* Set a dummy kprobe for avoiding kretprobe recursion.
|
||||
* Since kretprobe never run in kprobe handler, kprobe must not
|
||||
* be running at this point.
|
||||
*/
|
||||
kcb = get_kprobe_ctlblk();
|
||||
__this_cpu_write(current_kprobe, &kretprobe_kprobe);
|
||||
kcb->kprobe_status = KPROBE_HIT_ACTIVE;
|
||||
|
||||
INIT_HLIST_HEAD(&empty_rp);
|
||||
kretprobe_hash_lock(current, &head, &flags);
|
||||
/* fixup registers */
|
||||
|
@ -838,10 +854,9 @@ __visible __used void *trampoline_handler(struct pt_regs *regs)
|
|||
orig_ret_address = (unsigned long)ri->ret_addr;
|
||||
if (ri->rp && ri->rp->handler) {
|
||||
__this_cpu_write(current_kprobe, &ri->rp->kp);
|
||||
get_kprobe_ctlblk()->kprobe_status = KPROBE_HIT_ACTIVE;
|
||||
ri->ret_addr = correct_ret_addr;
|
||||
ri->rp->handler(ri, regs);
|
||||
__this_cpu_write(current_kprobe, NULL);
|
||||
__this_cpu_write(current_kprobe, &kretprobe_kprobe);
|
||||
}
|
||||
|
||||
recycle_rp_inst(ri, &empty_rp);
|
||||
|
@ -857,6 +872,9 @@ __visible __used void *trampoline_handler(struct pt_regs *regs)
|
|||
|
||||
kretprobe_hash_unlock(current, &flags);
|
||||
|
||||
__this_cpu_write(current_kprobe, NULL);
|
||||
preempt_enable();
|
||||
|
||||
hlist_for_each_entry_safe(ri, tmp, &empty_rp, hlist) {
|
||||
hlist_del(&ri->hlist);
|
||||
kfree(ri);
|
||||
|
|
|
@ -81,6 +81,19 @@ static int __init set_bios_reboot(const struct dmi_system_id *d)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Some machines don't handle the default ACPI reboot method and
|
||||
* require the EFI reboot method:
|
||||
*/
|
||||
static int __init set_efi_reboot(const struct dmi_system_id *d)
|
||||
{
|
||||
if (reboot_type != BOOT_EFI && !efi_runtime_disabled()) {
|
||||
reboot_type = BOOT_EFI;
|
||||
pr_info("%s series board detected. Selecting EFI-method for reboot.\n", d->ident);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void __noreturn machine_real_restart(unsigned int type)
|
||||
{
|
||||
local_irq_disable();
|
||||
|
@ -166,6 +179,14 @@ static const struct dmi_system_id reboot_dmi_table[] __initconst = {
|
|||
DMI_MATCH(DMI_PRODUCT_NAME, "AOA110"),
|
||||
},
|
||||
},
|
||||
{ /* Handle reboot issue on Acer TravelMate X514-51T */
|
||||
.callback = set_efi_reboot,
|
||||
.ident = "Acer TravelMate X514-51T",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate X514-51T"),
|
||||
},
|
||||
},
|
||||
|
||||
/* Apple */
|
||||
{ /* Handle problems with rebooting on Apple MacBook5 */
|
||||
|
|
|
@ -372,7 +372,7 @@ SECTIONS
|
|||
.bss : AT(ADDR(.bss) - LOAD_OFFSET) {
|
||||
__bss_start = .;
|
||||
*(.bss..page_aligned)
|
||||
*(.bss)
|
||||
*(BSS_MAIN)
|
||||
BSS_DECRYPTED
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
__bss_stop = .;
|
||||
|
|
|
@ -133,6 +133,7 @@ static inline bool kvm_apic_map_get_logical_dest(struct kvm_apic_map *map,
|
|||
if (offset <= max_apic_id) {
|
||||
u8 cluster_size = min(max_apic_id - offset + 1, 16U);
|
||||
|
||||
offset = array_index_nospec(offset, map->max_apic_id + 1);
|
||||
*cluster = &map->phys_map[offset];
|
||||
*mask = dest_id & (0xffff >> (16 - cluster_size));
|
||||
} else {
|
||||
|
@ -896,7 +897,8 @@ static inline bool kvm_apic_map_get_dest_lapic(struct kvm *kvm,
|
|||
if (irq->dest_id > map->max_apic_id) {
|
||||
*bitmap = 0;
|
||||
} else {
|
||||
*dst = &map->phys_map[irq->dest_id];
|
||||
u32 dest_id = array_index_nospec(irq->dest_id, map->max_apic_id + 1);
|
||||
*dst = &map->phys_map[dest_id];
|
||||
*bitmap = 1;
|
||||
}
|
||||
return true;
|
||||
|
|
|
@ -438,13 +438,13 @@ TRACE_EVENT(kvm_apic_ipi,
|
|||
);
|
||||
|
||||
TRACE_EVENT(kvm_apic_accept_irq,
|
||||
TP_PROTO(__u32 apicid, __u16 dm, __u8 tm, __u8 vec),
|
||||
TP_PROTO(__u32 apicid, __u16 dm, __u16 tm, __u8 vec),
|
||||
TP_ARGS(apicid, dm, tm, vec),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( __u32, apicid )
|
||||
__field( __u16, dm )
|
||||
__field( __u8, tm )
|
||||
__field( __u16, tm )
|
||||
__field( __u8, vec )
|
||||
),
|
||||
|
||||
|
|
|
@ -5226,7 +5226,7 @@ static unsigned int bfq_update_depths(struct bfq_data *bfqd,
|
|||
return min_shallow;
|
||||
}
|
||||
|
||||
static int bfq_init_hctx(struct blk_mq_hw_ctx *hctx, unsigned int index)
|
||||
static void bfq_depth_updated(struct blk_mq_hw_ctx *hctx)
|
||||
{
|
||||
struct bfq_data *bfqd = hctx->queue->elevator->elevator_data;
|
||||
struct blk_mq_tags *tags = hctx->sched_tags;
|
||||
|
@ -5234,6 +5234,11 @@ static int bfq_init_hctx(struct blk_mq_hw_ctx *hctx, unsigned int index)
|
|||
|
||||
min_shallow = bfq_update_depths(bfqd, &tags->bitmap_tags);
|
||||
sbitmap_queue_min_shallow_depth(&tags->bitmap_tags, min_shallow);
|
||||
}
|
||||
|
||||
static int bfq_init_hctx(struct blk_mq_hw_ctx *hctx, unsigned int index)
|
||||
{
|
||||
bfq_depth_updated(hctx);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -5656,6 +5661,7 @@ static struct elevator_type iosched_bfq_mq = {
|
|||
.requests_merged = bfq_requests_merged,
|
||||
.request_merged = bfq_request_merged,
|
||||
.has_work = bfq_has_work,
|
||||
.depth_updated = bfq_depth_updated,
|
||||
.init_hctx = bfq_init_hctx,
|
||||
.init_sched = bfq_init_queue,
|
||||
.exit_sched = bfq_exit_queue,
|
||||
|
|
|
@ -2887,6 +2887,8 @@ int blk_mq_update_nr_requests(struct request_queue *q, unsigned int nr)
|
|||
}
|
||||
if (ret)
|
||||
break;
|
||||
if (q->elevator && q->elevator->type->ops.mq.depth_updated)
|
||||
q->elevator->type->ops.mq.depth_updated(hctx);
|
||||
}
|
||||
|
||||
if (!ret)
|
||||
|
|
|
@ -542,6 +542,12 @@ int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc, struct nvdimm *nvdimm,
|
|||
goto out;
|
||||
}
|
||||
|
||||
dev_dbg(dev, "%s cmd: %s output length: %d\n", dimm_name,
|
||||
cmd_name, out_obj->buffer.length);
|
||||
print_hex_dump_debug(cmd_name, DUMP_PREFIX_OFFSET, 4, 4,
|
||||
out_obj->buffer.pointer,
|
||||
min_t(u32, 128, out_obj->buffer.length), true);
|
||||
|
||||
if (call_pkg) {
|
||||
call_pkg->nd_fw_size = out_obj->buffer.length;
|
||||
memcpy(call_pkg->nd_payload + call_pkg->nd_size_in,
|
||||
|
@ -560,12 +566,6 @@ int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc, struct nvdimm *nvdimm,
|
|||
return 0;
|
||||
}
|
||||
|
||||
dev_dbg(dev, "%s cmd: %s output length: %d\n", dimm_name,
|
||||
cmd_name, out_obj->buffer.length);
|
||||
print_hex_dump_debug(cmd_name, DUMP_PREFIX_OFFSET, 4, 4,
|
||||
out_obj->buffer.pointer,
|
||||
min_t(u32, 128, out_obj->buffer.length), true);
|
||||
|
||||
for (i = 0, offset = 0; i < desc->out_num; i++) {
|
||||
u32 out_size = nd_cmd_out_size(nvdimm, cmd, desc, i, buf,
|
||||
(u32 *) out_obj->buffer.pointer,
|
||||
|
|
|
@ -200,6 +200,8 @@ void __init ipmi_hardcode_init(void)
|
|||
char *str;
|
||||
char *si_type[SI_MAX_PARMS];
|
||||
|
||||
memset(si_type, 0, sizeof(si_type));
|
||||
|
||||
/* Parse out the si_type string into its components. */
|
||||
str = si_type_str;
|
||||
if (*str != '\0') {
|
||||
|
|
|
@ -136,6 +136,7 @@ config VT8500_TIMER
|
|||
config NPCM7XX_TIMER
|
||||
bool "NPCM7xx timer driver" if COMPILE_TEST
|
||||
depends on HAS_IOMEM
|
||||
select TIMER_OF
|
||||
select CLKSRC_MMIO
|
||||
help
|
||||
Enable 24-bit TIMER0 and TIMER1 counters in the NPCM7xx architecture,
|
||||
|
|
|
@ -296,4 +296,4 @@ static int __init oxnas_rps_timer_init(struct device_node *np)
|
|||
TIMER_OF_DECLARE(ox810se_rps,
|
||||
"oxsemi,ox810se-rps-timer", oxnas_rps_timer_init);
|
||||
TIMER_OF_DECLARE(ox820_rps,
|
||||
"oxsemi,ox820se-rps-timer", oxnas_rps_timer_init);
|
||||
"oxsemi,ox820-rps-timer", oxnas_rps_timer_init);
|
||||
|
|
|
@ -1213,6 +1213,11 @@ static enum surface_update_type det_surface_update(const struct dc *dc,
|
|||
return UPDATE_TYPE_FULL;
|
||||
}
|
||||
|
||||
if (u->surface->force_full_update) {
|
||||
update_flags->bits.full_update = 1;
|
||||
return UPDATE_TYPE_FULL;
|
||||
}
|
||||
|
||||
type = get_plane_info_update_type(u);
|
||||
elevate_update_type(&overall_type, type);
|
||||
|
||||
|
@ -1467,6 +1472,14 @@ void dc_commit_updates_for_stream(struct dc *dc,
|
|||
}
|
||||
|
||||
dc_resource_state_copy_construct(state, context);
|
||||
|
||||
for (i = 0; i < dc->res_pool->pipe_count; i++) {
|
||||
struct pipe_ctx *new_pipe = &context->res_ctx.pipe_ctx[i];
|
||||
struct pipe_ctx *old_pipe = &dc->current_state->res_ctx.pipe_ctx[i];
|
||||
|
||||
if (new_pipe->plane_state && new_pipe->plane_state != old_pipe->plane_state)
|
||||
new_pipe->plane_state->force_full_update = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -1510,6 +1523,12 @@ void dc_commit_updates_for_stream(struct dc *dc,
|
|||
dc->current_state = context;
|
||||
dc_release_state(old);
|
||||
|
||||
for (i = 0; i < dc->res_pool->pipe_count; i++) {
|
||||
struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i];
|
||||
|
||||
if (pipe_ctx->plane_state && pipe_ctx->stream == stream)
|
||||
pipe_ctx->plane_state->force_full_update = false;
|
||||
}
|
||||
}
|
||||
/*let's use current_state to update watermark etc*/
|
||||
if (update_type >= UPDATE_TYPE_FULL)
|
||||
|
|
|
@ -505,6 +505,9 @@ struct dc_plane_state {
|
|||
struct dc_plane_status status;
|
||||
struct dc_context *ctx;
|
||||
|
||||
/* HACK: Workaround for forcing full reprogramming under some conditions */
|
||||
bool force_full_update;
|
||||
|
||||
/* private to dc_surface.c */
|
||||
enum dc_irq_source irq_source;
|
||||
struct kref refcount;
|
||||
|
|
|
@ -189,6 +189,12 @@ static void submit_channel_request(
|
|||
1,
|
||||
0);
|
||||
}
|
||||
|
||||
REG_UPDATE(AUX_INTERRUPT_CONTROL, AUX_SW_DONE_ACK, 1);
|
||||
|
||||
REG_WAIT(AUX_SW_STATUS, AUX_SW_DONE, 0,
|
||||
10, aux110->timeout_period/10);
|
||||
|
||||
/* set the delay and the number of bytes to write */
|
||||
|
||||
/* The length include
|
||||
|
@ -241,9 +247,6 @@ static void submit_channel_request(
|
|||
}
|
||||
}
|
||||
|
||||
REG_UPDATE(AUX_INTERRUPT_CONTROL, AUX_SW_DONE_ACK, 1);
|
||||
REG_WAIT(AUX_SW_STATUS, AUX_SW_DONE, 0,
|
||||
10, aux110->timeout_period/10);
|
||||
REG_UPDATE(AUX_SW_CONTROL, AUX_SW_GO, 1);
|
||||
}
|
||||
|
||||
|
|
|
@ -69,11 +69,11 @@ enum { /* This is the timeout as defined in DP 1.2a,
|
|||
* at most within ~240usec. That means,
|
||||
* increasing this timeout will not affect normal operation,
|
||||
* and we'll timeout after
|
||||
* SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD = 1600usec.
|
||||
* SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD = 2400usec.
|
||||
* This timeout is especially important for
|
||||
* resume from S3 and CTS.
|
||||
* converters, resume from S3, and CTS.
|
||||
*/
|
||||
SW_AUX_TIMEOUT_PERIOD_MULTIPLIER = 4
|
||||
SW_AUX_TIMEOUT_PERIOD_MULTIPLIER = 6
|
||||
};
|
||||
struct aux_engine_dce110 {
|
||||
struct aux_engine base;
|
||||
|
|
|
@ -78,7 +78,7 @@ static void ipu_crtc_disable_planes(struct ipu_crtc *ipu_crtc,
|
|||
if (disable_partial)
|
||||
ipu_plane_disable(ipu_crtc->plane[1], true);
|
||||
if (disable_full)
|
||||
ipu_plane_disable(ipu_crtc->plane[0], false);
|
||||
ipu_plane_disable(ipu_crtc->plane[0], true);
|
||||
}
|
||||
|
||||
static void ipu_crtc_atomic_disable(struct drm_crtc *crtc,
|
||||
|
|
|
@ -92,6 +92,8 @@ static int sun4i_drv_bind(struct device *dev)
|
|||
ret = -ENOMEM;
|
||||
goto free_drm;
|
||||
}
|
||||
|
||||
dev_set_drvdata(dev, drm);
|
||||
drm->dev_private = drv;
|
||||
INIT_LIST_HEAD(&drv->frontend_list);
|
||||
INIT_LIST_HEAD(&drv->engine_list);
|
||||
|
@ -156,7 +158,10 @@ static void sun4i_drv_unbind(struct device *dev)
|
|||
drm_kms_helper_poll_fini(drm);
|
||||
sun4i_framebuffer_free(drm);
|
||||
drm_mode_config_cleanup(drm);
|
||||
|
||||
component_unbind_all(dev, NULL);
|
||||
of_reserved_mem_device_release(dev);
|
||||
|
||||
drm_dev_put(drm);
|
||||
}
|
||||
|
||||
|
@ -405,6 +410,8 @@ static int sun4i_drv_probe(struct platform_device *pdev)
|
|||
|
||||
static int sun4i_drv_remove(struct platform_device *pdev)
|
||||
{
|
||||
component_master_del(&pdev->dev, &sun4i_drv_master_ops);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -195,7 +195,8 @@ int ipu_dp_setup_channel(struct ipu_dp *dp,
|
|||
ipu_dp_csc_init(flow, flow->foreground.in_cs, flow->out_cs,
|
||||
DP_COM_CONF_CSC_DEF_BOTH);
|
||||
} else {
|
||||
if (flow->foreground.in_cs == flow->out_cs)
|
||||
if (flow->foreground.in_cs == IPUV3_COLORSPACE_UNKNOWN ||
|
||||
flow->foreground.in_cs == flow->out_cs)
|
||||
/*
|
||||
* foreground identical to output, apply color
|
||||
* conversion on background
|
||||
|
@ -261,6 +262,8 @@ void ipu_dp_disable_channel(struct ipu_dp *dp, bool sync)
|
|||
struct ipu_dp_priv *priv = flow->priv;
|
||||
u32 reg, csc;
|
||||
|
||||
dp->in_cs = IPUV3_COLORSPACE_UNKNOWN;
|
||||
|
||||
if (!dp->foreground)
|
||||
return;
|
||||
|
||||
|
@ -268,8 +271,9 @@ void ipu_dp_disable_channel(struct ipu_dp *dp, bool sync)
|
|||
|
||||
reg = readl(flow->base + DP_COM_CONF);
|
||||
csc = reg & DP_COM_CONF_CSC_DEF_MASK;
|
||||
if (csc == DP_COM_CONF_CSC_DEF_FG)
|
||||
reg &= ~DP_COM_CONF_CSC_DEF_MASK;
|
||||
reg &= ~DP_COM_CONF_CSC_DEF_MASK;
|
||||
if (csc == DP_COM_CONF_CSC_DEF_BOTH || csc == DP_COM_CONF_CSC_DEF_BG)
|
||||
reg |= DP_COM_CONF_CSC_DEF_BG;
|
||||
|
||||
reg &= ~DP_COM_CONF_FG_EN;
|
||||
writel(reg, flow->base + DP_COM_CONF);
|
||||
|
@ -347,6 +351,8 @@ int ipu_dp_init(struct ipu_soc *ipu, struct device *dev, unsigned long base)
|
|||
mutex_init(&priv->mutex);
|
||||
|
||||
for (i = 0; i < IPUV3_NUM_FLOWS; i++) {
|
||||
priv->flow[i].background.in_cs = IPUV3_COLORSPACE_UNKNOWN;
|
||||
priv->flow[i].foreground.in_cs = IPUV3_COLORSPACE_UNKNOWN;
|
||||
priv->flow[i].foreground.foreground = true;
|
||||
priv->flow[i].base = priv->base + ipu_dp_flow_base[i];
|
||||
priv->flow[i].priv = priv;
|
||||
|
|
|
@ -677,6 +677,14 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
|
|||
break;
|
||||
}
|
||||
|
||||
if ((usage->hid & 0xf0) == 0xb0) { /* SC - Display */
|
||||
switch (usage->hid & 0xf) {
|
||||
case 0x05: map_key_clear(KEY_SWITCHVIDEOMODE); break;
|
||||
default: goto ignore;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Some lazy vendors declare 255 usages for System Control,
|
||||
* leading to the creation of ABS_X|Y axis and too many others.
|
||||
|
@ -895,6 +903,10 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
|
|||
case 0x074: map_key_clear(KEY_BRIGHTNESS_MAX); break;
|
||||
case 0x075: map_key_clear(KEY_BRIGHTNESS_AUTO); break;
|
||||
|
||||
case 0x079: map_key_clear(KEY_KBDILLUMUP); break;
|
||||
case 0x07a: map_key_clear(KEY_KBDILLUMDOWN); break;
|
||||
case 0x07c: map_key_clear(KEY_KBDILLUMTOGGLE); break;
|
||||
|
||||
case 0x082: map_key_clear(KEY_VIDEO_NEXT); break;
|
||||
case 0x083: map_key_clear(KEY_LAST); break;
|
||||
case 0x084: map_key_clear(KEY_ENTER); break;
|
||||
|
@ -1026,6 +1038,8 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
|
|||
case 0x2cb: map_key_clear(KEY_KBDINPUTASSIST_ACCEPT); break;
|
||||
case 0x2cc: map_key_clear(KEY_KBDINPUTASSIST_CANCEL); break;
|
||||
|
||||
case 0x29f: map_key_clear(KEY_SCALE); break;
|
||||
|
||||
default: map_key_clear(KEY_UNKNOWN);
|
||||
}
|
||||
break;
|
||||
|
|
|
@ -250,7 +250,7 @@ static int pwm_fan_probe(struct platform_device *pdev)
|
|||
|
||||
ret = pwm_fan_of_get_cooling_data(&pdev->dev, ctx);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto err_pwm_disable;
|
||||
|
||||
ctx->pwm_fan_state = ctx->pwm_fan_max_state;
|
||||
if (IS_ENABLED(CONFIG_THERMAL)) {
|
||||
|
|
|
@ -1290,6 +1290,7 @@ static int xadc_probe(struct platform_device *pdev)
|
|||
|
||||
err_free_irq:
|
||||
free_irq(xadc->irq, indio_dev);
|
||||
cancel_delayed_work_sync(&xadc->zynq_unmask_work);
|
||||
err_clk_disable_unprepare:
|
||||
clk_disable_unprepare(xadc->clk);
|
||||
err_free_samplerate_trigger:
|
||||
|
@ -1319,8 +1320,8 @@ static int xadc_remove(struct platform_device *pdev)
|
|||
iio_triggered_buffer_cleanup(indio_dev);
|
||||
}
|
||||
free_irq(xadc->irq, indio_dev);
|
||||
cancel_delayed_work_sync(&xadc->zynq_unmask_work);
|
||||
clk_disable_unprepare(xadc->clk);
|
||||
cancel_delayed_work(&xadc->zynq_unmask_work);
|
||||
kfree(xadc->data);
|
||||
kfree(indio_dev->channels);
|
||||
|
||||
|
|
|
@ -494,7 +494,7 @@ static int hns_roce_set_kernel_sq_size(struct hns_roce_dev *hr_dev,
|
|||
|
||||
static int hns_roce_qp_has_sq(struct ib_qp_init_attr *attr)
|
||||
{
|
||||
if (attr->qp_type == IB_QPT_XRC_TGT)
|
||||
if (attr->qp_type == IB_QPT_XRC_TGT || !attr->cap.max_send_wr)
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
|
|
|
@ -860,7 +860,7 @@ static int rmi_create_function(struct rmi_device *rmi_dev,
|
|||
|
||||
error = rmi_register_function(fn);
|
||||
if (error)
|
||||
goto err_put_fn;
|
||||
return error;
|
||||
|
||||
if (pdt->function_number == 0x01)
|
||||
data->f01_container = fn;
|
||||
|
@ -870,10 +870,6 @@ static int rmi_create_function(struct rmi_device *rmi_dev,
|
|||
list_add_tail(&fn->node, &data->function_list);
|
||||
|
||||
return RMI_SCAN_CONTINUE;
|
||||
|
||||
err_put_fn:
|
||||
put_device(&fn->dev);
|
||||
return error;
|
||||
}
|
||||
|
||||
void rmi_enable_irq(struct rmi_device *rmi_dev, bool clear_wake)
|
||||
|
|
|
@ -22,6 +22,15 @@
|
|||
#define AR71XX_RESET_REG_MISC_INT_ENABLE 4
|
||||
|
||||
#define ATH79_MISC_IRQ_COUNT 32
|
||||
#define ATH79_MISC_PERF_IRQ 5
|
||||
|
||||
static int ath79_perfcount_irq;
|
||||
|
||||
int get_c0_perfcount_int(void)
|
||||
{
|
||||
return ath79_perfcount_irq;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(get_c0_perfcount_int);
|
||||
|
||||
static void ath79_misc_irq_handler(struct irq_desc *desc)
|
||||
{
|
||||
|
@ -113,6 +122,8 @@ static void __init ath79_misc_intc_domain_init(
|
|||
{
|
||||
void __iomem *base = domain->host_data;
|
||||
|
||||
ath79_perfcount_irq = irq_create_mapping(domain, ATH79_MISC_PERF_IRQ);
|
||||
|
||||
/* Disable and clear all interrupts */
|
||||
__raw_writel(0, base + AR71XX_RESET_REG_MISC_INT_ENABLE);
|
||||
__raw_writel(0, base + AR71XX_RESET_REG_MISC_INT_STATUS);
|
||||
|
|
|
@ -958,6 +958,7 @@ static void write_iso_callback(struct urb *urb)
|
|||
*/
|
||||
static int starturbs(struct bc_state *bcs)
|
||||
{
|
||||
struct usb_device *udev = bcs->cs->hw.bas->udev;
|
||||
struct bas_bc_state *ubc = bcs->hw.bas;
|
||||
struct urb *urb;
|
||||
int j, k;
|
||||
|
@ -975,8 +976,8 @@ static int starturbs(struct bc_state *bcs)
|
|||
rc = -EFAULT;
|
||||
goto error;
|
||||
}
|
||||
usb_fill_int_urb(urb, bcs->cs->hw.bas->udev,
|
||||
usb_rcvisocpipe(urb->dev, 3 + 2 * bcs->channel),
|
||||
usb_fill_int_urb(urb, udev,
|
||||
usb_rcvisocpipe(udev, 3 + 2 * bcs->channel),
|
||||
ubc->isoinbuf + k * BAS_INBUFSIZE,
|
||||
BAS_INBUFSIZE, read_iso_callback, bcs,
|
||||
BAS_FRAMETIME);
|
||||
|
@ -1006,8 +1007,8 @@ static int starturbs(struct bc_state *bcs)
|
|||
rc = -EFAULT;
|
||||
goto error;
|
||||
}
|
||||
usb_fill_int_urb(urb, bcs->cs->hw.bas->udev,
|
||||
usb_sndisocpipe(urb->dev, 4 + 2 * bcs->channel),
|
||||
usb_fill_int_urb(urb, udev,
|
||||
usb_sndisocpipe(udev, 4 + 2 * bcs->channel),
|
||||
ubc->isooutbuf->data,
|
||||
sizeof(ubc->isooutbuf->data),
|
||||
write_iso_callback, &ubc->isoouturbs[k],
|
||||
|
|
|
@ -711,10 +711,10 @@ base_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
|
|||
struct sock *sk = sock->sk;
|
||||
int err = 0;
|
||||
|
||||
if (!maddr || maddr->family != AF_ISDN)
|
||||
if (addr_len < sizeof(struct sockaddr_mISDN))
|
||||
return -EINVAL;
|
||||
|
||||
if (addr_len < sizeof(struct sockaddr_mISDN))
|
||||
if (!maddr || maddr->family != AF_ISDN)
|
||||
return -EINVAL;
|
||||
|
||||
lock_sock(sk);
|
||||
|
|
|
@ -4221,26 +4221,15 @@ static void handle_parity_checks6(struct r5conf *conf, struct stripe_head *sh,
|
|||
case check_state_check_result:
|
||||
sh->check_state = check_state_idle;
|
||||
|
||||
if (s->failed > 1)
|
||||
break;
|
||||
/* handle a successful check operation, if parity is correct
|
||||
* we are done. Otherwise update the mismatch count and repair
|
||||
* parity if !MD_RECOVERY_CHECK
|
||||
*/
|
||||
if (sh->ops.zero_sum_result == 0) {
|
||||
/* both parities are correct */
|
||||
if (!s->failed)
|
||||
set_bit(STRIPE_INSYNC, &sh->state);
|
||||
else {
|
||||
/* in contrast to the raid5 case we can validate
|
||||
* parity, but still have a failure to write
|
||||
* back
|
||||
*/
|
||||
sh->check_state = check_state_compute_result;
|
||||
/* Returning at this point means that we may go
|
||||
* off and bring p and/or q uptodate again so
|
||||
* we make sure to check zero_sum_result again
|
||||
* to verify if p or q need writeback
|
||||
*/
|
||||
}
|
||||
/* Any parity checked was correct */
|
||||
set_bit(STRIPE_INSYNC, &sh->state);
|
||||
} else {
|
||||
atomic64_add(STRIPE_SECTORS, &conf->mddev->resync_mismatches);
|
||||
if (test_bit(MD_RECOVERY_CHECK, &conf->mddev->recovery)) {
|
||||
|
|
|
@ -1098,13 +1098,6 @@ static int bond_option_arp_validate_set(struct bonding *bond,
|
|||
{
|
||||
netdev_dbg(bond->dev, "Setting arp_validate to %s (%llu)\n",
|
||||
newval->string, newval->value);
|
||||
|
||||
if (bond->dev->flags & IFF_UP) {
|
||||
if (!newval->value)
|
||||
bond->recv_probe = NULL;
|
||||
else if (bond->params.arp_interval)
|
||||
bond->recv_probe = bond_arp_rcv;
|
||||
}
|
||||
bond->params.arp_validate = newval->value;
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -379,18 +379,22 @@ int mv88e6390x_port_set_cmode(struct mv88e6xxx_chip *chip, int port,
|
|||
return 0;
|
||||
|
||||
lane = mv88e6390x_serdes_get_lane(chip, port);
|
||||
if (lane < 0)
|
||||
if (lane < 0 && lane != -ENODEV)
|
||||
return lane;
|
||||
|
||||
if (chip->ports[port].serdes_irq) {
|
||||
err = mv88e6390_serdes_irq_disable(chip, port, lane);
|
||||
if (lane >= 0) {
|
||||
if (chip->ports[port].serdes_irq) {
|
||||
err = mv88e6390_serdes_irq_disable(chip, port, lane);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
err = mv88e6390x_serdes_power(chip, port, false);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
err = mv88e6390x_serdes_power(chip, port, false);
|
||||
if (err)
|
||||
return err;
|
||||
chip->ports[port].cmode = 0;
|
||||
|
||||
if (cmode) {
|
||||
err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_STS, ®);
|
||||
|
@ -404,6 +408,12 @@ int mv88e6390x_port_set_cmode(struct mv88e6xxx_chip *chip, int port,
|
|||
if (err)
|
||||
return err;
|
||||
|
||||
chip->ports[port].cmode = cmode;
|
||||
|
||||
lane = mv88e6390x_serdes_get_lane(chip, port);
|
||||
if (lane < 0)
|
||||
return lane;
|
||||
|
||||
err = mv88e6390x_serdes_power(chip, port, true);
|
||||
if (err)
|
||||
return err;
|
||||
|
@ -415,8 +425,6 @@ int mv88e6390x_port_set_cmode(struct mv88e6xxx_chip *chip, int port,
|
|||
}
|
||||
}
|
||||
|
||||
chip->ports[port].cmode = cmode;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -2419,12 +2419,12 @@ static int macb_open(struct net_device *dev)
|
|||
return err;
|
||||
}
|
||||
|
||||
bp->macbgem_ops.mog_init_rings(bp);
|
||||
macb_init_hw(bp);
|
||||
|
||||
for (q = 0, queue = bp->queues; q < bp->num_queues; ++q, ++queue)
|
||||
napi_enable(&queue->napi);
|
||||
|
||||
bp->macbgem_ops.mog_init_rings(bp);
|
||||
macb_init_hw(bp);
|
||||
|
||||
/* schedule a link state check */
|
||||
phy_start(dev->phydev);
|
||||
|
||||
|
|
|
@ -1648,7 +1648,7 @@ static struct sk_buff *dpaa_cleanup_tx_fd(const struct dpaa_priv *priv,
|
|||
qm_sg_entry_get_len(&sgt[0]), dma_dir);
|
||||
|
||||
/* remaining pages were mapped with skb_frag_dma_map() */
|
||||
for (i = 1; i < nr_frags; i++) {
|
||||
for (i = 1; i <= nr_frags; i++) {
|
||||
WARN_ON(qm_sg_entry_is_ext(&sgt[i]));
|
||||
|
||||
dma_unmap_page(dev, qm_sg_addr(&sgt[i]),
|
||||
|
|
|
@ -1850,13 +1850,9 @@ static int fec_enet_clk_enable(struct net_device *ndev, bool enable)
|
|||
int ret;
|
||||
|
||||
if (enable) {
|
||||
ret = clk_prepare_enable(fep->clk_ahb);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = clk_prepare_enable(fep->clk_enet_out);
|
||||
if (ret)
|
||||
goto failed_clk_enet_out;
|
||||
return ret;
|
||||
|
||||
if (fep->clk_ptp) {
|
||||
mutex_lock(&fep->ptp_clk_mutex);
|
||||
|
@ -1876,7 +1872,6 @@ static int fec_enet_clk_enable(struct net_device *ndev, bool enable)
|
|||
|
||||
phy_reset_after_clk_enable(ndev->phydev);
|
||||
} else {
|
||||
clk_disable_unprepare(fep->clk_ahb);
|
||||
clk_disable_unprepare(fep->clk_enet_out);
|
||||
if (fep->clk_ptp) {
|
||||
mutex_lock(&fep->ptp_clk_mutex);
|
||||
|
@ -1895,8 +1890,6 @@ static int fec_enet_clk_enable(struct net_device *ndev, bool enable)
|
|||
failed_clk_ptp:
|
||||
if (fep->clk_enet_out)
|
||||
clk_disable_unprepare(fep->clk_enet_out);
|
||||
failed_clk_enet_out:
|
||||
clk_disable_unprepare(fep->clk_ahb);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -3485,6 +3478,9 @@ fec_probe(struct platform_device *pdev)
|
|||
ret = clk_prepare_enable(fep->clk_ipg);
|
||||
if (ret)
|
||||
goto failed_clk_ipg;
|
||||
ret = clk_prepare_enable(fep->clk_ahb);
|
||||
if (ret)
|
||||
goto failed_clk_ahb;
|
||||
|
||||
fep->reg_phy = devm_regulator_get(&pdev->dev, "phy");
|
||||
if (!IS_ERR(fep->reg_phy)) {
|
||||
|
@ -3578,6 +3574,9 @@ fec_probe(struct platform_device *pdev)
|
|||
pm_runtime_put(&pdev->dev);
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
failed_regulator:
|
||||
clk_disable_unprepare(fep->clk_ahb);
|
||||
failed_clk_ahb:
|
||||
clk_disable_unprepare(fep->clk_ipg);
|
||||
failed_clk_ipg:
|
||||
fec_enet_clk_enable(ndev, false);
|
||||
failed_clk:
|
||||
|
@ -3701,6 +3700,7 @@ static int __maybe_unused fec_runtime_suspend(struct device *dev)
|
|||
struct net_device *ndev = dev_get_drvdata(dev);
|
||||
struct fec_enet_private *fep = netdev_priv(ndev);
|
||||
|
||||
clk_disable_unprepare(fep->clk_ahb);
|
||||
clk_disable_unprepare(fep->clk_ipg);
|
||||
|
||||
return 0;
|
||||
|
@ -3710,8 +3710,20 @@ static int __maybe_unused fec_runtime_resume(struct device *dev)
|
|||
{
|
||||
struct net_device *ndev = dev_get_drvdata(dev);
|
||||
struct fec_enet_private *fep = netdev_priv(ndev);
|
||||
int ret;
|
||||
|
||||
return clk_prepare_enable(fep->clk_ipg);
|
||||
ret = clk_prepare_enable(fep->clk_ahb);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = clk_prepare_enable(fep->clk_ipg);
|
||||
if (ret)
|
||||
goto failed_clk_ipg;
|
||||
|
||||
return 0;
|
||||
|
||||
failed_clk_ipg:
|
||||
clk_disable_unprepare(fep->clk_ahb);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct dev_pm_ops fec_pm_ops = {
|
||||
|
|
|
@ -252,14 +252,12 @@ uec_set_ringparam(struct net_device *netdev,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (netif_running(netdev))
|
||||
return -EBUSY;
|
||||
|
||||
ug_info->bdRingLenRx[queue] = ring->rx_pending;
|
||||
ug_info->bdRingLenTx[queue] = ring->tx_pending;
|
||||
|
||||
if (netif_running(netdev)) {
|
||||
/* FIXME: restart automatically */
|
||||
netdev_info(netdev, "Please re-open the interface\n");
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -568,7 +568,7 @@ static int mlxsw_emad_init(struct mlxsw_core *mlxsw_core)
|
|||
if (!(mlxsw_core->bus->features & MLXSW_BUS_F_TXRX))
|
||||
return 0;
|
||||
|
||||
emad_wq = alloc_workqueue("mlxsw_core_emad", WQ_MEM_RECLAIM, 0);
|
||||
emad_wq = alloc_workqueue("mlxsw_core_emad", 0, 0);
|
||||
if (!emad_wq)
|
||||
return -ENOMEM;
|
||||
mlxsw_core->emad_wq = emad_wq;
|
||||
|
@ -1875,10 +1875,10 @@ static int __init mlxsw_core_module_init(void)
|
|||
{
|
||||
int err;
|
||||
|
||||
mlxsw_wq = alloc_workqueue(mlxsw_core_driver_name, WQ_MEM_RECLAIM, 0);
|
||||
mlxsw_wq = alloc_workqueue(mlxsw_core_driver_name, 0, 0);
|
||||
if (!mlxsw_wq)
|
||||
return -ENOMEM;
|
||||
mlxsw_owq = alloc_ordered_workqueue("%s_ordered", WQ_MEM_RECLAIM,
|
||||
mlxsw_owq = alloc_ordered_workqueue("%s_ordered", 0,
|
||||
mlxsw_core_driver_name);
|
||||
if (!mlxsw_owq) {
|
||||
err = -ENOMEM;
|
||||
|
|
|
@ -1585,7 +1585,7 @@ static int mlxsw_sp_port_mdb_add(struct mlxsw_sp_port *mlxsw_sp_port,
|
|||
u16 fid_index;
|
||||
int err = 0;
|
||||
|
||||
if (switchdev_trans_ph_prepare(trans))
|
||||
if (switchdev_trans_ph_commit(trans))
|
||||
return 0;
|
||||
|
||||
bridge_port = mlxsw_sp_bridge_port_find(mlxsw_sp->bridge, orig_dev);
|
||||
|
|
|
@ -605,7 +605,7 @@ static int ocelot_mact_mc_add(struct ocelot_port *port,
|
|||
struct netdev_hw_addr *hw_addr)
|
||||
{
|
||||
struct ocelot *ocelot = port->ocelot;
|
||||
struct netdev_hw_addr *ha = kzalloc(sizeof(*ha), GFP_KERNEL);
|
||||
struct netdev_hw_addr *ha = kzalloc(sizeof(*ha), GFP_ATOMIC);
|
||||
|
||||
if (!ha)
|
||||
return -ENOMEM;
|
||||
|
|
|
@ -2365,6 +2365,7 @@ static void *__vxge_hw_blockpool_malloc(struct __vxge_hw_device *devh, u32 size,
|
|||
dma_object->addr))) {
|
||||
vxge_os_dma_free(devh->pdev, memblock,
|
||||
&dma_object->acc_handle);
|
||||
memblock = NULL;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
|
|
|
@ -490,18 +490,17 @@ int qede_ptp_enable(struct qede_dev *edev, bool init_tc)
|
|||
|
||||
ptp->clock = ptp_clock_register(&ptp->clock_info, &edev->pdev->dev);
|
||||
if (IS_ERR(ptp->clock)) {
|
||||
rc = -EINVAL;
|
||||
DP_ERR(edev, "PTP clock registration failed\n");
|
||||
qede_ptp_disable(edev);
|
||||
rc = -EINVAL;
|
||||
goto err2;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err2:
|
||||
qede_ptp_disable(edev);
|
||||
ptp->clock = NULL;
|
||||
err1:
|
||||
kfree(ptp);
|
||||
err2:
|
||||
edev->ptp = NULL;
|
||||
|
||||
return rc;
|
||||
|
|
|
@ -735,6 +735,7 @@ static int sgiseeq_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
platform_set_drvdata(pdev, dev);
|
||||
SET_NETDEV_DEV(dev, &pdev->dev);
|
||||
sp = netdev_priv(dev);
|
||||
|
||||
/* Make private data page aligned */
|
||||
|
|
|
@ -1015,6 +1015,8 @@ static struct mac_device_info *sun8i_dwmac_setup(void *ppriv)
|
|||
mac->mac = &sun8i_dwmac_ops;
|
||||
mac->dma = &sun8i_dwmac_dma_ops;
|
||||
|
||||
priv->dev->priv_flags |= IFF_UNICAST_FLT;
|
||||
|
||||
/* The loopback bit seems to be re-set when link change
|
||||
* Simply mask it each time
|
||||
* Speed 10/100/1000 are set in BIT(2)/BIT(3)
|
||||
|
|
|
@ -162,6 +162,14 @@ static const struct spi_device_id ks8995_id[] = {
|
|||
};
|
||||
MODULE_DEVICE_TABLE(spi, ks8995_id);
|
||||
|
||||
static const struct of_device_id ks8895_spi_of_match[] = {
|
||||
{ .compatible = "micrel,ks8995" },
|
||||
{ .compatible = "micrel,ksz8864" },
|
||||
{ .compatible = "micrel,ksz8795" },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, ks8895_spi_of_match);
|
||||
|
||||
static inline u8 get_chip_id(u8 val)
|
||||
{
|
||||
return (val >> ID1_CHIPID_S) & ID1_CHIPID_M;
|
||||
|
@ -529,6 +537,7 @@ static int ks8995_remove(struct spi_device *spi)
|
|||
static struct spi_driver ks8995_driver = {
|
||||
.driver = {
|
||||
.name = "spi-ks8995",
|
||||
.of_match_table = of_match_ptr(ks8895_spi_of_match),
|
||||
},
|
||||
.probe = ks8995_probe,
|
||||
.remove = ks8995_remove,
|
||||
|
|
|
@ -599,13 +599,18 @@ static u16 tun_automq_select_queue(struct tun_struct *tun, struct sk_buff *skb)
|
|||
static u16 tun_ebpf_select_queue(struct tun_struct *tun, struct sk_buff *skb)
|
||||
{
|
||||
struct tun_prog *prog;
|
||||
u32 numqueues;
|
||||
u16 ret = 0;
|
||||
|
||||
numqueues = READ_ONCE(tun->numqueues);
|
||||
if (!numqueues)
|
||||
return 0;
|
||||
|
||||
prog = rcu_dereference(tun->steering_prog);
|
||||
if (prog)
|
||||
ret = bpf_prog_run_clear_cb(prog->prog, skb);
|
||||
|
||||
return ret % tun->numqueues;
|
||||
return ret % numqueues;
|
||||
}
|
||||
|
||||
static u16 tun_select_queue(struct net_device *dev, struct sk_buff *skb,
|
||||
|
@ -703,6 +708,8 @@ static void __tun_detach(struct tun_file *tfile, bool clean)
|
|||
tun->tfiles[tun->numqueues - 1]);
|
||||
ntfile = rtnl_dereference(tun->tfiles[index]);
|
||||
ntfile->queue_index = index;
|
||||
rcu_assign_pointer(tun->tfiles[tun->numqueues - 1],
|
||||
NULL);
|
||||
|
||||
--tun->numqueues;
|
||||
if (clean) {
|
||||
|
@ -1085,7 +1092,7 @@ static netdev_tx_t tun_net_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
tfile = rcu_dereference(tun->tfiles[txq]);
|
||||
|
||||
/* Drop packet if interface is not attached */
|
||||
if (txq >= tun->numqueues)
|
||||
if (!tfile)
|
||||
goto drop;
|
||||
|
||||
if (!rcu_dereference(tun->steering_prog))
|
||||
|
@ -1276,6 +1283,7 @@ static int tun_xdp_xmit(struct net_device *dev, int n,
|
|||
|
||||
rcu_read_lock();
|
||||
|
||||
resample:
|
||||
numqueues = READ_ONCE(tun->numqueues);
|
||||
if (!numqueues) {
|
||||
rcu_read_unlock();
|
||||
|
@ -1284,6 +1292,8 @@ static int tun_xdp_xmit(struct net_device *dev, int n,
|
|||
|
||||
tfile = rcu_dereference(tun->tfiles[smp_processor_id() %
|
||||
numqueues]);
|
||||
if (unlikely(!tfile))
|
||||
goto resample;
|
||||
|
||||
spin_lock(&tfile->tx_ring.producer_lock);
|
||||
for (i = 0; i < n; i++) {
|
||||
|
|
|
@ -441,6 +441,9 @@ static const struct ieee80211_rate mwl8k_rates_50[] = {
|
|||
#define MWL8K_CMD_UPDATE_STADB 0x1123
|
||||
#define MWL8K_CMD_BASTREAM 0x1125
|
||||
|
||||
#define MWL8K_LEGACY_5G_RATE_OFFSET \
|
||||
(ARRAY_SIZE(mwl8k_rates_24) - ARRAY_SIZE(mwl8k_rates_50))
|
||||
|
||||
static const char *mwl8k_cmd_name(__le16 cmd, char *buf, int bufsize)
|
||||
{
|
||||
u16 command = le16_to_cpu(cmd);
|
||||
|
@ -1016,8 +1019,9 @@ mwl8k_rxd_ap_process(void *_rxd, struct ieee80211_rx_status *status,
|
|||
|
||||
if (rxd->channel > 14) {
|
||||
status->band = NL80211_BAND_5GHZ;
|
||||
if (!(status->encoding == RX_ENC_HT))
|
||||
status->rate_idx -= 5;
|
||||
if (!(status->encoding == RX_ENC_HT) &&
|
||||
status->rate_idx >= MWL8K_LEGACY_5G_RATE_OFFSET)
|
||||
status->rate_idx -= MWL8K_LEGACY_5G_RATE_OFFSET;
|
||||
} else {
|
||||
status->band = NL80211_BAND_2GHZ;
|
||||
}
|
||||
|
@ -1124,8 +1128,9 @@ mwl8k_rxd_sta_process(void *_rxd, struct ieee80211_rx_status *status,
|
|||
|
||||
if (rxd->channel > 14) {
|
||||
status->band = NL80211_BAND_5GHZ;
|
||||
if (!(status->encoding == RX_ENC_HT))
|
||||
status->rate_idx -= 5;
|
||||
if (!(status->encoding == RX_ENC_HT) &&
|
||||
status->rate_idx >= MWL8K_LEGACY_5G_RATE_OFFSET)
|
||||
status->rate_idx -= MWL8K_LEGACY_5G_RATE_OFFSET;
|
||||
} else {
|
||||
status->band = NL80211_BAND_2GHZ;
|
||||
}
|
||||
|
|
|
@ -1699,6 +1699,7 @@ static void _rtl8723e_read_adapter_info(struct ieee80211_hw *hw,
|
|||
rtlhal->oem_id = RT_CID_819X_LENOVO;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 0x1025:
|
||||
rtlhal->oem_id = RT_CID_819X_ACER;
|
||||
break;
|
||||
|
|
|
@ -84,8 +84,11 @@ int cw1200_hw_scan(struct ieee80211_hw *hw,
|
|||
|
||||
frame.skb = ieee80211_probereq_get(hw, priv->vif->addr, NULL, 0,
|
||||
req->ie_len);
|
||||
if (!frame.skb)
|
||||
if (!frame.skb) {
|
||||
mutex_unlock(&priv->conf_mutex);
|
||||
up(&priv->scan.lock);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
if (req->ie_len)
|
||||
skb_put_data(frame.skb, req->ie, req->ie_len);
|
||||
|
|
|
@ -1074,6 +1074,12 @@ static const struct spi_device_id st95hf_id[] = {
|
|||
};
|
||||
MODULE_DEVICE_TABLE(spi, st95hf_id);
|
||||
|
||||
static const struct of_device_id st95hf_spi_of_match[] = {
|
||||
{ .compatible = "st,st95hf" },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, st95hf_spi_of_match);
|
||||
|
||||
static int st95hf_probe(struct spi_device *nfc_spi_dev)
|
||||
{
|
||||
int ret;
|
||||
|
@ -1260,6 +1266,7 @@ static struct spi_driver st95hf_driver = {
|
|||
.driver = {
|
||||
.name = "st95hf",
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = of_match_ptr(st95hf_spi_of_match),
|
||||
},
|
||||
.id_table = st95hf_id,
|
||||
.probe = st95hf_probe,
|
||||
|
|
|
@ -190,14 +190,15 @@ static struct device *__nd_btt_create(struct nd_region *nd_region,
|
|||
return NULL;
|
||||
|
||||
nd_btt->id = ida_simple_get(&nd_region->btt_ida, 0, 0, GFP_KERNEL);
|
||||
if (nd_btt->id < 0) {
|
||||
kfree(nd_btt);
|
||||
return NULL;
|
||||
}
|
||||
if (nd_btt->id < 0)
|
||||
goto out_nd_btt;
|
||||
|
||||
nd_btt->lbasize = lbasize;
|
||||
if (uuid)
|
||||
if (uuid) {
|
||||
uuid = kmemdup(uuid, 16, GFP_KERNEL);
|
||||
if (!uuid)
|
||||
goto out_put_id;
|
||||
}
|
||||
nd_btt->uuid = uuid;
|
||||
dev = &nd_btt->dev;
|
||||
dev_set_name(dev, "btt%d.%d", nd_region->id, nd_btt->id);
|
||||
|
@ -212,6 +213,13 @@ static struct device *__nd_btt_create(struct nd_region *nd_region,
|
|||
return NULL;
|
||||
}
|
||||
return dev;
|
||||
|
||||
out_put_id:
|
||||
ida_simple_remove(&nd_region->btt_ida, nd_btt->id);
|
||||
|
||||
out_nd_btt:
|
||||
kfree(nd_btt);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct device *nd_btt_create(struct nd_region *nd_region)
|
||||
|
|
|
@ -2251,9 +2251,12 @@ static struct device *create_namespace_blk(struct nd_region *nd_region,
|
|||
if (!nsblk->uuid)
|
||||
goto blk_err;
|
||||
memcpy(name, nd_label->name, NSLABEL_NAME_LEN);
|
||||
if (name[0])
|
||||
if (name[0]) {
|
||||
nsblk->alt_name = kmemdup(name, NSLABEL_NAME_LEN,
|
||||
GFP_KERNEL);
|
||||
if (!nsblk->alt_name)
|
||||
goto blk_err;
|
||||
}
|
||||
res = nsblk_add_resource(nd_region, ndd, nsblk,
|
||||
__le64_to_cpu(nd_label->dpa));
|
||||
if (!res)
|
||||
|
|
|
@ -113,13 +113,13 @@ static void write_pmem(void *pmem_addr, struct page *page,
|
|||
|
||||
while (len) {
|
||||
mem = kmap_atomic(page);
|
||||
chunk = min_t(unsigned int, len, PAGE_SIZE);
|
||||
chunk = min_t(unsigned int, len, PAGE_SIZE - off);
|
||||
memcpy_flushcache(pmem_addr, mem + off, chunk);
|
||||
kunmap_atomic(mem);
|
||||
len -= chunk;
|
||||
off = 0;
|
||||
page++;
|
||||
pmem_addr += PAGE_SIZE;
|
||||
pmem_addr += chunk;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -132,7 +132,7 @@ static blk_status_t read_pmem(struct page *page, unsigned int off,
|
|||
|
||||
while (len) {
|
||||
mem = kmap_atomic(page);
|
||||
chunk = min_t(unsigned int, len, PAGE_SIZE);
|
||||
chunk = min_t(unsigned int, len, PAGE_SIZE - off);
|
||||
rem = memcpy_mcsafe(mem + off, pmem_addr, chunk);
|
||||
kunmap_atomic(mem);
|
||||
if (rem)
|
||||
|
@ -140,7 +140,7 @@ static blk_status_t read_pmem(struct page *page, unsigned int off,
|
|||
len -= chunk;
|
||||
off = 0;
|
||||
page++;
|
||||
pmem_addr += PAGE_SIZE;
|
||||
pmem_addr += chunk;
|
||||
}
|
||||
return BLK_STS_OK;
|
||||
}
|
||||
|
|
|
@ -1491,6 +1491,21 @@ static void hv_pci_assign_slots(struct hv_pcibus_device *hbus)
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Remove entries in sysfs pci slot directory.
|
||||
*/
|
||||
static void hv_pci_remove_slots(struct hv_pcibus_device *hbus)
|
||||
{
|
||||
struct hv_pci_dev *hpdev;
|
||||
|
||||
list_for_each_entry(hpdev, &hbus->children, list_entry) {
|
||||
if (!hpdev->pci_slot)
|
||||
continue;
|
||||
pci_destroy_slot(hpdev->pci_slot);
|
||||
hpdev->pci_slot = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* create_root_hv_pci_bus() - Expose a new root PCI bus
|
||||
* @hbus: Root PCI bus, as understood by this driver
|
||||
|
@ -1766,6 +1781,10 @@ static void pci_devices_present_work(struct work_struct *work)
|
|||
hpdev = list_first_entry(&removed, struct hv_pci_dev,
|
||||
list_entry);
|
||||
list_del(&hpdev->list_entry);
|
||||
|
||||
if (hpdev->pci_slot)
|
||||
pci_destroy_slot(hpdev->pci_slot);
|
||||
|
||||
put_pcichild(hpdev);
|
||||
}
|
||||
|
||||
|
@ -1905,6 +1924,9 @@ static void hv_eject_device_work(struct work_struct *work)
|
|||
sizeof(*ejct_pkt), (unsigned long)&ctxt.pkt,
|
||||
VM_PKT_DATA_INBAND, 0);
|
||||
|
||||
/* For the get_pcichild() in hv_pci_eject_device() */
|
||||
put_pcichild(hpdev);
|
||||
/* For the two refs got in new_pcichild_device() */
|
||||
put_pcichild(hpdev);
|
||||
put_pcichild(hpdev);
|
||||
put_hvpcibus(hpdev->hbus);
|
||||
|
@ -2682,6 +2704,7 @@ static int hv_pci_remove(struct hv_device *hdev)
|
|||
pci_lock_rescan_remove();
|
||||
pci_stop_root_bus(hbus->pci_bus);
|
||||
pci_remove_root_bus(hbus->pci_bus);
|
||||
hv_pci_remove_slots(hbus);
|
||||
pci_unlock_rescan_remove();
|
||||
hbus->state = hv_pcibus_removed;
|
||||
}
|
||||
|
|
|
@ -532,7 +532,7 @@ static void dell_rfkill_query(struct rfkill *rfkill, void *data)
|
|||
return;
|
||||
}
|
||||
|
||||
dell_fill_request(&buffer, 0, 0x2, 0, 0);
|
||||
dell_fill_request(&buffer, 0x2, 0, 0, 0);
|
||||
ret = dell_send_request(&buffer, CLASS_INFO, SELECT_RFKILL);
|
||||
hwswitch = buffer.output[1];
|
||||
|
||||
|
@ -563,7 +563,7 @@ static int dell_debugfs_show(struct seq_file *s, void *data)
|
|||
return ret;
|
||||
status = buffer.output[1];
|
||||
|
||||
dell_fill_request(&buffer, 0, 0x2, 0, 0);
|
||||
dell_fill_request(&buffer, 0x2, 0, 0, 0);
|
||||
hwswitch_ret = dell_send_request(&buffer, CLASS_INFO, SELECT_RFKILL);
|
||||
if (hwswitch_ret)
|
||||
return hwswitch_ret;
|
||||
|
@ -648,7 +648,7 @@ static void dell_update_rfkill(struct work_struct *ignored)
|
|||
if (ret != 0)
|
||||
return;
|
||||
|
||||
dell_fill_request(&buffer, 0, 0x2, 0, 0);
|
||||
dell_fill_request(&buffer, 0x2, 0, 0, 0);
|
||||
ret = dell_send_request(&buffer, CLASS_INFO, SELECT_RFKILL);
|
||||
|
||||
if (ret == 0 && (status & BIT(0)))
|
||||
|
|
|
@ -4424,14 +4424,16 @@ sony_pic_read_possible_resource(struct acpi_resource *resource, void *context)
|
|||
}
|
||||
return AE_OK;
|
||||
}
|
||||
default:
|
||||
dprintk("Resource %d isn't an IRQ nor an IO port\n",
|
||||
resource->type);
|
||||
|
||||
case ACPI_RESOURCE_TYPE_END_TAG:
|
||||
return AE_OK;
|
||||
|
||||
default:
|
||||
dprintk("Resource %d isn't an IRQ nor an IO port\n",
|
||||
resource->type);
|
||||
return AE_CTRL_TERMINATE;
|
||||
|
||||
}
|
||||
return AE_CTRL_TERMINATE;
|
||||
}
|
||||
|
||||
static int sony_pic_possible_resources(struct acpi_device *device)
|
||||
|
|
|
@ -79,7 +79,7 @@
|
|||
#include <linux/jiffies.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/pci_ids.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/power_supply.h>
|
||||
#include <linux/thinkpad_acpi.h>
|
||||
#include <sound/core.h>
|
||||
|
@ -4496,6 +4496,74 @@ static void bluetooth_exit(void)
|
|||
bluetooth_shutdown();
|
||||
}
|
||||
|
||||
static const struct dmi_system_id bt_fwbug_list[] __initconst = {
|
||||
{
|
||||
.ident = "ThinkPad E485",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "20KU"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.ident = "ThinkPad E585",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "20KV"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.ident = "ThinkPad A285 - 20MW",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "20MW"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.ident = "ThinkPad A285 - 20MX",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "20MX"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.ident = "ThinkPad A485 - 20MU",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "20MU"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.ident = "ThinkPad A485 - 20MV",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "20MV"),
|
||||
},
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
static const struct pci_device_id fwbug_cards_ids[] __initconst = {
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x24F3) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x24FD) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2526) },
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
static int __init have_bt_fwbug(void)
|
||||
{
|
||||
/*
|
||||
* Some AMD based ThinkPads have a firmware bug that calling
|
||||
* "GBDC" will cause bluetooth on Intel wireless cards blocked
|
||||
*/
|
||||
if (dmi_check_system(bt_fwbug_list) && pci_dev_present(fwbug_cards_ids)) {
|
||||
vdbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_RFKILL,
|
||||
FW_BUG "disable bluetooth subdriver for Intel cards\n");
|
||||
return 1;
|
||||
} else
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init bluetooth_init(struct ibm_init_struct *iibm)
|
||||
{
|
||||
int res;
|
||||
|
@ -4508,7 +4576,7 @@ static int __init bluetooth_init(struct ibm_init_struct *iibm)
|
|||
|
||||
/* bluetooth not supported on 570, 600e/x, 770e, 770x, A21e, A2xm/p,
|
||||
G4x, R30, R31, R40e, R50e, T20-22, X20-21 */
|
||||
tp_features.bluetooth = hkey_handle &&
|
||||
tp_features.bluetooth = !have_bt_fwbug() && hkey_handle &&
|
||||
acpi_evalf(hkey_handle, &status, "GBDC", "qd");
|
||||
|
||||
vdbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_RFKILL,
|
||||
|
|
|
@ -2004,14 +2004,14 @@ static int dasd_eckd_end_analysis(struct dasd_block *block)
|
|||
blk_per_trk = recs_per_track(&private->rdc_data, 0, block->bp_block);
|
||||
|
||||
raw:
|
||||
block->blocks = (private->real_cyl *
|
||||
block->blocks = ((unsigned long) private->real_cyl *
|
||||
private->rdc_data.trk_per_cyl *
|
||||
blk_per_trk);
|
||||
|
||||
dev_info(&device->cdev->dev,
|
||||
"DASD with %d KB/block, %d KB total size, %d KB/track, "
|
||||
"DASD with %u KB/block, %lu KB total size, %u KB/track, "
|
||||
"%s\n", (block->bp_block >> 10),
|
||||
((private->real_cyl *
|
||||
(((unsigned long) private->real_cyl *
|
||||
private->rdc_data.trk_per_cyl *
|
||||
blk_per_trk * (block->bp_block >> 9)) >> 1),
|
||||
((blk_per_trk * block->bp_block) >> 10),
|
||||
|
|
|
@ -629,7 +629,7 @@ con3270_init(void)
|
|||
(void (*)(unsigned long)) con3270_read_tasklet,
|
||||
(unsigned long) condev->read);
|
||||
|
||||
raw3270_add_view(&condev->view, &con3270_fn, 1);
|
||||
raw3270_add_view(&condev->view, &con3270_fn, 1, RAW3270_VIEW_LOCK_IRQ);
|
||||
|
||||
INIT_LIST_HEAD(&condev->freemem);
|
||||
for (i = 0; i < CON3270_STRING_PAGES; i++) {
|
||||
|
|
|
@ -463,7 +463,8 @@ fs3270_open(struct inode *inode, struct file *filp)
|
|||
|
||||
init_waitqueue_head(&fp->wait);
|
||||
fp->fs_pid = get_pid(task_pid(current));
|
||||
rc = raw3270_add_view(&fp->view, &fs3270_fn, minor);
|
||||
rc = raw3270_add_view(&fp->view, &fs3270_fn, minor,
|
||||
RAW3270_VIEW_LOCK_BH);
|
||||
if (rc) {
|
||||
fs3270_free_view(&fp->view);
|
||||
goto out;
|
||||
|
|
|
@ -920,7 +920,7 @@ raw3270_deactivate_view(struct raw3270_view *view)
|
|||
* Add view to device with minor "minor".
|
||||
*/
|
||||
int
|
||||
raw3270_add_view(struct raw3270_view *view, struct raw3270_fn *fn, int minor)
|
||||
raw3270_add_view(struct raw3270_view *view, struct raw3270_fn *fn, int minor, int subclass)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct raw3270 *rp;
|
||||
|
@ -942,6 +942,7 @@ raw3270_add_view(struct raw3270_view *view, struct raw3270_fn *fn, int minor)
|
|||
view->cols = rp->cols;
|
||||
view->ascebc = rp->ascebc;
|
||||
spin_lock_init(&view->lock);
|
||||
lockdep_set_subclass(&view->lock, subclass);
|
||||
list_add(&view->list, &rp->view_list);
|
||||
rc = 0;
|
||||
spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags);
|
||||
|
|
|
@ -150,6 +150,8 @@ struct raw3270_fn {
|
|||
struct raw3270_view {
|
||||
struct list_head list;
|
||||
spinlock_t lock;
|
||||
#define RAW3270_VIEW_LOCK_IRQ 0
|
||||
#define RAW3270_VIEW_LOCK_BH 1
|
||||
atomic_t ref_count;
|
||||
struct raw3270 *dev;
|
||||
struct raw3270_fn *fn;
|
||||
|
@ -158,7 +160,7 @@ struct raw3270_view {
|
|||
unsigned char *ascebc; /* ascii -> ebcdic table */
|
||||
};
|
||||
|
||||
int raw3270_add_view(struct raw3270_view *, struct raw3270_fn *, int);
|
||||
int raw3270_add_view(struct raw3270_view *, struct raw3270_fn *, int, int);
|
||||
int raw3270_activate_view(struct raw3270_view *);
|
||||
void raw3270_del_view(struct raw3270_view *);
|
||||
void raw3270_deactivate_view(struct raw3270_view *);
|
||||
|
|
|
@ -980,7 +980,8 @@ static int tty3270_install(struct tty_driver *driver, struct tty_struct *tty)
|
|||
return PTR_ERR(tp);
|
||||
|
||||
rc = raw3270_add_view(&tp->view, &tty3270_fn,
|
||||
tty->index + RAW3270_FIRSTMINOR);
|
||||
tty->index + RAW3270_FIRSTMINOR,
|
||||
RAW3270_VIEW_LOCK_BH);
|
||||
if (rc) {
|
||||
tty3270_free_view(tp);
|
||||
return rc;
|
||||
|
|
|
@ -45,7 +45,8 @@ static debug_info_t *debug_info;
|
|||
|
||||
static void __init pkey_debug_init(void)
|
||||
{
|
||||
debug_info = debug_register("pkey", 1, 1, 4 * sizeof(long));
|
||||
/* 5 arguments per dbf entry (including the format string ptr) */
|
||||
debug_info = debug_register("pkey", 1, 1, 5 * sizeof(long));
|
||||
debug_register_view(debug_info, &debug_sprintf_view);
|
||||
debug_set_level(debug_info, 3);
|
||||
}
|
||||
|
|
|
@ -1595,6 +1595,7 @@ static int ctcm_new_device(struct ccwgroup_device *cgdev)
|
|||
if (priv->channel[direction] == NULL) {
|
||||
if (direction == CTCM_WRITE)
|
||||
channel_free(priv->channel[CTCM_READ]);
|
||||
result = -ENODEV;
|
||||
goto out_dev;
|
||||
}
|
||||
priv->channel[direction]->netdev = dev;
|
||||
|
|
|
@ -91,6 +91,7 @@ aic7770_probe(struct device *dev)
|
|||
ahc = ahc_alloc(&aic7xxx_driver_template, name);
|
||||
if (ahc == NULL)
|
||||
return (ENOMEM);
|
||||
ahc->dev = dev;
|
||||
error = aic7770_config(ahc, aic7770_ident_table + edev->id.driver_data,
|
||||
eisaBase);
|
||||
if (error != 0) {
|
||||
|
|
|
@ -949,6 +949,7 @@ struct ahc_softc {
|
|||
* Platform specific device information.
|
||||
*/
|
||||
ahc_dev_softc_t dev_softc;
|
||||
struct device *dev;
|
||||
|
||||
/*
|
||||
* Bus specific device information.
|
||||
|
|
|
@ -861,8 +861,8 @@ int
|
|||
ahc_dmamem_alloc(struct ahc_softc *ahc, bus_dma_tag_t dmat, void** vaddr,
|
||||
int flags, bus_dmamap_t *mapp)
|
||||
{
|
||||
*vaddr = pci_alloc_consistent(ahc->dev_softc,
|
||||
dmat->maxsize, mapp);
|
||||
/* XXX: check if we really need the GFP_ATOMIC and unwind this mess! */
|
||||
*vaddr = dma_alloc_coherent(ahc->dev, dmat->maxsize, mapp, GFP_ATOMIC);
|
||||
if (*vaddr == NULL)
|
||||
return ENOMEM;
|
||||
return 0;
|
||||
|
@ -872,8 +872,7 @@ void
|
|||
ahc_dmamem_free(struct ahc_softc *ahc, bus_dma_tag_t dmat,
|
||||
void* vaddr, bus_dmamap_t map)
|
||||
{
|
||||
pci_free_consistent(ahc->dev_softc, dmat->maxsize,
|
||||
vaddr, map);
|
||||
dma_free_coherent(ahc->dev, dmat->maxsize, vaddr, map);
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -1124,8 +1123,7 @@ ahc_linux_register_host(struct ahc_softc *ahc, struct scsi_host_template *templa
|
|||
|
||||
host->transportt = ahc_linux_transport_template;
|
||||
|
||||
retval = scsi_add_host(host,
|
||||
(ahc->dev_softc ? &ahc->dev_softc->dev : NULL));
|
||||
retval = scsi_add_host(host, ahc->dev);
|
||||
if (retval) {
|
||||
printk(KERN_WARNING "aic7xxx: scsi_add_host failed\n");
|
||||
scsi_host_put(host);
|
||||
|
|
|
@ -250,6 +250,7 @@ ahc_linux_pci_dev_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
}
|
||||
}
|
||||
ahc->dev_softc = pci;
|
||||
ahc->dev = &pci->dev;
|
||||
error = ahc_pci_config(ahc, entry);
|
||||
if (error != 0) {
|
||||
ahc_free(ahc);
|
||||
|
|
|
@ -376,6 +376,7 @@ void usb_serial_generic_read_bulk_callback(struct urb *urb)
|
|||
struct usb_serial_port *port = urb->context;
|
||||
unsigned char *data = urb->transfer_buffer;
|
||||
unsigned long flags;
|
||||
bool stopped = false;
|
||||
int status = urb->status;
|
||||
int i;
|
||||
|
||||
|
@ -383,33 +384,51 @@ void usb_serial_generic_read_bulk_callback(struct urb *urb)
|
|||
if (urb == port->read_urbs[i])
|
||||
break;
|
||||
}
|
||||
set_bit(i, &port->read_urbs_free);
|
||||
|
||||
dev_dbg(&port->dev, "%s - urb %d, len %d\n", __func__, i,
|
||||
urb->actual_length);
|
||||
switch (status) {
|
||||
case 0:
|
||||
usb_serial_debug_data(&port->dev, __func__, urb->actual_length,
|
||||
data);
|
||||
port->serial->type->process_read_urb(urb);
|
||||
break;
|
||||
case -ENOENT:
|
||||
case -ECONNRESET:
|
||||
case -ESHUTDOWN:
|
||||
dev_dbg(&port->dev, "%s - urb stopped: %d\n",
|
||||
__func__, status);
|
||||
return;
|
||||
stopped = true;
|
||||
break;
|
||||
case -EPIPE:
|
||||
dev_err(&port->dev, "%s - urb stopped: %d\n",
|
||||
__func__, status);
|
||||
return;
|
||||
stopped = true;
|
||||
break;
|
||||
default:
|
||||
dev_dbg(&port->dev, "%s - nonzero urb status: %d\n",
|
||||
__func__, status);
|
||||
goto resubmit;
|
||||
break;
|
||||
}
|
||||
|
||||
usb_serial_debug_data(&port->dev, __func__, urb->actual_length, data);
|
||||
port->serial->type->process_read_urb(urb);
|
||||
/*
|
||||
* Make sure URB processing is done before marking as free to avoid
|
||||
* racing with unthrottle() on another CPU. Matches the barriers
|
||||
* implied by the test_and_clear_bit() in
|
||||
* usb_serial_generic_submit_read_urb().
|
||||
*/
|
||||
smp_mb__before_atomic();
|
||||
set_bit(i, &port->read_urbs_free);
|
||||
/*
|
||||
* Make sure URB is marked as free before checking the throttled flag
|
||||
* to avoid racing with unthrottle() on another CPU. Matches the
|
||||
* smp_mb() in unthrottle().
|
||||
*/
|
||||
smp_mb__after_atomic();
|
||||
|
||||
if (stopped)
|
||||
return;
|
||||
|
||||
resubmit:
|
||||
/* Throttle the device if requested by tty */
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
port->throttled = port->throttle_req;
|
||||
|
@ -484,6 +503,12 @@ void usb_serial_generic_unthrottle(struct tty_struct *tty)
|
|||
port->throttled = port->throttle_req = 0;
|
||||
spin_unlock_irq(&port->lock);
|
||||
|
||||
/*
|
||||
* Matches the smp_mb__after_atomic() in
|
||||
* usb_serial_generic_read_bulk_callback().
|
||||
*/
|
||||
smp_mb();
|
||||
|
||||
if (was_throttled)
|
||||
usb_serial_generic_submit_read_urbs(port, GFP_KERNEL);
|
||||
}
|
||||
|
|
|
@ -615,8 +615,13 @@ static int wcove_typec_probe(struct platform_device *pdev)
|
|||
wcove->dev = &pdev->dev;
|
||||
wcove->regmap = pmic->regmap;
|
||||
|
||||
irq = regmap_irq_get_virq(pmic->irq_chip_data_chgr,
|
||||
platform_get_irq(pdev, 0));
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
if (irq < 0) {
|
||||
dev_err(&pdev->dev, "Failed to get IRQ: %d\n", irq);
|
||||
return irq;
|
||||
}
|
||||
|
||||
irq = regmap_irq_get_virq(pmic->irq_chip_data_chgr, irq);
|
||||
if (irq < 0)
|
||||
return irq;
|
||||
|
||||
|
|
|
@ -215,6 +215,9 @@ static long ioctl_memcpy(struct fsl_hv_ioctl_memcpy __user *p)
|
|||
* hypervisor.
|
||||
*/
|
||||
lb_offset = param.local_vaddr & (PAGE_SIZE - 1);
|
||||
if (param.count == 0 ||
|
||||
param.count > U64_MAX - lb_offset - PAGE_SIZE + 1)
|
||||
return -EINVAL;
|
||||
num_pages = (param.count + lb_offset + PAGE_SIZE - 1) >> PAGE_SHIFT;
|
||||
|
||||
/* Allocate the buffers we need */
|
||||
|
@ -331,8 +334,8 @@ static long ioctl_dtprop(struct fsl_hv_ioctl_prop __user *p, int set)
|
|||
struct fsl_hv_ioctl_prop param;
|
||||
char __user *upath, *upropname;
|
||||
void __user *upropval;
|
||||
char *path = NULL, *propname = NULL;
|
||||
void *propval = NULL;
|
||||
char *path, *propname;
|
||||
void *propval;
|
||||
int ret = 0;
|
||||
|
||||
/* Get the parameters from the user. */
|
||||
|
@ -344,32 +347,30 @@ static long ioctl_dtprop(struct fsl_hv_ioctl_prop __user *p, int set)
|
|||
upropval = (void __user *)(uintptr_t)param.propval;
|
||||
|
||||
path = strndup_user(upath, FH_DTPROP_MAX_PATHLEN);
|
||||
if (IS_ERR(path)) {
|
||||
ret = PTR_ERR(path);
|
||||
goto out;
|
||||
}
|
||||
if (IS_ERR(path))
|
||||
return PTR_ERR(path);
|
||||
|
||||
propname = strndup_user(upropname, FH_DTPROP_MAX_PATHLEN);
|
||||
if (IS_ERR(propname)) {
|
||||
ret = PTR_ERR(propname);
|
||||
goto out;
|
||||
goto err_free_path;
|
||||
}
|
||||
|
||||
if (param.proplen > FH_DTPROP_MAX_PROPLEN) {
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
goto err_free_propname;
|
||||
}
|
||||
|
||||
propval = kmalloc(param.proplen, GFP_KERNEL);
|
||||
if (!propval) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
goto err_free_propname;
|
||||
}
|
||||
|
||||
if (set) {
|
||||
if (copy_from_user(propval, upropval, param.proplen)) {
|
||||
ret = -EFAULT;
|
||||
goto out;
|
||||
goto err_free_propval;
|
||||
}
|
||||
|
||||
param.ret = fh_partition_set_dtprop(param.handle,
|
||||
|
@ -388,7 +389,7 @@ static long ioctl_dtprop(struct fsl_hv_ioctl_prop __user *p, int set)
|
|||
if (copy_to_user(upropval, propval, param.proplen) ||
|
||||
put_user(param.proplen, &p->proplen)) {
|
||||
ret = -EFAULT;
|
||||
goto out;
|
||||
goto err_free_propval;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -396,10 +397,12 @@ static long ioctl_dtprop(struct fsl_hv_ioctl_prop __user *p, int set)
|
|||
if (put_user(param.ret, &p->ret))
|
||||
ret = -EFAULT;
|
||||
|
||||
out:
|
||||
kfree(path);
|
||||
err_free_propval:
|
||||
kfree(propval);
|
||||
err_free_propname:
|
||||
kfree(propname);
|
||||
err_free_path:
|
||||
kfree(path);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -1263,6 +1263,20 @@ static int vbg_ioctl_hgcm_disconnect(struct vbg_dev *gdev,
|
|||
return ret;
|
||||
}
|
||||
|
||||
static bool vbg_param_valid(enum vmmdev_hgcm_function_parameter_type type)
|
||||
{
|
||||
switch (type) {
|
||||
case VMMDEV_HGCM_PARM_TYPE_32BIT:
|
||||
case VMMDEV_HGCM_PARM_TYPE_64BIT:
|
||||
case VMMDEV_HGCM_PARM_TYPE_LINADDR:
|
||||
case VMMDEV_HGCM_PARM_TYPE_LINADDR_IN:
|
||||
case VMMDEV_HGCM_PARM_TYPE_LINADDR_OUT:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static int vbg_ioctl_hgcm_call(struct vbg_dev *gdev,
|
||||
struct vbg_session *session, bool f32bit,
|
||||
struct vbg_ioctl_hgcm_call *call)
|
||||
|
@ -1298,6 +1312,23 @@ static int vbg_ioctl_hgcm_call(struct vbg_dev *gdev,
|
|||
}
|
||||
call->hdr.size_out = actual_size;
|
||||
|
||||
/* Validate parameter types */
|
||||
if (f32bit) {
|
||||
struct vmmdev_hgcm_function_parameter32 *parm =
|
||||
VBG_IOCTL_HGCM_CALL_PARMS32(call);
|
||||
|
||||
for (i = 0; i < call->parm_count; i++)
|
||||
if (!vbg_param_valid(parm[i].type))
|
||||
return -EINVAL;
|
||||
} else {
|
||||
struct vmmdev_hgcm_function_parameter *parm =
|
||||
VBG_IOCTL_HGCM_CALL_PARMS(call);
|
||||
|
||||
for (i = 0; i < call->parm_count; i++)
|
||||
if (!vbg_param_valid(parm[i].type))
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Validate the client id.
|
||||
*/
|
||||
|
|
|
@ -253,6 +253,7 @@ static void afs_kill_pages(struct address_space *mapping,
|
|||
first = page->index + 1;
|
||||
lock_page(page);
|
||||
generic_error_remove_page(mapping, page);
|
||||
unlock_page(page);
|
||||
}
|
||||
|
||||
__pagevec_release(&pv);
|
||||
|
|
|
@ -650,11 +650,10 @@ static struct kernfs_node *__kernfs_new_node(struct kernfs_root *root,
|
|||
kn->id.generation = gen;
|
||||
|
||||
/*
|
||||
* set ino first. This barrier is paired with atomic_inc_not_zero in
|
||||
* set ino first. This RELEASE is paired with atomic_inc_not_zero in
|
||||
* kernfs_find_and_get_node_by_ino
|
||||
*/
|
||||
smp_mb__before_atomic();
|
||||
atomic_set(&kn->count, 1);
|
||||
atomic_set_release(&kn->count, 1);
|
||||
atomic_set(&kn->active, KN_DEACTIVATED_BIAS);
|
||||
RB_CLEAR_NODE(&kn->rb);
|
||||
|
||||
|
|
|
@ -1564,7 +1564,12 @@ efi_status_t efi_setup_gop(efi_system_table_t *sys_table_arg,
|
|||
struct screen_info *si, efi_guid_t *proto,
|
||||
unsigned long size);
|
||||
|
||||
bool efi_runtime_disabled(void);
|
||||
#ifdef CONFIG_EFI
|
||||
extern bool efi_runtime_disabled(void);
|
||||
#else
|
||||
static inline bool efi_runtime_disabled(void) { return true; }
|
||||
#endif
|
||||
|
||||
extern void efi_call_virt_check_flags(unsigned long flags, const char *call);
|
||||
|
||||
enum efi_secureboot_mode {
|
||||
|
|
|
@ -99,6 +99,7 @@ struct elevator_mq_ops {
|
|||
void (*exit_sched)(struct elevator_queue *);
|
||||
int (*init_hctx)(struct blk_mq_hw_ctx *, unsigned int);
|
||||
void (*exit_hctx)(struct blk_mq_hw_ctx *, unsigned int);
|
||||
void (*depth_updated)(struct blk_mq_hw_ctx *);
|
||||
|
||||
bool (*allow_merge)(struct request_queue *, struct request *, struct bio *);
|
||||
bool (*bio_merge)(struct blk_mq_hw_ctx *, struct bio *);
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
#include <linux/irqbypass.h>
|
||||
#include <linux/swait.h>
|
||||
#include <linux/refcount.h>
|
||||
#include <linux/nospec.h>
|
||||
#include <asm/signal.h>
|
||||
|
||||
#include <linux/kvm.h>
|
||||
|
@ -491,10 +492,10 @@ static inline struct kvm_io_bus *kvm_get_bus(struct kvm *kvm, enum kvm_bus idx)
|
|||
|
||||
static inline struct kvm_vcpu *kvm_get_vcpu(struct kvm *kvm, int i)
|
||||
{
|
||||
/* Pairs with smp_wmb() in kvm_vm_ioctl_create_vcpu, in case
|
||||
* the caller has read kvm->online_vcpus before (as is the case
|
||||
* for kvm_for_each_vcpu, for example).
|
||||
*/
|
||||
int num_vcpus = atomic_read(&kvm->online_vcpus);
|
||||
i = array_index_nospec(i, num_vcpus);
|
||||
|
||||
/* Pairs with smp_wmb() in kvm_vm_ioctl_create_vcpu. */
|
||||
smp_rmb();
|
||||
return kvm->vcpus[i];
|
||||
}
|
||||
|
@ -578,6 +579,7 @@ void kvm_put_kvm(struct kvm *kvm);
|
|||
|
||||
static inline struct kvm_memslots *__kvm_memslots(struct kvm *kvm, int as_id)
|
||||
{
|
||||
as_id = array_index_nospec(as_id, KVM_ADDRESS_SPACE_NUM);
|
||||
return srcu_dereference_check(kvm->memslots[as_id], &kvm->srcu,
|
||||
lockdep_is_held(&kvm->slots_lock) ||
|
||||
!refcount_read(&kvm->users_count));
|
||||
|
|
|
@ -313,6 +313,8 @@ struct nf_conn *nf_ct_tmpl_alloc(struct net *net,
|
|||
gfp_t flags);
|
||||
void nf_ct_tmpl_free(struct nf_conn *tmpl);
|
||||
|
||||
u32 nf_ct_get_id(const struct nf_conn *ct);
|
||||
|
||||
static inline void
|
||||
nf_ct_set(struct sk_buff *skb, struct nf_conn *ct, enum ip_conntrack_info info)
|
||||
{
|
||||
|
|
|
@ -166,7 +166,7 @@ struct nci_conn_info {
|
|||
* According to specification 102 622 chapter 4.4 Pipes,
|
||||
* the pipe identifier is 7 bits long.
|
||||
*/
|
||||
#define NCI_HCI_MAX_PIPES 127
|
||||
#define NCI_HCI_MAX_PIPES 128
|
||||
|
||||
struct nci_hci_gate {
|
||||
u8 gate;
|
||||
|
|
|
@ -568,6 +568,8 @@ asmlinkage __visible void __init start_kernel(void)
|
|||
page_alloc_init();
|
||||
|
||||
pr_notice("Kernel command line: %s\n", boot_command_line);
|
||||
/* parameters may set static keys */
|
||||
jump_label_init();
|
||||
parse_early_param();
|
||||
after_dashes = parse_args("Booting kernel",
|
||||
static_command_line, __start___param,
|
||||
|
@ -577,8 +579,6 @@ asmlinkage __visible void __init start_kernel(void)
|
|||
parse_args("Setting init args", after_dashes, NULL, 0, -1, -1,
|
||||
NULL, set_init_arg);
|
||||
|
||||
jump_label_init();
|
||||
|
||||
/*
|
||||
* These use large bootmem allocations and must precede
|
||||
* kmem_cache_init()
|
||||
|
|
11
mm/memory.c
11
mm/memory.c
|
@ -1796,10 +1796,12 @@ static int insert_pfn(struct vm_area_struct *vma, unsigned long addr,
|
|||
WARN_ON_ONCE(!is_zero_pfn(pte_pfn(*pte)));
|
||||
goto out_unlock;
|
||||
}
|
||||
entry = *pte;
|
||||
goto out_mkwrite;
|
||||
} else
|
||||
goto out_unlock;
|
||||
entry = pte_mkyoung(*pte);
|
||||
entry = maybe_mkwrite(pte_mkdirty(entry), vma);
|
||||
if (ptep_set_access_flags(vma, addr, pte, entry, 1))
|
||||
update_mmu_cache(vma, addr, pte);
|
||||
}
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
/* Ok, finally just insert the thing.. */
|
||||
|
@ -1808,7 +1810,6 @@ static int insert_pfn(struct vm_area_struct *vma, unsigned long addr,
|
|||
else
|
||||
entry = pte_mkspecial(pfn_t_pte(pfn, prot));
|
||||
|
||||
out_mkwrite:
|
||||
if (mkwrite) {
|
||||
entry = pte_mkyoung(entry);
|
||||
entry = maybe_mkwrite(pte_mkdirty(entry), vma);
|
||||
|
|
|
@ -901,6 +901,7 @@ int __ref online_pages(unsigned long pfn, unsigned long nr_pages, int online_typ
|
|||
*/
|
||||
mem = find_memory_block(__pfn_to_section(pfn));
|
||||
nid = mem->nid;
|
||||
put_device(&mem->dev);
|
||||
|
||||
/* associate pfn range with the zone */
|
||||
zone = move_pfn_range(online_type, nid, pfn, nr_pages);
|
||||
|
|
29
mm/vmscan.c
29
mm/vmscan.c
|
@ -2192,7 +2192,6 @@ static void shrink_active_list(unsigned long nr_to_scan,
|
|||
* 10TB 320 32GB
|
||||
*/
|
||||
static bool inactive_list_is_low(struct lruvec *lruvec, bool file,
|
||||
struct mem_cgroup *memcg,
|
||||
struct scan_control *sc, bool actual_reclaim)
|
||||
{
|
||||
enum lru_list active_lru = file * LRU_FILE + LRU_ACTIVE;
|
||||
|
@ -2213,16 +2212,12 @@ static bool inactive_list_is_low(struct lruvec *lruvec, bool file,
|
|||
inactive = lruvec_lru_size(lruvec, inactive_lru, sc->reclaim_idx);
|
||||
active = lruvec_lru_size(lruvec, active_lru, sc->reclaim_idx);
|
||||
|
||||
if (memcg)
|
||||
refaults = memcg_page_state(memcg, WORKINGSET_ACTIVATE);
|
||||
else
|
||||
refaults = node_page_state(pgdat, WORKINGSET_ACTIVATE);
|
||||
|
||||
/*
|
||||
* When refaults are being observed, it means a new workingset
|
||||
* is being established. Disable active list protection to get
|
||||
* rid of the stale workingset quickly.
|
||||
*/
|
||||
refaults = lruvec_page_state(lruvec, WORKINGSET_ACTIVATE);
|
||||
if (file && actual_reclaim && lruvec->refaults != refaults) {
|
||||
inactive_ratio = 0;
|
||||
} else {
|
||||
|
@ -2243,12 +2238,10 @@ static bool inactive_list_is_low(struct lruvec *lruvec, bool file,
|
|||
}
|
||||
|
||||
static unsigned long shrink_list(enum lru_list lru, unsigned long nr_to_scan,
|
||||
struct lruvec *lruvec, struct mem_cgroup *memcg,
|
||||
struct scan_control *sc)
|
||||
struct lruvec *lruvec, struct scan_control *sc)
|
||||
{
|
||||
if (is_active_lru(lru)) {
|
||||
if (inactive_list_is_low(lruvec, is_file_lru(lru),
|
||||
memcg, sc, true))
|
||||
if (inactive_list_is_low(lruvec, is_file_lru(lru), sc, true))
|
||||
shrink_active_list(nr_to_scan, lruvec, sc, lru);
|
||||
return 0;
|
||||
}
|
||||
|
@ -2348,7 +2341,7 @@ static void get_scan_count(struct lruvec *lruvec, struct mem_cgroup *memcg,
|
|||
* anonymous pages on the LRU in eligible zones.
|
||||
* Otherwise, the small LRU gets thrashed.
|
||||
*/
|
||||
if (!inactive_list_is_low(lruvec, false, memcg, sc, false) &&
|
||||
if (!inactive_list_is_low(lruvec, false, sc, false) &&
|
||||
lruvec_lru_size(lruvec, LRU_INACTIVE_ANON, sc->reclaim_idx)
|
||||
>> sc->priority) {
|
||||
scan_balance = SCAN_ANON;
|
||||
|
@ -2366,7 +2359,7 @@ static void get_scan_count(struct lruvec *lruvec, struct mem_cgroup *memcg,
|
|||
* lruvec even if it has plenty of old anonymous pages unless the
|
||||
* system is under heavy pressure.
|
||||
*/
|
||||
if (!inactive_list_is_low(lruvec, true, memcg, sc, false) &&
|
||||
if (!inactive_list_is_low(lruvec, true, sc, false) &&
|
||||
lruvec_lru_size(lruvec, LRU_INACTIVE_FILE, sc->reclaim_idx) >> sc->priority) {
|
||||
scan_balance = SCAN_FILE;
|
||||
goto out;
|
||||
|
@ -2519,7 +2512,7 @@ static void shrink_node_memcg(struct pglist_data *pgdat, struct mem_cgroup *memc
|
|||
nr[lru] -= nr_to_scan;
|
||||
|
||||
nr_reclaimed += shrink_list(lru, nr_to_scan,
|
||||
lruvec, memcg, sc);
|
||||
lruvec, sc);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2586,7 +2579,7 @@ static void shrink_node_memcg(struct pglist_data *pgdat, struct mem_cgroup *memc
|
|||
* Even if we did not try to evict anon pages at all, we want to
|
||||
* rebalance the anon lru active/inactive ratio.
|
||||
*/
|
||||
if (inactive_list_is_low(lruvec, false, memcg, sc, true))
|
||||
if (inactive_list_is_low(lruvec, false, sc, true))
|
||||
shrink_active_list(SWAP_CLUSTER_MAX, lruvec,
|
||||
sc, LRU_ACTIVE_ANON);
|
||||
}
|
||||
|
@ -2984,12 +2977,8 @@ static void snapshot_refaults(struct mem_cgroup *root_memcg, pg_data_t *pgdat)
|
|||
unsigned long refaults;
|
||||
struct lruvec *lruvec;
|
||||
|
||||
if (memcg)
|
||||
refaults = memcg_page_state(memcg, WORKINGSET_ACTIVATE);
|
||||
else
|
||||
refaults = node_page_state(pgdat, WORKINGSET_ACTIVATE);
|
||||
|
||||
lruvec = mem_cgroup_lruvec(pgdat, memcg);
|
||||
refaults = lruvec_page_state(lruvec, WORKINGSET_ACTIVATE);
|
||||
lruvec->refaults = refaults;
|
||||
} while ((memcg = mem_cgroup_iter(root_memcg, memcg, NULL)));
|
||||
}
|
||||
|
@ -3351,7 +3340,7 @@ static void age_active_anon(struct pglist_data *pgdat,
|
|||
do {
|
||||
struct lruvec *lruvec = mem_cgroup_lruvec(pgdat, memcg);
|
||||
|
||||
if (inactive_list_is_low(lruvec, false, memcg, sc, true))
|
||||
if (inactive_list_is_low(lruvec, false, sc, true))
|
||||
shrink_active_list(SWAP_CLUSTER_MAX, lruvec,
|
||||
sc, LRU_ACTIVE_ANON);
|
||||
|
||||
|
|
|
@ -368,10 +368,12 @@ static int vlan_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
|||
ifrr.ifr_ifru = ifr->ifr_ifru;
|
||||
|
||||
switch (cmd) {
|
||||
case SIOCSHWTSTAMP:
|
||||
if (!net_eq(dev_net(dev), &init_net))
|
||||
break;
|
||||
case SIOCGMIIPHY:
|
||||
case SIOCGMIIREG:
|
||||
case SIOCSMIIREG:
|
||||
case SIOCSHWTSTAMP:
|
||||
case SIOCGHWTSTAMP:
|
||||
if (netif_device_present(real_dev) && ops->ndo_do_ioctl)
|
||||
err = ops->ndo_do_ioctl(real_dev, &ifrr, cmd);
|
||||
|
|
|
@ -603,13 +603,15 @@ int br_add_if(struct net_bridge *br, struct net_device *dev,
|
|||
call_netdevice_notifiers(NETDEV_JOIN, dev);
|
||||
|
||||
err = dev_set_allmulti(dev, 1);
|
||||
if (err)
|
||||
goto put_back;
|
||||
if (err) {
|
||||
kfree(p); /* kobject not yet init'd, manually free */
|
||||
goto err1;
|
||||
}
|
||||
|
||||
err = kobject_init_and_add(&p->kobj, &brport_ktype, &(dev->dev.kobj),
|
||||
SYSFS_BRIDGE_PORT_ATTR);
|
||||
if (err)
|
||||
goto err1;
|
||||
goto err2;
|
||||
|
||||
err = br_sysfs_addif(p);
|
||||
if (err)
|
||||
|
@ -692,12 +694,9 @@ int br_add_if(struct net_bridge *br, struct net_device *dev,
|
|||
sysfs_remove_link(br->ifobj, p->dev->name);
|
||||
err2:
|
||||
kobject_put(&p->kobj);
|
||||
p = NULL; /* kobject_put frees */
|
||||
err1:
|
||||
dev_set_allmulti(dev, -1);
|
||||
put_back:
|
||||
err1:
|
||||
dev_put(dev);
|
||||
kfree(p);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
@ -756,9 +756,9 @@ int fib_nl_newrule(struct sk_buff *skb, struct nlmsghdr *nlh,
|
|||
if (err)
|
||||
goto errout;
|
||||
|
||||
if ((nlh->nlmsg_flags & NLM_F_EXCL) &&
|
||||
rule_exists(ops, frh, tb, rule)) {
|
||||
err = -EEXIST;
|
||||
if (rule_exists(ops, frh, tb, rule)) {
|
||||
if (nlh->nlmsg_flags & NLM_F_EXCL)
|
||||
err = -EEXIST;
|
||||
goto errout_free;
|
||||
}
|
||||
|
||||
|
|
|
@ -293,15 +293,22 @@ static int __init dsa_init_module(void)
|
|||
|
||||
rc = dsa_slave_register_notifier();
|
||||
if (rc)
|
||||
return rc;
|
||||
goto register_notifier_fail;
|
||||
|
||||
rc = dsa_legacy_register();
|
||||
if (rc)
|
||||
return rc;
|
||||
goto legacy_register_fail;
|
||||
|
||||
dev_add_pack(&dsa_pack_type);
|
||||
|
||||
return 0;
|
||||
|
||||
legacy_register_fail:
|
||||
dsa_slave_unregister_notifier();
|
||||
register_notifier_fail:
|
||||
destroy_workqueue(dsa_owq);
|
||||
|
||||
return rc;
|
||||
}
|
||||
module_init(dsa_init_module);
|
||||
|
||||
|
|
|
@ -174,6 +174,7 @@ static int icmp_filter(const struct sock *sk, const struct sk_buff *skb)
|
|||
static int raw_v4_input(struct sk_buff *skb, const struct iphdr *iph, int hash)
|
||||
{
|
||||
int sdif = inet_sdif(skb);
|
||||
int dif = inet_iif(skb);
|
||||
struct sock *sk;
|
||||
struct hlist_head *head;
|
||||
int delivered = 0;
|
||||
|
@ -186,8 +187,7 @@ static int raw_v4_input(struct sk_buff *skb, const struct iphdr *iph, int hash)
|
|||
|
||||
net = dev_net(skb->dev);
|
||||
sk = __raw_v4_lookup(net, __sk_head(head), iph->protocol,
|
||||
iph->saddr, iph->daddr,
|
||||
skb->dev->ifindex, sdif);
|
||||
iph->saddr, iph->daddr, dif, sdif);
|
||||
|
||||
while (sk) {
|
||||
delivered = 1;
|
||||
|
|
|
@ -1084,7 +1084,7 @@ static void ipip6_tunnel_bind_dev(struct net_device *dev)
|
|||
if (!tdev && tunnel->parms.link)
|
||||
tdev = __dev_get_by_index(tunnel->net, tunnel->parms.link);
|
||||
|
||||
if (tdev) {
|
||||
if (tdev && !netif_is_l3_master(tdev)) {
|
||||
int t_hlen = tunnel->hlen + sizeof(struct iphdr);
|
||||
|
||||
dev->hard_header_len = tdev->hard_header_len + sizeof(struct iphdr);
|
||||
|
|
|
@ -23,7 +23,7 @@ static void mesh_path_free_rcu(struct mesh_table *tbl, struct mesh_path *mpath);
|
|||
static u32 mesh_table_hash(const void *addr, u32 len, u32 seed)
|
||||
{
|
||||
/* Use last four bytes of hw addr as hash index */
|
||||
return jhash_1word(*(u32 *)(addr+2), seed);
|
||||
return jhash_1word(__get_unaligned_cpu32((u8 *)addr + 2), seed);
|
||||
}
|
||||
|
||||
static const struct rhashtable_params mesh_rht_params = {
|
||||
|
|
|
@ -1,4 +1,9 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Portions of this file
|
||||
* Copyright (C) 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_MAC80211_MESSAGE_TRACING
|
||||
|
||||
#if !defined(__MAC80211_MSG_DRIVER_TRACE) || defined(TRACE_HEADER_MULTI_READ)
|
||||
|
@ -11,7 +16,7 @@
|
|||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM mac80211_msg
|
||||
|
||||
#define MAX_MSG_LEN 100
|
||||
#define MAX_MSG_LEN 120
|
||||
|
||||
DECLARE_EVENT_CLASS(mac80211_msg_event,
|
||||
TP_PROTO(struct va_format *vaf),
|
||||
|
|
|
@ -3185,6 +3185,7 @@ static bool ieee80211_amsdu_aggregate(struct ieee80211_sub_if_data *sdata,
|
|||
u8 max_subframes = sta->sta.max_amsdu_subframes;
|
||||
int max_frags = local->hw.max_tx_fragments;
|
||||
int max_amsdu_len = sta->sta.max_amsdu_len;
|
||||
int orig_truesize;
|
||||
__be16 len;
|
||||
void *data;
|
||||
bool ret = false;
|
||||
|
@ -3218,6 +3219,7 @@ static bool ieee80211_amsdu_aggregate(struct ieee80211_sub_if_data *sdata,
|
|||
if (!head)
|
||||
goto out;
|
||||
|
||||
orig_truesize = head->truesize;
|
||||
orig_len = head->len;
|
||||
|
||||
if (skb->len + head->len > max_amsdu_len)
|
||||
|
@ -3272,6 +3274,7 @@ static bool ieee80211_amsdu_aggregate(struct ieee80211_sub_if_data *sdata,
|
|||
*frag_tail = skb;
|
||||
|
||||
out_recalc:
|
||||
fq->memory_usage += head->truesize - orig_truesize;
|
||||
if (head->len != orig_len) {
|
||||
flow->backlog += head->len - orig_len;
|
||||
tin->backlog_bytes += head->len - orig_len;
|
||||
|
|
|
@ -1647,7 +1647,7 @@ ip_vs_in_icmp(struct netns_ipvs *ipvs, struct sk_buff *skb, int *related,
|
|||
if (!cp) {
|
||||
int v;
|
||||
|
||||
if (!sysctl_schedule_icmp(ipvs))
|
||||
if (ipip || !sysctl_schedule_icmp(ipvs))
|
||||
return NF_ACCEPT;
|
||||
|
||||
if (!ip_vs_try_to_schedule(ipvs, AF_INET, skb, pd, &v, &cp, &ciph))
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#include <linux/slab.h>
|
||||
#include <linux/random.h>
|
||||
#include <linux/jhash.h>
|
||||
#include <linux/siphash.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/percpu.h>
|
||||
#include <linux/moduleparam.h>
|
||||
|
@ -424,6 +425,40 @@ nf_ct_invert_tuple(struct nf_conntrack_tuple *inverse,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(nf_ct_invert_tuple);
|
||||
|
||||
/* Generate a almost-unique pseudo-id for a given conntrack.
|
||||
*
|
||||
* intentionally doesn't re-use any of the seeds used for hash
|
||||
* table location, we assume id gets exposed to userspace.
|
||||
*
|
||||
* Following nf_conn items do not change throughout lifetime
|
||||
* of the nf_conn after it has been committed to main hash table:
|
||||
*
|
||||
* 1. nf_conn address
|
||||
* 2. nf_conn->ext address
|
||||
* 3. nf_conn->master address (normally NULL)
|
||||
* 4. tuple
|
||||
* 5. the associated net namespace
|
||||
*/
|
||||
u32 nf_ct_get_id(const struct nf_conn *ct)
|
||||
{
|
||||
static __read_mostly siphash_key_t ct_id_seed;
|
||||
unsigned long a, b, c, d;
|
||||
|
||||
net_get_random_once(&ct_id_seed, sizeof(ct_id_seed));
|
||||
|
||||
a = (unsigned long)ct;
|
||||
b = (unsigned long)ct->master ^ net_hash_mix(nf_ct_net(ct));
|
||||
c = (unsigned long)ct->ext;
|
||||
d = (unsigned long)siphash(&ct->tuplehash, sizeof(ct->tuplehash),
|
||||
&ct_id_seed);
|
||||
#ifdef CONFIG_64BIT
|
||||
return siphash_4u64((u64)a, (u64)b, (u64)c, (u64)d, &ct_id_seed);
|
||||
#else
|
||||
return siphash_4u32((u32)a, (u32)b, (u32)c, (u32)d, &ct_id_seed);
|
||||
#endif
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nf_ct_get_id);
|
||||
|
||||
static void
|
||||
clean_from_lists(struct nf_conn *ct)
|
||||
{
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue