Merge 5.4.149 into android11-5.4-lts
Changes in 5.4.149 PCI: pci-bridge-emul: Fix big-endian support PCI: aardvark: Indicate error in 'val' when config read fails PCI: pci-bridge-emul: Add PCIe Root Capabilities Register PCI: aardvark: Fix reporting CRS value PCI/ACPI: Add Ampere Altra SOC MCFG quirk KVM: remember position in kvm->vcpus array console: consume APC, DM, DCS s390/pci_mmio: fully validate the VMA before calling follow_pte() ARM: Qualify enabling of swiotlb_init() apparmor: remove duplicate macro list_entry_is_head() ARM: 9077/1: PLT: Move struct plt_entries definition to header ARM: 9078/1: Add warn suppress parameter to arm_gen_branch_link() ARM: 9079/1: ftrace: Add MODULE_PLTS support ARM: 9098/1: ftrace: MODULE_PLT: Fix build problem without DYNAMIC_FTRACE sctp: validate chunk size in __rcv_asconf_lookup sctp: add param size validation for SCTP_PARAM_SET_PRIMARY staging: rtl8192u: Fix bitwise vs logical operator in TranslateRxSignalStuff819xUsb() um: virtio_uml: fix memory leak on init failures dmaengine: acpi: Avoid comparison GSI with Linux vIRQ thermal/drivers/exynos: Fix an error code in exynos_tmu_probe() 9p/trans_virtio: Remove sysfs file on probe failure prctl: allow to setup brk for et_dyn executables nilfs2: use refcount_dec_and_lock() to fix potential UAF profiling: fix shift-out-of-bounds bugs pwm: lpc32xx: Don't modify HW state in .probe() after the PWM chip was registered phy: avoid unnecessary link-up delay in polling mode net: stmmac: reset Tx desc base address before restarting Tx Kconfig.debug: drop selecting non-existing HARDLOCKUP_DETECTOR_ARCH thermal/core: Fix thermal_cooling_device_register() prototype drivers: base: cacheinfo: Get rid of DEFINE_SMP_CALL_CACHE_FUNCTION() parisc: Move pci_dev_is_behind_card_dino to where it is used dmaengine: sprd: Add missing MODULE_DEVICE_TABLE dmaengine: ioat: depends on !UML dmaengine: xilinx_dma: Set DMA mask for coherent APIs ceph: request Fw caps before updating the mtime in ceph_write_iter ceph: lockdep annotations for try_nonblocking_invalidate btrfs: fix lockdep warning while mounting sprout fs nilfs2: fix memory leak in nilfs_sysfs_create_device_group nilfs2: fix NULL pointer in nilfs_##name##_attr_release nilfs2: fix memory leak in nilfs_sysfs_create_##name##_group nilfs2: fix memory leak in nilfs_sysfs_delete_##name##_group nilfs2: fix memory leak in nilfs_sysfs_create_snapshot_group nilfs2: fix memory leak in nilfs_sysfs_delete_snapshot_group pwm: img: Don't modify HW state in .remove() callback pwm: rockchip: Don't modify HW state in .remove() callback pwm: stm32-lp: Don't modify HW state in .remove() callback blk-throttle: fix UAF by deleteing timer in blk_throtl_exit() rtc: rx8010: select REGMAP_I2C drm/nouveau/nvkm: Replace -ENOSYS with -ENODEV Linux 5.4.149 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: Ic55297fb43e33c9ff518898479a7313aafeb9375
This commit is contained in:
commit
2abce4ec2a
2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 4
|
||||
SUBLEVEL = 148
|
||||
SUBLEVEL = 149
|
||||
EXTRAVERSION =
|
||||
NAME = Kleptomaniac Octopus
|
||||
|
||||
|
@ -16,6 +16,9 @@ extern void __gnu_mcount_nc(void);
|
||||
|
||||
#ifdef CONFIG_DYNAMIC_FTRACE
|
||||
struct dyn_arch_ftrace {
|
||||
#ifdef CONFIG_ARM_MODULE_PLTS
|
||||
struct module *mod;
|
||||
#endif
|
||||
};
|
||||
|
||||
static inline unsigned long ftrace_call_adjust(unsigned long addr)
|
||||
|
@ -13,18 +13,18 @@ arm_gen_nop(void)
|
||||
}
|
||||
|
||||
unsigned long
|
||||
__arm_gen_branch(unsigned long pc, unsigned long addr, bool link);
|
||||
__arm_gen_branch(unsigned long pc, unsigned long addr, bool link, bool warn);
|
||||
|
||||
static inline unsigned long
|
||||
arm_gen_branch(unsigned long pc, unsigned long addr)
|
||||
{
|
||||
return __arm_gen_branch(pc, addr, false);
|
||||
return __arm_gen_branch(pc, addr, false, true);
|
||||
}
|
||||
|
||||
static inline unsigned long
|
||||
arm_gen_branch_link(unsigned long pc, unsigned long addr)
|
||||
arm_gen_branch_link(unsigned long pc, unsigned long addr, bool warn)
|
||||
{
|
||||
return __arm_gen_branch(pc, addr, true);
|
||||
return __arm_gen_branch(pc, addr, true, warn);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -19,8 +19,18 @@ enum {
|
||||
};
|
||||
#endif
|
||||
|
||||
#define PLT_ENT_STRIDE L1_CACHE_BYTES
|
||||
#define PLT_ENT_COUNT (PLT_ENT_STRIDE / sizeof(u32))
|
||||
#define PLT_ENT_SIZE (sizeof(struct plt_entries) / PLT_ENT_COUNT)
|
||||
|
||||
struct plt_entries {
|
||||
u32 ldr[PLT_ENT_COUNT];
|
||||
u32 lit[PLT_ENT_COUNT];
|
||||
};
|
||||
|
||||
struct mod_plt_sec {
|
||||
struct elf32_shdr *plt;
|
||||
struct plt_entries *plt_ent;
|
||||
int plt_count;
|
||||
};
|
||||
|
||||
|
@ -71,9 +71,10 @@ int ftrace_arch_code_modify_post_process(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static unsigned long ftrace_call_replace(unsigned long pc, unsigned long addr)
|
||||
static unsigned long ftrace_call_replace(unsigned long pc, unsigned long addr,
|
||||
bool warn)
|
||||
{
|
||||
return arm_gen_branch_link(pc, addr);
|
||||
return arm_gen_branch_link(pc, addr, warn);
|
||||
}
|
||||
|
||||
static int ftrace_modify_code(unsigned long pc, unsigned long old,
|
||||
@ -112,14 +113,14 @@ int ftrace_update_ftrace_func(ftrace_func_t func)
|
||||
int ret;
|
||||
|
||||
pc = (unsigned long)&ftrace_call;
|
||||
new = ftrace_call_replace(pc, (unsigned long)func);
|
||||
new = ftrace_call_replace(pc, (unsigned long)func, true);
|
||||
|
||||
ret = ftrace_modify_code(pc, 0, new, false);
|
||||
|
||||
#ifdef CONFIG_DYNAMIC_FTRACE_WITH_REGS
|
||||
if (!ret) {
|
||||
pc = (unsigned long)&ftrace_regs_call;
|
||||
new = ftrace_call_replace(pc, (unsigned long)func);
|
||||
new = ftrace_call_replace(pc, (unsigned long)func, true);
|
||||
|
||||
ret = ftrace_modify_code(pc, 0, new, false);
|
||||
}
|
||||
@ -132,10 +133,22 @@ int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr)
|
||||
{
|
||||
unsigned long new, old;
|
||||
unsigned long ip = rec->ip;
|
||||
unsigned long aaddr = adjust_address(rec, addr);
|
||||
struct module *mod = NULL;
|
||||
|
||||
#ifdef CONFIG_ARM_MODULE_PLTS
|
||||
mod = rec->arch.mod;
|
||||
#endif
|
||||
|
||||
old = ftrace_nop_replace(rec);
|
||||
|
||||
new = ftrace_call_replace(ip, adjust_address(rec, addr));
|
||||
new = ftrace_call_replace(ip, aaddr, !mod);
|
||||
#ifdef CONFIG_ARM_MODULE_PLTS
|
||||
if (!new && mod) {
|
||||
aaddr = get_module_plt(mod, ip, aaddr);
|
||||
new = ftrace_call_replace(ip, aaddr, true);
|
||||
}
|
||||
#endif
|
||||
|
||||
return ftrace_modify_code(rec->ip, old, new, true);
|
||||
}
|
||||
@ -148,9 +161,9 @@ int ftrace_modify_call(struct dyn_ftrace *rec, unsigned long old_addr,
|
||||
unsigned long new, old;
|
||||
unsigned long ip = rec->ip;
|
||||
|
||||
old = ftrace_call_replace(ip, adjust_address(rec, old_addr));
|
||||
old = ftrace_call_replace(ip, adjust_address(rec, old_addr), true);
|
||||
|
||||
new = ftrace_call_replace(ip, adjust_address(rec, addr));
|
||||
new = ftrace_call_replace(ip, adjust_address(rec, addr), true);
|
||||
|
||||
return ftrace_modify_code(rec->ip, old, new, true);
|
||||
}
|
||||
@ -160,12 +173,29 @@ int ftrace_modify_call(struct dyn_ftrace *rec, unsigned long old_addr,
|
||||
int ftrace_make_nop(struct module *mod,
|
||||
struct dyn_ftrace *rec, unsigned long addr)
|
||||
{
|
||||
unsigned long aaddr = adjust_address(rec, addr);
|
||||
unsigned long ip = rec->ip;
|
||||
unsigned long old;
|
||||
unsigned long new;
|
||||
int ret;
|
||||
|
||||
old = ftrace_call_replace(ip, adjust_address(rec, addr));
|
||||
#ifdef CONFIG_ARM_MODULE_PLTS
|
||||
/* mod is only supplied during module loading */
|
||||
if (!mod)
|
||||
mod = rec->arch.mod;
|
||||
else
|
||||
rec->arch.mod = mod;
|
||||
#endif
|
||||
|
||||
old = ftrace_call_replace(ip, aaddr,
|
||||
!IS_ENABLED(CONFIG_ARM_MODULE_PLTS) || !mod);
|
||||
#ifdef CONFIG_ARM_MODULE_PLTS
|
||||
if (!old && mod) {
|
||||
aaddr = get_module_plt(mod, ip, aaddr);
|
||||
old = ftrace_call_replace(ip, aaddr, true);
|
||||
}
|
||||
#endif
|
||||
|
||||
new = ftrace_nop_replace(rec);
|
||||
ret = ftrace_modify_code(ip, old, new, true);
|
||||
|
||||
|
@ -3,8 +3,9 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <asm/opcodes.h>
|
||||
|
||||
static unsigned long
|
||||
__arm_gen_branch_thumb2(unsigned long pc, unsigned long addr, bool link)
|
||||
static unsigned long __arm_gen_branch_thumb2(unsigned long pc,
|
||||
unsigned long addr, bool link,
|
||||
bool warn)
|
||||
{
|
||||
unsigned long s, j1, j2, i1, i2, imm10, imm11;
|
||||
unsigned long first, second;
|
||||
@ -12,7 +13,7 @@ __arm_gen_branch_thumb2(unsigned long pc, unsigned long addr, bool link)
|
||||
|
||||
offset = (long)addr - (long)(pc + 4);
|
||||
if (offset < -16777216 || offset > 16777214) {
|
||||
WARN_ON_ONCE(1);
|
||||
WARN_ON_ONCE(warn);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -33,8 +34,8 @@ __arm_gen_branch_thumb2(unsigned long pc, unsigned long addr, bool link)
|
||||
return __opcode_thumb32_compose(first, second);
|
||||
}
|
||||
|
||||
static unsigned long
|
||||
__arm_gen_branch_arm(unsigned long pc, unsigned long addr, bool link)
|
||||
static unsigned long __arm_gen_branch_arm(unsigned long pc, unsigned long addr,
|
||||
bool link, bool warn)
|
||||
{
|
||||
unsigned long opcode = 0xea000000;
|
||||
long offset;
|
||||
@ -44,7 +45,7 @@ __arm_gen_branch_arm(unsigned long pc, unsigned long addr, bool link)
|
||||
|
||||
offset = (long)addr - (long)(pc + 8);
|
||||
if (unlikely(offset < -33554432 || offset > 33554428)) {
|
||||
WARN_ON_ONCE(1);
|
||||
WARN_ON_ONCE(warn);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -54,10 +55,10 @@ __arm_gen_branch_arm(unsigned long pc, unsigned long addr, bool link)
|
||||
}
|
||||
|
||||
unsigned long
|
||||
__arm_gen_branch(unsigned long pc, unsigned long addr, bool link)
|
||||
__arm_gen_branch(unsigned long pc, unsigned long addr, bool link, bool warn)
|
||||
{
|
||||
if (IS_ENABLED(CONFIG_THUMB2_KERNEL))
|
||||
return __arm_gen_branch_thumb2(pc, addr, link);
|
||||
return __arm_gen_branch_thumb2(pc, addr, link, warn);
|
||||
else
|
||||
return __arm_gen_branch_arm(pc, addr, link);
|
||||
return __arm_gen_branch_arm(pc, addr, link, warn);
|
||||
}
|
||||
|
@ -4,6 +4,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/elf.h>
|
||||
#include <linux/ftrace.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/sort.h>
|
||||
@ -11,10 +12,6 @@
|
||||
#include <asm/cache.h>
|
||||
#include <asm/opcodes.h>
|
||||
|
||||
#define PLT_ENT_STRIDE L1_CACHE_BYTES
|
||||
#define PLT_ENT_COUNT (PLT_ENT_STRIDE / sizeof(u32))
|
||||
#define PLT_ENT_SIZE (sizeof(struct plt_entries) / PLT_ENT_COUNT)
|
||||
|
||||
#ifdef CONFIG_THUMB2_KERNEL
|
||||
#define PLT_ENT_LDR __opcode_to_mem_thumb32(0xf8dff000 | \
|
||||
(PLT_ENT_STRIDE - 4))
|
||||
@ -23,9 +20,11 @@
|
||||
(PLT_ENT_STRIDE - 8))
|
||||
#endif
|
||||
|
||||
struct plt_entries {
|
||||
u32 ldr[PLT_ENT_COUNT];
|
||||
u32 lit[PLT_ENT_COUNT];
|
||||
static const u32 fixed_plts[] = {
|
||||
#ifdef CONFIG_DYNAMIC_FTRACE
|
||||
FTRACE_ADDR,
|
||||
MCOUNT_ADDR,
|
||||
#endif
|
||||
};
|
||||
|
||||
static bool in_init(const struct module *mod, unsigned long loc)
|
||||
@ -33,14 +32,40 @@ static bool in_init(const struct module *mod, unsigned long loc)
|
||||
return loc - (u32)mod->init_layout.base < mod->init_layout.size;
|
||||
}
|
||||
|
||||
static void prealloc_fixed(struct mod_plt_sec *pltsec, struct plt_entries *plt)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!ARRAY_SIZE(fixed_plts) || pltsec->plt_count)
|
||||
return;
|
||||
pltsec->plt_count = ARRAY_SIZE(fixed_plts);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(plt->ldr); ++i)
|
||||
plt->ldr[i] = PLT_ENT_LDR;
|
||||
|
||||
BUILD_BUG_ON(sizeof(fixed_plts) > sizeof(plt->lit));
|
||||
memcpy(plt->lit, fixed_plts, sizeof(fixed_plts));
|
||||
}
|
||||
|
||||
u32 get_module_plt(struct module *mod, unsigned long loc, Elf32_Addr val)
|
||||
{
|
||||
struct mod_plt_sec *pltsec = !in_init(mod, loc) ? &mod->arch.core :
|
||||
&mod->arch.init;
|
||||
struct plt_entries *plt;
|
||||
int idx;
|
||||
|
||||
struct plt_entries *plt = (struct plt_entries *)pltsec->plt->sh_addr;
|
||||
int idx = 0;
|
||||
/* cache the address, ELF header is available only during module load */
|
||||
if (!pltsec->plt_ent)
|
||||
pltsec->plt_ent = (struct plt_entries *)pltsec->plt->sh_addr;
|
||||
plt = pltsec->plt_ent;
|
||||
|
||||
prealloc_fixed(pltsec, plt);
|
||||
|
||||
for (idx = 0; idx < ARRAY_SIZE(fixed_plts); ++idx)
|
||||
if (plt->lit[idx] == val)
|
||||
return (u32)&plt->ldr[idx];
|
||||
|
||||
idx = 0;
|
||||
/*
|
||||
* Look for an existing entry pointing to 'val'. Given that the
|
||||
* relocations are sorted, this will be the last entry we allocated.
|
||||
@ -188,8 +213,8 @@ static unsigned int count_plts(const Elf32_Sym *syms, Elf32_Addr base,
|
||||
int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *sechdrs,
|
||||
char *secstrings, struct module *mod)
|
||||
{
|
||||
unsigned long core_plts = 0;
|
||||
unsigned long init_plts = 0;
|
||||
unsigned long core_plts = ARRAY_SIZE(fixed_plts);
|
||||
unsigned long init_plts = ARRAY_SIZE(fixed_plts);
|
||||
Elf32_Shdr *s, *sechdrs_end = sechdrs + ehdr->e_shnum;
|
||||
Elf32_Sym *syms = NULL;
|
||||
|
||||
@ -244,6 +269,7 @@ int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *sechdrs,
|
||||
mod->arch.core.plt->sh_size = round_up(core_plts * PLT_ENT_SIZE,
|
||||
sizeof(struct plt_entries));
|
||||
mod->arch.core.plt_count = 0;
|
||||
mod->arch.core.plt_ent = NULL;
|
||||
|
||||
mod->arch.init.plt->sh_type = SHT_NOBITS;
|
||||
mod->arch.init.plt->sh_flags = SHF_EXECINSTR | SHF_ALLOC;
|
||||
@ -251,6 +277,7 @@ int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *sechdrs,
|
||||
mod->arch.init.plt->sh_size = round_up(init_plts * PLT_ENT_SIZE,
|
||||
sizeof(struct plt_entries));
|
||||
mod->arch.init.plt_count = 0;
|
||||
mod->arch.init.plt_ent = NULL;
|
||||
|
||||
pr_debug("%s: plt=%x, init.plt=%x\n", __func__,
|
||||
mod->arch.core.plt->sh_size, mod->arch.init.plt->sh_size);
|
||||
|
@ -469,7 +469,11 @@ static void __init free_highpages(void)
|
||||
void __init mem_init(void)
|
||||
{
|
||||
#ifdef CONFIG_ARM_LPAE
|
||||
swiotlb_init(1);
|
||||
if (swiotlb_force == SWIOTLB_FORCE ||
|
||||
max_pfn > arm_dma_pfn_limit)
|
||||
swiotlb_init(1);
|
||||
else
|
||||
swiotlb_force = SWIOTLB_NO_FORCE;
|
||||
#endif
|
||||
|
||||
set_max_mapnr(pfn_to_page(max_pfn) - mem_map);
|
||||
|
@ -43,7 +43,7 @@ static void ci_leaf_init(struct cacheinfo *this_leaf,
|
||||
this_leaf->type = type;
|
||||
}
|
||||
|
||||
static int __init_cache_level(unsigned int cpu)
|
||||
int init_cache_level(unsigned int cpu)
|
||||
{
|
||||
unsigned int ctype, level, leaves, fw_level;
|
||||
struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu);
|
||||
@ -78,7 +78,7 @@ static int __init_cache_level(unsigned int cpu)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __populate_cache_leaves(unsigned int cpu)
|
||||
int populate_cache_leaves(unsigned int cpu)
|
||||
{
|
||||
unsigned int level, idx;
|
||||
enum cache_type type;
|
||||
@ -97,6 +97,3 @@ static int __populate_cache_leaves(unsigned int cpu)
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
DEFINE_SMP_CALL_CACHE_FUNCTION(init_cache_level)
|
||||
DEFINE_SMP_CALL_CACHE_FUNCTION(populate_cache_leaves)
|
||||
|
@ -17,7 +17,7 @@ do { \
|
||||
leaf++; \
|
||||
} while (0)
|
||||
|
||||
static int __init_cache_level(unsigned int cpu)
|
||||
int init_cache_level(unsigned int cpu)
|
||||
{
|
||||
struct cpuinfo_mips *c = ¤t_cpu_data;
|
||||
struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu);
|
||||
@ -69,7 +69,7 @@ static void fill_cpumask_cluster(int cpu, cpumask_t *cpu_map)
|
||||
cpumask_set_cpu(cpu1, cpu_map);
|
||||
}
|
||||
|
||||
static int __populate_cache_leaves(unsigned int cpu)
|
||||
int populate_cache_leaves(unsigned int cpu)
|
||||
{
|
||||
struct cpuinfo_mips *c = ¤t_cpu_data;
|
||||
struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu);
|
||||
@ -98,6 +98,3 @@ static int __populate_cache_leaves(unsigned int cpu)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
DEFINE_SMP_CALL_CACHE_FUNCTION(init_cache_level)
|
||||
DEFINE_SMP_CALL_CACHE_FUNCTION(populate_cache_leaves)
|
||||
|
@ -16,7 +16,7 @@ static void ci_leaf_init(struct cacheinfo *this_leaf,
|
||||
this_leaf->type = type;
|
||||
}
|
||||
|
||||
static int __init_cache_level(unsigned int cpu)
|
||||
int init_cache_level(unsigned int cpu)
|
||||
{
|
||||
struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu);
|
||||
struct device_node *np = of_cpu_device_node_get(cpu);
|
||||
@ -58,7 +58,7 @@ static int __init_cache_level(unsigned int cpu)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __populate_cache_leaves(unsigned int cpu)
|
||||
int populate_cache_leaves(unsigned int cpu)
|
||||
{
|
||||
struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu);
|
||||
struct cacheinfo *this_leaf = this_cpu_ci->info_list;
|
||||
@ -95,6 +95,3 @@ static int __populate_cache_leaves(unsigned int cpu)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
DEFINE_SMP_CALL_CACHE_FUNCTION(init_cache_level)
|
||||
DEFINE_SMP_CALL_CACHE_FUNCTION(populate_cache_leaves)
|
||||
|
@ -128,7 +128,7 @@ static long get_pfn(unsigned long user_addr, unsigned long access,
|
||||
down_read(¤t->mm->mmap_sem);
|
||||
ret = -EINVAL;
|
||||
vma = find_vma(current->mm, user_addr);
|
||||
if (!vma)
|
||||
if (!vma || user_addr < vma->vm_start)
|
||||
goto out;
|
||||
ret = -EACCES;
|
||||
if (!(vma->vm_flags & access))
|
||||
|
@ -994,7 +994,7 @@ static int virtio_uml_probe(struct platform_device *pdev)
|
||||
rc = os_connect_socket(pdata->socket_path);
|
||||
} while (rc == -EINTR);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
goto error_free;
|
||||
vu_dev->sock = rc;
|
||||
|
||||
rc = vhost_user_init(vu_dev);
|
||||
@ -1010,6 +1010,8 @@ static int virtio_uml_probe(struct platform_device *pdev)
|
||||
|
||||
error_init:
|
||||
os_close_file(vu_dev->sock);
|
||||
error_free:
|
||||
kfree(vu_dev);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -985,7 +985,7 @@ static void ci_leaf_init(struct cacheinfo *this_leaf,
|
||||
this_leaf->priv = base->nb;
|
||||
}
|
||||
|
||||
static int __init_cache_level(unsigned int cpu)
|
||||
int init_cache_level(unsigned int cpu)
|
||||
{
|
||||
struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu);
|
||||
|
||||
@ -1014,7 +1014,7 @@ static void get_cache_id(int cpu, struct _cpuid4_info_regs *id4_regs)
|
||||
id4_regs->id = c->apicid >> index_msb;
|
||||
}
|
||||
|
||||
static int __populate_cache_leaves(unsigned int cpu)
|
||||
int populate_cache_leaves(unsigned int cpu)
|
||||
{
|
||||
unsigned int idx, ret;
|
||||
struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu);
|
||||
@ -1033,6 +1033,3 @@ static int __populate_cache_leaves(unsigned int cpu)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
DEFINE_SMP_CALL_CACHE_FUNCTION(init_cache_level)
|
||||
DEFINE_SMP_CALL_CACHE_FUNCTION(populate_cache_leaves)
|
||||
|
@ -2414,6 +2414,7 @@ int blk_throtl_init(struct request_queue *q)
|
||||
void blk_throtl_exit(struct request_queue *q)
|
||||
{
|
||||
BUG_ON(!q->td);
|
||||
del_timer_sync(&q->td->service_queue.pending_timer);
|
||||
throtl_shutdown_wq(q);
|
||||
blkcg_deactivate_policy(q, &blkcg_policy_throtl);
|
||||
free_percpu(q->td->latency_buckets[READ]);
|
||||
|
@ -142,6 +142,26 @@ static struct mcfg_fixup mcfg_quirks[] = {
|
||||
XGENE_V2_ECAM_MCFG(4, 0),
|
||||
XGENE_V2_ECAM_MCFG(4, 1),
|
||||
XGENE_V2_ECAM_MCFG(4, 2),
|
||||
|
||||
#define ALTRA_ECAM_QUIRK(rev, seg) \
|
||||
{ "Ampere", "Altra ", rev, seg, MCFG_BUS_ANY, &pci_32b_read_ops }
|
||||
|
||||
ALTRA_ECAM_QUIRK(1, 0),
|
||||
ALTRA_ECAM_QUIRK(1, 1),
|
||||
ALTRA_ECAM_QUIRK(1, 2),
|
||||
ALTRA_ECAM_QUIRK(1, 3),
|
||||
ALTRA_ECAM_QUIRK(1, 4),
|
||||
ALTRA_ECAM_QUIRK(1, 5),
|
||||
ALTRA_ECAM_QUIRK(1, 6),
|
||||
ALTRA_ECAM_QUIRK(1, 7),
|
||||
ALTRA_ECAM_QUIRK(1, 8),
|
||||
ALTRA_ECAM_QUIRK(1, 9),
|
||||
ALTRA_ECAM_QUIRK(1, 10),
|
||||
ALTRA_ECAM_QUIRK(1, 11),
|
||||
ALTRA_ECAM_QUIRK(1, 12),
|
||||
ALTRA_ECAM_QUIRK(1, 13),
|
||||
ALTRA_ECAM_QUIRK(1, 14),
|
||||
ALTRA_ECAM_QUIRK(1, 15),
|
||||
};
|
||||
|
||||
static char mcfg_oem_id[ACPI_OEM_ID_SIZE];
|
||||
|
@ -276,7 +276,7 @@ config INTEL_IDMA64
|
||||
|
||||
config INTEL_IOATDMA
|
||||
tristate "Intel I/OAT DMA support"
|
||||
depends on PCI && X86_64
|
||||
depends on PCI && X86_64 && !UML
|
||||
select DMA_ENGINE
|
||||
select DMA_ENGINE_RAID
|
||||
select DCA
|
||||
|
@ -70,10 +70,14 @@ static int acpi_dma_parse_resource_group(const struct acpi_csrt_group *grp,
|
||||
|
||||
si = (const struct acpi_csrt_shared_info *)&grp[1];
|
||||
|
||||
/* Match device by MMIO and IRQ */
|
||||
/* Match device by MMIO */
|
||||
if (si->mmio_base_low != lower_32_bits(mem) ||
|
||||
si->mmio_base_high != upper_32_bits(mem) ||
|
||||
si->gsi_interrupt != irq)
|
||||
si->mmio_base_high != upper_32_bits(mem))
|
||||
return 0;
|
||||
|
||||
/* Match device by Linux vIRQ */
|
||||
ret = acpi_register_gsi(NULL, si->gsi_interrupt, si->interrupt_mode, si->interrupt_polarity);
|
||||
if (ret != irq)
|
||||
return 0;
|
||||
|
||||
dev_dbg(&adev->dev, "matches with %.4s%04X (rev %u)\n",
|
||||
|
@ -1267,6 +1267,7 @@ static const struct of_device_id sprd_dma_match[] = {
|
||||
{ .compatible = "sprd,sc9860-dma", },
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, sprd_dma_match);
|
||||
|
||||
static int __maybe_unused sprd_dma_runtime_suspend(struct device *dev)
|
||||
{
|
||||
|
@ -2703,7 +2703,7 @@ static int xilinx_dma_probe(struct platform_device *pdev)
|
||||
xdev->ext_addr = false;
|
||||
|
||||
/* Set the dma mask bits */
|
||||
dma_set_mask(xdev->dev, DMA_BIT_MASK(addr_width));
|
||||
dma_set_mask_and_coherent(xdev->dev, DMA_BIT_MASK(addr_width));
|
||||
|
||||
/* Initialize the DMA engine */
|
||||
xdev->common.dev = &pdev->dev;
|
||||
|
@ -57,7 +57,7 @@ nvkm_control_mthd_pstate_info(struct nvkm_control *ctrl, void *data, u32 size)
|
||||
args->v0.count = 0;
|
||||
args->v0.ustate_ac = NVIF_CONTROL_PSTATE_INFO_V0_USTATE_DISABLE;
|
||||
args->v0.ustate_dc = NVIF_CONTROL_PSTATE_INFO_V0_USTATE_DISABLE;
|
||||
args->v0.pwrsrc = -ENOSYS;
|
||||
args->v0.pwrsrc = -ENODEV;
|
||||
args->v0.pstate = NVIF_CONTROL_PSTATE_INFO_V0_PSTATE_UNKNOWN;
|
||||
}
|
||||
|
||||
|
@ -1987,6 +1987,8 @@ static void stmmac_tx_err(struct stmmac_priv *priv, u32 chan)
|
||||
tx_q->cur_tx = 0;
|
||||
tx_q->mss = 0;
|
||||
netdev_tx_reset_queue(netdev_get_tx_queue(priv->dev, chan));
|
||||
stmmac_init_tx_chan(priv, priv->ioaddr, priv->plat->dma_cfg,
|
||||
tx_q->dma_tx_phy, chan);
|
||||
stmmac_start_tx_dma(priv, chan);
|
||||
|
||||
priv->dev->stats.tx_errors++;
|
||||
|
@ -239,9 +239,10 @@ int genphy_c45_read_link(struct phy_device *phydev)
|
||||
|
||||
/* The link state is latched low so that momentary link
|
||||
* drops can be detected. Do not double-read the status
|
||||
* in polling mode to detect such short link drops.
|
||||
* in polling mode to detect such short link drops except
|
||||
* the link was already down.
|
||||
*/
|
||||
if (!phy_polling_mode(phydev)) {
|
||||
if (!phy_polling_mode(phydev) || !phydev->link) {
|
||||
val = phy_read_mmd(phydev, devad, MDIO_STAT1);
|
||||
if (val < 0)
|
||||
return val;
|
||||
|
@ -1766,9 +1766,10 @@ int genphy_update_link(struct phy_device *phydev)
|
||||
|
||||
/* The link state is latched low so that momentary link
|
||||
* drops can be detected. Do not double-read the status
|
||||
* in polling mode to detect such short link drops.
|
||||
* in polling mode to detect such short link drops except
|
||||
* the link was already down.
|
||||
*/
|
||||
if (!phy_polling_mode(phydev)) {
|
||||
if (!phy_polling_mode(phydev) || !phydev->link) {
|
||||
status = phy_read(phydev, MII_BMSR);
|
||||
if (status < 0)
|
||||
return status;
|
||||
|
@ -156,15 +156,6 @@ static inline struct dino_device *DINO_DEV(struct pci_hba_data *hba)
|
||||
return container_of(hba, struct dino_device, hba);
|
||||
}
|
||||
|
||||
/* Check if PCI device is behind a Card-mode Dino. */
|
||||
static int pci_dev_is_behind_card_dino(struct pci_dev *dev)
|
||||
{
|
||||
struct dino_device *dino_dev;
|
||||
|
||||
dino_dev = DINO_DEV(parisc_walk_tree(dev->bus->bridge));
|
||||
return is_card_dino(&dino_dev->hba.dev->id);
|
||||
}
|
||||
|
||||
/*
|
||||
* Dino Configuration Space Accessor Functions
|
||||
*/
|
||||
@ -447,6 +438,15 @@ static void quirk_cirrus_cardbus(struct pci_dev *dev)
|
||||
DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_CIRRUS, PCI_DEVICE_ID_CIRRUS_6832, quirk_cirrus_cardbus );
|
||||
|
||||
#ifdef CONFIG_TULIP
|
||||
/* Check if PCI device is behind a Card-mode Dino. */
|
||||
static int pci_dev_is_behind_card_dino(struct pci_dev *dev)
|
||||
{
|
||||
struct dino_device *dino_dev;
|
||||
|
||||
dino_dev = DINO_DEV(parisc_walk_tree(dev->bus->bridge));
|
||||
return is_card_dino(&dino_dev->hba.dev->id);
|
||||
}
|
||||
|
||||
static void pci_fixup_tulip(struct pci_dev *dev)
|
||||
{
|
||||
if (!pci_dev_is_behind_card_dino(dev))
|
||||
|
@ -188,6 +188,8 @@
|
||||
|
||||
#define MSI_IRQ_NUM 32
|
||||
|
||||
#define CFG_RD_CRS_VAL 0xffff0001
|
||||
|
||||
struct advk_pcie {
|
||||
struct platform_device *pdev;
|
||||
void __iomem *base;
|
||||
@ -365,7 +367,7 @@ static void advk_pcie_setup_hw(struct advk_pcie *pcie)
|
||||
advk_writel(pcie, reg, PCIE_CORE_CMD_STATUS_REG);
|
||||
}
|
||||
|
||||
static int advk_pcie_check_pio_status(struct advk_pcie *pcie, u32 *val)
|
||||
static int advk_pcie_check_pio_status(struct advk_pcie *pcie, bool allow_crs, u32 *val)
|
||||
{
|
||||
struct device *dev = &pcie->pdev->dev;
|
||||
u32 reg;
|
||||
@ -407,9 +409,30 @@ static int advk_pcie_check_pio_status(struct advk_pcie *pcie, u32 *val)
|
||||
strcomp_status = "UR";
|
||||
break;
|
||||
case PIO_COMPLETION_STATUS_CRS:
|
||||
if (allow_crs && val) {
|
||||
/* PCIe r4.0, sec 2.3.2, says:
|
||||
* If CRS Software Visibility is enabled:
|
||||
* For a Configuration Read Request that includes both
|
||||
* bytes of the Vendor ID field of a device Function's
|
||||
* Configuration Space Header, the Root Complex must
|
||||
* complete the Request to the host by returning a
|
||||
* read-data value of 0001h for the Vendor ID field and
|
||||
* all '1's for any additional bytes included in the
|
||||
* request.
|
||||
*
|
||||
* So CRS in this case is not an error status.
|
||||
*/
|
||||
*val = CFG_RD_CRS_VAL;
|
||||
strcomp_status = NULL;
|
||||
break;
|
||||
}
|
||||
/* PCIe r4.0, sec 2.3.2, says:
|
||||
* If CRS Software Visibility is not enabled, the Root Complex
|
||||
* must re-issue the Configuration Request as a new Request.
|
||||
* If CRS Software Visibility is enabled: For a Configuration
|
||||
* Write Request or for any other Configuration Read Request,
|
||||
* the Root Complex must re-issue the Configuration Request as
|
||||
* a new Request.
|
||||
* A Root Complex implementation may choose to limit the number
|
||||
* of Configuration Request/CRS Completion Status loops before
|
||||
* determining that something is wrong with the target of the
|
||||
@ -478,6 +501,7 @@ advk_pci_bridge_emul_pcie_conf_read(struct pci_bridge_emul *bridge,
|
||||
case PCI_EXP_RTCTL: {
|
||||
u32 val = advk_readl(pcie, PCIE_ISR0_MASK_REG);
|
||||
*value = (val & PCIE_MSG_PM_PME_MASK) ? 0 : PCI_EXP_RTCTL_PMEIE;
|
||||
*value |= PCI_EXP_RTCAP_CRSVIS << 16;
|
||||
return PCI_BRIDGE_EMUL_HANDLED;
|
||||
}
|
||||
|
||||
@ -559,6 +583,7 @@ static struct pci_bridge_emul_ops advk_pci_bridge_emul_ops = {
|
||||
static int advk_sw_pci_bridge_init(struct advk_pcie *pcie)
|
||||
{
|
||||
struct pci_bridge_emul *bridge = &pcie->bridge;
|
||||
int ret;
|
||||
|
||||
bridge->conf.vendor = advk_readl(pcie, PCIE_CORE_DEV_ID_REG) & 0xffff;
|
||||
bridge->conf.device = advk_readl(pcie, PCIE_CORE_DEV_ID_REG) >> 16;
|
||||
@ -580,7 +605,15 @@ static int advk_sw_pci_bridge_init(struct advk_pcie *pcie)
|
||||
bridge->data = pcie;
|
||||
bridge->ops = &advk_pci_bridge_emul_ops;
|
||||
|
||||
return pci_bridge_emul_init(bridge, 0);
|
||||
/* PCIe config space can be initialized after pci_bridge_emul_init() */
|
||||
ret = pci_bridge_emul_init(bridge, 0);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/* Indicates supports for Completion Retry Status */
|
||||
bridge->pcie_conf.rootcap = cpu_to_le16(PCI_EXP_RTCAP_CRSVIS);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool advk_pcie_valid_device(struct advk_pcie *pcie, struct pci_bus *bus,
|
||||
@ -625,6 +658,7 @@ static int advk_pcie_rd_conf(struct pci_bus *bus, u32 devfn,
|
||||
int where, int size, u32 *val)
|
||||
{
|
||||
struct advk_pcie *pcie = bus->sysdata;
|
||||
bool allow_crs;
|
||||
u32 reg;
|
||||
int ret;
|
||||
|
||||
@ -637,7 +671,24 @@ static int advk_pcie_rd_conf(struct pci_bus *bus, u32 devfn,
|
||||
return pci_bridge_emul_conf_read(&pcie->bridge, where,
|
||||
size, val);
|
||||
|
||||
/*
|
||||
* Completion Retry Status is possible to return only when reading all
|
||||
* 4 bytes from PCI_VENDOR_ID and PCI_DEVICE_ID registers at once and
|
||||
* CRSSVE flag on Root Bridge is enabled.
|
||||
*/
|
||||
allow_crs = (where == PCI_VENDOR_ID) && (size == 4) &&
|
||||
(le16_to_cpu(pcie->bridge.pcie_conf.rootctl) &
|
||||
PCI_EXP_RTCTL_CRSSVE);
|
||||
|
||||
if (advk_pcie_pio_is_running(pcie)) {
|
||||
/*
|
||||
* If it is possible return Completion Retry Status so caller
|
||||
* tries to issue the request again instead of failing.
|
||||
*/
|
||||
if (allow_crs) {
|
||||
*val = CFG_RD_CRS_VAL;
|
||||
return PCIBIOS_SUCCESSFUL;
|
||||
}
|
||||
*val = 0xffffffff;
|
||||
return PCIBIOS_SET_FAILED;
|
||||
}
|
||||
@ -664,11 +715,21 @@ static int advk_pcie_rd_conf(struct pci_bus *bus, u32 devfn,
|
||||
advk_writel(pcie, 1, PIO_START);
|
||||
|
||||
ret = advk_pcie_wait_pio(pcie);
|
||||
if (ret < 0)
|
||||
if (ret < 0) {
|
||||
/*
|
||||
* If it is possible return Completion Retry Status so caller
|
||||
* tries to issue the request again instead of failing.
|
||||
*/
|
||||
if (allow_crs) {
|
||||
*val = CFG_RD_CRS_VAL;
|
||||
return PCIBIOS_SUCCESSFUL;
|
||||
}
|
||||
*val = 0xffffffff;
|
||||
return PCIBIOS_SET_FAILED;
|
||||
}
|
||||
|
||||
/* Check PIO status and get the read result */
|
||||
ret = advk_pcie_check_pio_status(pcie, val);
|
||||
ret = advk_pcie_check_pio_status(pcie, allow_crs, val);
|
||||
if (ret < 0) {
|
||||
*val = 0xffffffff;
|
||||
return PCIBIOS_SET_FAILED;
|
||||
@ -737,7 +798,7 @@ static int advk_pcie_wr_conf(struct pci_bus *bus, u32 devfn,
|
||||
if (ret < 0)
|
||||
return PCIBIOS_SET_FAILED;
|
||||
|
||||
ret = advk_pcie_check_pio_status(pcie, NULL);
|
||||
ret = advk_pcie_check_pio_status(pcie, false, NULL);
|
||||
if (ret < 0)
|
||||
return PCIBIOS_SET_FAILED;
|
||||
|
||||
|
@ -164,4 +164,14 @@ struct pci_ecam_ops pci_32b_ops = {
|
||||
.write = pci_generic_config_write32,
|
||||
}
|
||||
};
|
||||
|
||||
/* ECAM ops for 32-bit read only (non-compliant) */
|
||||
struct pci_ecam_ops pci_32b_read_ops = {
|
||||
.bus_shift = 20,
|
||||
.pci_ops = {
|
||||
.map_bus = pci_ecam_map_bus,
|
||||
.read = pci_generic_config_read32,
|
||||
.write = pci_generic_config_write,
|
||||
}
|
||||
};
|
||||
#endif
|
||||
|
@ -270,10 +270,10 @@ static const struct pci_bridge_reg_behavior pcie_cap_regs_behavior[] = {
|
||||
int pci_bridge_emul_init(struct pci_bridge_emul *bridge,
|
||||
unsigned int flags)
|
||||
{
|
||||
bridge->conf.class_revision |= PCI_CLASS_BRIDGE_PCI << 16;
|
||||
bridge->conf.class_revision |= cpu_to_le32(PCI_CLASS_BRIDGE_PCI << 16);
|
||||
bridge->conf.header_type = PCI_HEADER_TYPE_BRIDGE;
|
||||
bridge->conf.cache_line_size = 0x10;
|
||||
bridge->conf.status = PCI_STATUS_CAP_LIST;
|
||||
bridge->conf.status = cpu_to_le16(PCI_STATUS_CAP_LIST);
|
||||
bridge->pci_regs_behavior = kmemdup(pci_regs_behavior,
|
||||
sizeof(pci_regs_behavior),
|
||||
GFP_KERNEL);
|
||||
@ -284,8 +284,9 @@ int pci_bridge_emul_init(struct pci_bridge_emul *bridge,
|
||||
bridge->conf.capabilities_pointer = PCI_CAP_PCIE_START;
|
||||
bridge->pcie_conf.cap_id = PCI_CAP_ID_EXP;
|
||||
/* Set PCIe v2, root port, slot support */
|
||||
bridge->pcie_conf.cap = PCI_EXP_TYPE_ROOT_PORT << 4 | 2 |
|
||||
PCI_EXP_FLAGS_SLOT;
|
||||
bridge->pcie_conf.cap =
|
||||
cpu_to_le16(PCI_EXP_TYPE_ROOT_PORT << 4 | 2 |
|
||||
PCI_EXP_FLAGS_SLOT);
|
||||
bridge->pcie_cap_regs_behavior =
|
||||
kmemdup(pcie_cap_regs_behavior,
|
||||
sizeof(pcie_cap_regs_behavior),
|
||||
@ -327,7 +328,7 @@ int pci_bridge_emul_conf_read(struct pci_bridge_emul *bridge, int where,
|
||||
int reg = where & ~3;
|
||||
pci_bridge_emul_read_status_t (*read_op)(struct pci_bridge_emul *bridge,
|
||||
int reg, u32 *value);
|
||||
u32 *cfgspace;
|
||||
__le32 *cfgspace;
|
||||
const struct pci_bridge_reg_behavior *behavior;
|
||||
|
||||
if (bridge->has_pcie && reg >= PCI_CAP_PCIE_END) {
|
||||
@ -343,11 +344,11 @@ int pci_bridge_emul_conf_read(struct pci_bridge_emul *bridge, int where,
|
||||
if (bridge->has_pcie && reg >= PCI_CAP_PCIE_START) {
|
||||
reg -= PCI_CAP_PCIE_START;
|
||||
read_op = bridge->ops->read_pcie;
|
||||
cfgspace = (u32 *) &bridge->pcie_conf;
|
||||
cfgspace = (__le32 *) &bridge->pcie_conf;
|
||||
behavior = bridge->pcie_cap_regs_behavior;
|
||||
} else {
|
||||
read_op = bridge->ops->read_base;
|
||||
cfgspace = (u32 *) &bridge->conf;
|
||||
cfgspace = (__le32 *) &bridge->conf;
|
||||
behavior = bridge->pci_regs_behavior;
|
||||
}
|
||||
|
||||
@ -357,7 +358,7 @@ int pci_bridge_emul_conf_read(struct pci_bridge_emul *bridge, int where,
|
||||
ret = PCI_BRIDGE_EMUL_NOT_HANDLED;
|
||||
|
||||
if (ret == PCI_BRIDGE_EMUL_NOT_HANDLED)
|
||||
*value = cfgspace[reg / 4];
|
||||
*value = le32_to_cpu(cfgspace[reg / 4]);
|
||||
|
||||
/*
|
||||
* Make sure we never return any reserved bit with a value
|
||||
@ -387,7 +388,7 @@ int pci_bridge_emul_conf_write(struct pci_bridge_emul *bridge, int where,
|
||||
int mask, ret, old, new, shift;
|
||||
void (*write_op)(struct pci_bridge_emul *bridge, int reg,
|
||||
u32 old, u32 new, u32 mask);
|
||||
u32 *cfgspace;
|
||||
__le32 *cfgspace;
|
||||
const struct pci_bridge_reg_behavior *behavior;
|
||||
|
||||
if (bridge->has_pcie && reg >= PCI_CAP_PCIE_END)
|
||||
@ -414,11 +415,11 @@ int pci_bridge_emul_conf_write(struct pci_bridge_emul *bridge, int where,
|
||||
if (bridge->has_pcie && reg >= PCI_CAP_PCIE_START) {
|
||||
reg -= PCI_CAP_PCIE_START;
|
||||
write_op = bridge->ops->write_pcie;
|
||||
cfgspace = (u32 *) &bridge->pcie_conf;
|
||||
cfgspace = (__le32 *) &bridge->pcie_conf;
|
||||
behavior = bridge->pcie_cap_regs_behavior;
|
||||
} else {
|
||||
write_op = bridge->ops->write_base;
|
||||
cfgspace = (u32 *) &bridge->conf;
|
||||
cfgspace = (__le32 *) &bridge->conf;
|
||||
behavior = bridge->pci_regs_behavior;
|
||||
}
|
||||
|
||||
@ -431,7 +432,7 @@ int pci_bridge_emul_conf_write(struct pci_bridge_emul *bridge, int where,
|
||||
/* Clear the W1C bits */
|
||||
new &= ~((value << shift) & (behavior[reg / 4].w1c & mask));
|
||||
|
||||
cfgspace[reg / 4] = new;
|
||||
cfgspace[reg / 4] = cpu_to_le32(new);
|
||||
|
||||
if (write_op)
|
||||
write_op(bridge, reg, old, new, mask);
|
||||
|
@ -6,65 +6,65 @@
|
||||
|
||||
/* PCI configuration space of a PCI-to-PCI bridge. */
|
||||
struct pci_bridge_emul_conf {
|
||||
u16 vendor;
|
||||
u16 device;
|
||||
u16 command;
|
||||
u16 status;
|
||||
u32 class_revision;
|
||||
__le16 vendor;
|
||||
__le16 device;
|
||||
__le16 command;
|
||||
__le16 status;
|
||||
__le32 class_revision;
|
||||
u8 cache_line_size;
|
||||
u8 latency_timer;
|
||||
u8 header_type;
|
||||
u8 bist;
|
||||
u32 bar[2];
|
||||
__le32 bar[2];
|
||||
u8 primary_bus;
|
||||
u8 secondary_bus;
|
||||
u8 subordinate_bus;
|
||||
u8 secondary_latency_timer;
|
||||
u8 iobase;
|
||||
u8 iolimit;
|
||||
u16 secondary_status;
|
||||
u16 membase;
|
||||
u16 memlimit;
|
||||
u16 pref_mem_base;
|
||||
u16 pref_mem_limit;
|
||||
u32 prefbaseupper;
|
||||
u32 preflimitupper;
|
||||
u16 iobaseupper;
|
||||
u16 iolimitupper;
|
||||
__le16 secondary_status;
|
||||
__le16 membase;
|
||||
__le16 memlimit;
|
||||
__le16 pref_mem_base;
|
||||
__le16 pref_mem_limit;
|
||||
__le32 prefbaseupper;
|
||||
__le32 preflimitupper;
|
||||
__le16 iobaseupper;
|
||||
__le16 iolimitupper;
|
||||
u8 capabilities_pointer;
|
||||
u8 reserve[3];
|
||||
u32 romaddr;
|
||||
__le32 romaddr;
|
||||
u8 intline;
|
||||
u8 intpin;
|
||||
u16 bridgectrl;
|
||||
__le16 bridgectrl;
|
||||
};
|
||||
|
||||
/* PCI configuration space of the PCIe capabilities */
|
||||
struct pci_bridge_emul_pcie_conf {
|
||||
u8 cap_id;
|
||||
u8 next;
|
||||
u16 cap;
|
||||
u32 devcap;
|
||||
u16 devctl;
|
||||
u16 devsta;
|
||||
u32 lnkcap;
|
||||
u16 lnkctl;
|
||||
u16 lnksta;
|
||||
u32 slotcap;
|
||||
u16 slotctl;
|
||||
u16 slotsta;
|
||||
u16 rootctl;
|
||||
u16 rsvd;
|
||||
u32 rootsta;
|
||||
u32 devcap2;
|
||||
u16 devctl2;
|
||||
u16 devsta2;
|
||||
u32 lnkcap2;
|
||||
u16 lnkctl2;
|
||||
u16 lnksta2;
|
||||
u32 slotcap2;
|
||||
u16 slotctl2;
|
||||
u16 slotsta2;
|
||||
__le16 cap;
|
||||
__le32 devcap;
|
||||
__le16 devctl;
|
||||
__le16 devsta;
|
||||
__le32 lnkcap;
|
||||
__le16 lnkctl;
|
||||
__le16 lnksta;
|
||||
__le32 slotcap;
|
||||
__le16 slotctl;
|
||||
__le16 slotsta;
|
||||
__le16 rootctl;
|
||||
__le16 rootcap;
|
||||
__le32 rootsta;
|
||||
__le32 devcap2;
|
||||
__le16 devctl2;
|
||||
__le16 devsta2;
|
||||
__le32 lnkcap2;
|
||||
__le16 lnkctl2;
|
||||
__le16 lnksta2;
|
||||
__le32 slotcap2;
|
||||
__le16 slotctl2;
|
||||
__le16 slotsta2;
|
||||
};
|
||||
|
||||
struct pci_bridge_emul;
|
||||
|
@ -329,23 +329,7 @@ err_pm_disable:
|
||||
static int img_pwm_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct img_pwm_chip *pwm_chip = platform_get_drvdata(pdev);
|
||||
u32 val;
|
||||
unsigned int i;
|
||||
int ret;
|
||||
|
||||
ret = pm_runtime_get_sync(&pdev->dev);
|
||||
if (ret < 0) {
|
||||
pm_runtime_put(&pdev->dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
for (i = 0; i < pwm_chip->chip.npwm; i++) {
|
||||
val = img_pwm_readl(pwm_chip, PWM_CTRL_CFG);
|
||||
val &= ~BIT(i);
|
||||
img_pwm_writel(pwm_chip, PWM_CTRL_CFG, val);
|
||||
}
|
||||
|
||||
pm_runtime_put(&pdev->dev);
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
if (!pm_runtime_status_suspended(&pdev->dev))
|
||||
img_pwm_runtime_suspend(&pdev->dev);
|
||||
|
@ -120,17 +120,17 @@ static int lpc32xx_pwm_probe(struct platform_device *pdev)
|
||||
lpc32xx->chip.npwm = 1;
|
||||
lpc32xx->chip.base = -1;
|
||||
|
||||
/* If PWM is disabled, configure the output to the default value */
|
||||
val = readl(lpc32xx->base + (lpc32xx->chip.pwms[0].hwpwm << 2));
|
||||
val &= ~PWM_PIN_LEVEL;
|
||||
writel(val, lpc32xx->base + (lpc32xx->chip.pwms[0].hwpwm << 2));
|
||||
|
||||
ret = pwmchip_add(&lpc32xx->chip);
|
||||
if (ret < 0) {
|
||||
dev_err(&pdev->dev, "failed to add PWM chip, error %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* When PWM is disable, configure the output to the default value */
|
||||
val = readl(lpc32xx->base + (lpc32xx->chip.pwms[0].hwpwm << 2));
|
||||
val &= ~PWM_PIN_LEVEL;
|
||||
writel(val, lpc32xx->base + (lpc32xx->chip.pwms[0].hwpwm << 2));
|
||||
|
||||
platform_set_drvdata(pdev, lpc32xx);
|
||||
|
||||
return 0;
|
||||
|
@ -383,20 +383,6 @@ static int rockchip_pwm_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct rockchip_pwm_chip *pc = platform_get_drvdata(pdev);
|
||||
|
||||
/*
|
||||
* Disable the PWM clk before unpreparing it if the PWM device is still
|
||||
* running. This should only happen when the last PWM user left it
|
||||
* enabled, or when nobody requested a PWM that was previously enabled
|
||||
* by the bootloader.
|
||||
*
|
||||
* FIXME: Maybe the core should disable all PWM devices in
|
||||
* pwmchip_remove(). In this case we'd only have to call
|
||||
* clk_unprepare() after pwmchip_remove().
|
||||
*
|
||||
*/
|
||||
if (pwm_is_enabled(pc->chip.pwms))
|
||||
clk_disable(pc->clk);
|
||||
|
||||
clk_unprepare(pc->pclk);
|
||||
clk_unprepare(pc->clk);
|
||||
|
||||
|
@ -225,8 +225,6 @@ static int stm32_pwm_lp_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct stm32_pwm_lp *priv = platform_get_drvdata(pdev);
|
||||
|
||||
pwm_disable(&priv->chip.pwms[0]);
|
||||
|
||||
return pwmchip_remove(&priv->chip);
|
||||
}
|
||||
|
||||
|
@ -625,6 +625,7 @@ config RTC_DRV_FM3130
|
||||
|
||||
config RTC_DRV_RX8010
|
||||
tristate "Epson RX8010SJ"
|
||||
select REGMAP_I2C
|
||||
help
|
||||
If you say yes here you get support for the Epson RX8010SJ RTC
|
||||
chip.
|
||||
|
@ -4338,7 +4338,7 @@ static void TranslateRxSignalStuff819xUsb(struct sk_buff *skb,
|
||||
bpacket_match_bssid = (type != IEEE80211_FTYPE_CTL) &&
|
||||
(ether_addr_equal(priv->ieee80211->current_network.bssid, (fc & IEEE80211_FCTL_TODS) ? hdr->addr1 : (fc & IEEE80211_FCTL_FROMDS) ? hdr->addr2 : hdr->addr3))
|
||||
&& (!pstats->bHwError) && (!pstats->bCRC) && (!pstats->bICV);
|
||||
bpacket_toself = bpacket_match_bssid &
|
||||
bpacket_toself = bpacket_match_bssid &&
|
||||
(ether_addr_equal(praddr, priv->ieee80211->dev->dev_addr));
|
||||
|
||||
if (WLAN_FC_GET_FRAMETYPE(fc) == IEEE80211_STYPE_BEACON)
|
||||
|
@ -1070,6 +1070,7 @@ static int exynos_tmu_probe(struct platform_device *pdev)
|
||||
data->sclk = devm_clk_get(&pdev->dev, "tmu_sclk");
|
||||
if (IS_ERR(data->sclk)) {
|
||||
dev_err(&pdev->dev, "Failed to get sclk\n");
|
||||
ret = PTR_ERR(data->sclk);
|
||||
goto err_clk;
|
||||
} else {
|
||||
ret = clk_prepare_enable(data->sclk);
|
||||
|
@ -2070,7 +2070,7 @@ static void restore_cur(struct vc_data *vc)
|
||||
|
||||
enum { ESnormal, ESesc, ESsquare, ESgetpars, ESfunckey,
|
||||
EShash, ESsetG0, ESsetG1, ESpercent, EScsiignore, ESnonstd,
|
||||
ESpalette, ESosc };
|
||||
ESpalette, ESosc, ESapc, ESpm, ESdcs };
|
||||
|
||||
/* console_lock is held (except via vc_init()) */
|
||||
static void reset_terminal(struct vc_data *vc, int do_clear)
|
||||
@ -2124,20 +2124,28 @@ static void reset_terminal(struct vc_data *vc, int do_clear)
|
||||
csi_J(vc, 2);
|
||||
}
|
||||
|
||||
/* is this state an ANSI control string? */
|
||||
static bool ansi_control_string(unsigned int state)
|
||||
{
|
||||
if (state == ESosc || state == ESapc || state == ESpm || state == ESdcs)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
/* console_lock is held */
|
||||
static void do_con_trol(struct tty_struct *tty, struct vc_data *vc, int c)
|
||||
{
|
||||
/*
|
||||
* Control characters can be used in the _middle_
|
||||
* of an escape sequence.
|
||||
* of an escape sequence, aside from ANSI control strings.
|
||||
*/
|
||||
if (vc->vc_state == ESosc && c>=8 && c<=13) /* ... except for OSC */
|
||||
if (ansi_control_string(vc->vc_state) && c >= 8 && c <= 13)
|
||||
return;
|
||||
switch (c) {
|
||||
case 0:
|
||||
return;
|
||||
case 7:
|
||||
if (vc->vc_state == ESosc)
|
||||
if (ansi_control_string(vc->vc_state))
|
||||
vc->vc_state = ESnormal;
|
||||
else if (vc->vc_bell_duration)
|
||||
kd_mksound(vc->vc_bell_pitch, vc->vc_bell_duration);
|
||||
@ -2196,6 +2204,12 @@ static void do_con_trol(struct tty_struct *tty, struct vc_data *vc, int c)
|
||||
case ']':
|
||||
vc->vc_state = ESnonstd;
|
||||
return;
|
||||
case '_':
|
||||
vc->vc_state = ESapc;
|
||||
return;
|
||||
case '^':
|
||||
vc->vc_state = ESpm;
|
||||
return;
|
||||
case '%':
|
||||
vc->vc_state = ESpercent;
|
||||
return;
|
||||
@ -2212,6 +2226,9 @@ static void do_con_trol(struct tty_struct *tty, struct vc_data *vc, int c)
|
||||
case 'H':
|
||||
vc->vc_tab_stop[7 & (vc->vc_x >> 5)] |= (1 << (vc->vc_x & 31));
|
||||
return;
|
||||
case 'P':
|
||||
vc->vc_state = ESdcs;
|
||||
return;
|
||||
case 'Z':
|
||||
respond_ID(tty);
|
||||
return;
|
||||
@ -2531,8 +2548,14 @@ static void do_con_trol(struct tty_struct *tty, struct vc_data *vc, int c)
|
||||
vc->vc_translate = set_translate(vc->vc_G1_charset, vc);
|
||||
vc->vc_state = ESnormal;
|
||||
return;
|
||||
case ESapc:
|
||||
return;
|
||||
case ESosc:
|
||||
return;
|
||||
case ESpm:
|
||||
return;
|
||||
case ESdcs:
|
||||
return;
|
||||
default:
|
||||
vc->vc_state = ESnormal;
|
||||
}
|
||||
|
@ -742,6 +742,8 @@ static int btrfs_free_stale_devices(const char *path,
|
||||
struct btrfs_device *device, *tmp_device;
|
||||
int ret = 0;
|
||||
|
||||
lockdep_assert_held(&uuid_mutex);
|
||||
|
||||
if (path)
|
||||
ret = -ENOENT;
|
||||
|
||||
@ -1181,11 +1183,12 @@ static struct btrfs_fs_devices *clone_fs_devices(struct btrfs_fs_devices *orig)
|
||||
struct btrfs_device *orig_dev;
|
||||
int ret = 0;
|
||||
|
||||
lockdep_assert_held(&uuid_mutex);
|
||||
|
||||
fs_devices = alloc_fs_devices(orig->fsid, NULL);
|
||||
if (IS_ERR(fs_devices))
|
||||
return fs_devices;
|
||||
|
||||
mutex_lock(&orig->device_list_mutex);
|
||||
fs_devices->total_devices = orig->total_devices;
|
||||
|
||||
list_for_each_entry(orig_dev, &orig->devices, dev_list) {
|
||||
@ -1217,10 +1220,8 @@ static struct btrfs_fs_devices *clone_fs_devices(struct btrfs_fs_devices *orig)
|
||||
device->fs_devices = fs_devices;
|
||||
fs_devices->num_devices++;
|
||||
}
|
||||
mutex_unlock(&orig->device_list_mutex);
|
||||
return fs_devices;
|
||||
error:
|
||||
mutex_unlock(&orig->device_list_mutex);
|
||||
free_fs_devices(fs_devices);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
@ -1775,6 +1775,8 @@ static u64 __mark_caps_flushing(struct inode *inode,
|
||||
* try to invalidate mapping pages without blocking.
|
||||
*/
|
||||
static int try_nonblocking_invalidate(struct inode *inode)
|
||||
__releases(ci->i_ceph_lock)
|
||||
__acquires(ci->i_ceph_lock)
|
||||
{
|
||||
struct ceph_inode_info *ci = ceph_inode(inode);
|
||||
u32 invalidating_gen = ci->i_rdcache_gen;
|
||||
|
@ -1469,22 +1469,6 @@ retry_snap:
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = file_remove_privs(file);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
err = file_update_time(file);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
inode_inc_iversion_raw(inode);
|
||||
|
||||
if (ci->i_inline_version != CEPH_INLINE_NONE) {
|
||||
err = ceph_uninline_data(file, NULL);
|
||||
if (err < 0)
|
||||
goto out;
|
||||
}
|
||||
|
||||
down_read(&osdc->lock);
|
||||
map_flags = osdc->osdmap->flags;
|
||||
pool_flags = ceph_pg_pool_flags(osdc->osdmap, ci->i_layout.pool_id);
|
||||
@ -1495,6 +1479,16 @@ retry_snap:
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = file_remove_privs(file);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
if (ci->i_inline_version != CEPH_INLINE_NONE) {
|
||||
err = ceph_uninline_data(file, NULL);
|
||||
if (err < 0)
|
||||
goto out;
|
||||
}
|
||||
|
||||
dout("aio_write %p %llx.%llx %llu~%zd getting caps. i_size %llu\n",
|
||||
inode, ceph_vinop(inode), pos, count, i_size_read(inode));
|
||||
if (fi->fmode & CEPH_FILE_MODE_LAZY)
|
||||
@ -1507,6 +1501,12 @@ retry_snap:
|
||||
if (err < 0)
|
||||
goto out;
|
||||
|
||||
err = file_update_time(file);
|
||||
if (err)
|
||||
goto out_caps;
|
||||
|
||||
inode_inc_iversion_raw(inode);
|
||||
|
||||
dout("aio_write %p %llx.%llx %llu~%zd got cap refs on %s\n",
|
||||
inode, ceph_vinop(inode), pos, count, ceph_cap_string(got));
|
||||
|
||||
@ -1590,6 +1590,8 @@ retry_snap:
|
||||
}
|
||||
|
||||
goto out_unlocked;
|
||||
out_caps:
|
||||
ceph_put_cap_refs(ci, got);
|
||||
out:
|
||||
if (direct_lock)
|
||||
ceph_end_io_direct(inode);
|
||||
|
@ -64,11 +64,9 @@ static const struct sysfs_ops nilfs_##name##_attr_ops = { \
|
||||
#define NILFS_DEV_INT_GROUP_TYPE(name, parent_name) \
|
||||
static void nilfs_##name##_attr_release(struct kobject *kobj) \
|
||||
{ \
|
||||
struct nilfs_sysfs_##parent_name##_subgroups *subgroups; \
|
||||
struct the_nilfs *nilfs = container_of(kobj->parent, \
|
||||
struct the_nilfs, \
|
||||
ns_##parent_name##_kobj); \
|
||||
subgroups = nilfs->ns_##parent_name##_subgroups; \
|
||||
struct nilfs_sysfs_##parent_name##_subgroups *subgroups = container_of(kobj, \
|
||||
struct nilfs_sysfs_##parent_name##_subgroups, \
|
||||
sg_##name##_kobj); \
|
||||
complete(&subgroups->sg_##name##_kobj_unregister); \
|
||||
} \
|
||||
static struct kobj_type nilfs_##name##_ktype = { \
|
||||
@ -94,12 +92,12 @@ static int nilfs_sysfs_create_##name##_group(struct the_nilfs *nilfs) \
|
||||
err = kobject_init_and_add(kobj, &nilfs_##name##_ktype, parent, \
|
||||
#name); \
|
||||
if (err) \
|
||||
return err; \
|
||||
return 0; \
|
||||
kobject_put(kobj); \
|
||||
return err; \
|
||||
} \
|
||||
static void nilfs_sysfs_delete_##name##_group(struct the_nilfs *nilfs) \
|
||||
{ \
|
||||
kobject_del(&nilfs->ns_##parent_name##_subgroups->sg_##name##_kobj); \
|
||||
kobject_put(&nilfs->ns_##parent_name##_subgroups->sg_##name##_kobj); \
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
@ -210,14 +208,14 @@ int nilfs_sysfs_create_snapshot_group(struct nilfs_root *root)
|
||||
}
|
||||
|
||||
if (err)
|
||||
return err;
|
||||
kobject_put(&root->snapshot_kobj);
|
||||
|
||||
return 0;
|
||||
return err;
|
||||
}
|
||||
|
||||
void nilfs_sysfs_delete_snapshot_group(struct nilfs_root *root)
|
||||
{
|
||||
kobject_del(&root->snapshot_kobj);
|
||||
kobject_put(&root->snapshot_kobj);
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
@ -1000,7 +998,7 @@ int nilfs_sysfs_create_device_group(struct super_block *sb)
|
||||
err = kobject_init_and_add(&nilfs->ns_dev_kobj, &nilfs_dev_ktype, NULL,
|
||||
"%s", sb->s_id);
|
||||
if (err)
|
||||
goto free_dev_subgroups;
|
||||
goto cleanup_dev_kobject;
|
||||
|
||||
err = nilfs_sysfs_create_mounted_snapshots_group(nilfs);
|
||||
if (err)
|
||||
@ -1037,9 +1035,7 @@ delete_mounted_snapshots_group:
|
||||
nilfs_sysfs_delete_mounted_snapshots_group(nilfs);
|
||||
|
||||
cleanup_dev_kobject:
|
||||
kobject_del(&nilfs->ns_dev_kobj);
|
||||
|
||||
free_dev_subgroups:
|
||||
kobject_put(&nilfs->ns_dev_kobj);
|
||||
kfree(nilfs->ns_dev_subgroups);
|
||||
|
||||
failed_create_device_group:
|
||||
|
@ -797,14 +797,13 @@ nilfs_find_or_create_root(struct the_nilfs *nilfs, __u64 cno)
|
||||
|
||||
void nilfs_put_root(struct nilfs_root *root)
|
||||
{
|
||||
if (refcount_dec_and_test(&root->count)) {
|
||||
struct the_nilfs *nilfs = root->nilfs;
|
||||
struct the_nilfs *nilfs = root->nilfs;
|
||||
|
||||
nilfs_sysfs_delete_snapshot_group(root);
|
||||
|
||||
spin_lock(&nilfs->ns_cptree_lock);
|
||||
if (refcount_dec_and_lock(&root->count, &nilfs->ns_cptree_lock)) {
|
||||
rb_erase(&root->rb_node, &nilfs->ns_cptree);
|
||||
spin_unlock(&nilfs->ns_cptree_lock);
|
||||
|
||||
nilfs_sysfs_delete_snapshot_group(root);
|
||||
iput(root->ifile);
|
||||
|
||||
kfree(root);
|
||||
|
@ -78,24 +78,6 @@ struct cpu_cacheinfo {
|
||||
bool cpu_map_populated;
|
||||
};
|
||||
|
||||
/*
|
||||
* Helpers to make sure "func" is executed on the cpu whose cache
|
||||
* attributes are being detected
|
||||
*/
|
||||
#define DEFINE_SMP_CALL_CACHE_FUNCTION(func) \
|
||||
static inline void _##func(void *ret) \
|
||||
{ \
|
||||
int cpu = smp_processor_id(); \
|
||||
*(int *)ret = __##func(cpu); \
|
||||
} \
|
||||
\
|
||||
int func(unsigned int cpu) \
|
||||
{ \
|
||||
int ret; \
|
||||
smp_call_function_single(cpu, _##func, &ret, true); \
|
||||
return ret; \
|
||||
}
|
||||
|
||||
struct cpu_cacheinfo *get_cpu_cacheinfo(unsigned int cpu);
|
||||
int init_cache_level(unsigned int cpu);
|
||||
int populate_cache_leaves(unsigned int cpu);
|
||||
|
@ -266,7 +266,8 @@ struct kvm_vcpu {
|
||||
struct preempt_notifier preempt_notifier;
|
||||
#endif
|
||||
int cpu;
|
||||
int vcpu_id;
|
||||
int vcpu_id; /* id given by userspace at creation */
|
||||
int vcpu_idx; /* index in kvm->vcpus array */
|
||||
int srcu_idx;
|
||||
int mode;
|
||||
u64 requests;
|
||||
@ -571,13 +572,7 @@ static inline struct kvm_vcpu *kvm_get_vcpu_by_id(struct kvm *kvm, int id)
|
||||
|
||||
static inline int kvm_vcpu_get_idx(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct kvm_vcpu *tmp;
|
||||
int idx;
|
||||
|
||||
kvm_for_each_vcpu(idx, tmp, vcpu->kvm)
|
||||
if (tmp == vcpu)
|
||||
return idx;
|
||||
BUG();
|
||||
return vcpu->vcpu_idx;
|
||||
}
|
||||
|
||||
#define kvm_for_each_memslot(memslot, slots) \
|
||||
|
@ -51,6 +51,7 @@ extern struct pci_ecam_ops pci_generic_ecam_ops;
|
||||
|
||||
#if defined(CONFIG_ACPI) && defined(CONFIG_PCI_QUIRKS)
|
||||
extern struct pci_ecam_ops pci_32b_ops; /* 32-bit accesses only */
|
||||
extern struct pci_ecam_ops pci_32b_read_ops; /* 32-bit read only */
|
||||
extern struct pci_ecam_ops hisi_pcie_ops; /* HiSilicon */
|
||||
extern struct pci_ecam_ops thunder_pem_ecam_ops; /* Cavium ThunderX 1.x & 2.x */
|
||||
extern struct pci_ecam_ops pci_thunder_ecam_ops; /* Cavium ThunderX 1.x */
|
||||
|
@ -501,12 +501,13 @@ static inline void thermal_zone_device_update(struct thermal_zone_device *tz,
|
||||
static inline void thermal_zone_set_trips(struct thermal_zone_device *tz)
|
||||
{ }
|
||||
static inline struct thermal_cooling_device *
|
||||
thermal_cooling_device_register(char *type, void *devdata,
|
||||
thermal_cooling_device_register(const char *type, void *devdata,
|
||||
const struct thermal_cooling_device_ops *ops)
|
||||
{ return ERR_PTR(-ENODEV); }
|
||||
static inline struct thermal_cooling_device *
|
||||
thermal_of_cooling_device_register(struct device_node *np,
|
||||
char *type, void *devdata, const struct thermal_cooling_device_ops *ops)
|
||||
const char *type, void *devdata,
|
||||
const struct thermal_cooling_device_ops *ops)
|
||||
{ return ERR_PTR(-ENODEV); }
|
||||
static inline struct thermal_cooling_device *
|
||||
devm_thermal_of_cooling_device_register(struct device *dev,
|
||||
|
@ -41,7 +41,8 @@ struct profile_hit {
|
||||
#define NR_PROFILE_GRP (NR_PROFILE_HIT/PROFILE_GRPSZ)
|
||||
|
||||
static atomic_t *prof_buffer;
|
||||
static unsigned long prof_len, prof_shift;
|
||||
static unsigned long prof_len;
|
||||
static unsigned short int prof_shift;
|
||||
|
||||
int prof_on __read_mostly;
|
||||
EXPORT_SYMBOL_GPL(prof_on);
|
||||
@ -67,8 +68,8 @@ int profile_setup(char *str)
|
||||
if (str[strlen(sleepstr)] == ',')
|
||||
str += strlen(sleepstr) + 1;
|
||||
if (get_option(&str, &par))
|
||||
prof_shift = par;
|
||||
pr_info("kernel sleep profiling enabled (shift: %ld)\n",
|
||||
prof_shift = clamp(par, 0, BITS_PER_LONG - 1);
|
||||
pr_info("kernel sleep profiling enabled (shift: %u)\n",
|
||||
prof_shift);
|
||||
#else
|
||||
pr_warn("kernel sleep profiling requires CONFIG_SCHEDSTATS\n");
|
||||
@ -78,21 +79,21 @@ int profile_setup(char *str)
|
||||
if (str[strlen(schedstr)] == ',')
|
||||
str += strlen(schedstr) + 1;
|
||||
if (get_option(&str, &par))
|
||||
prof_shift = par;
|
||||
pr_info("kernel schedule profiling enabled (shift: %ld)\n",
|
||||
prof_shift = clamp(par, 0, BITS_PER_LONG - 1);
|
||||
pr_info("kernel schedule profiling enabled (shift: %u)\n",
|
||||
prof_shift);
|
||||
} else if (!strncmp(str, kvmstr, strlen(kvmstr))) {
|
||||
prof_on = KVM_PROFILING;
|
||||
if (str[strlen(kvmstr)] == ',')
|
||||
str += strlen(kvmstr) + 1;
|
||||
if (get_option(&str, &par))
|
||||
prof_shift = par;
|
||||
pr_info("kernel KVM profiling enabled (shift: %ld)\n",
|
||||
prof_shift = clamp(par, 0, BITS_PER_LONG - 1);
|
||||
pr_info("kernel KVM profiling enabled (shift: %u)\n",
|
||||
prof_shift);
|
||||
} else if (get_option(&str, &par)) {
|
||||
prof_shift = par;
|
||||
prof_shift = clamp(par, 0, BITS_PER_LONG - 1);
|
||||
prof_on = CPU_PROFILING;
|
||||
pr_info("kernel profiling enabled (shift: %ld)\n",
|
||||
pr_info("kernel profiling enabled (shift: %u)\n",
|
||||
prof_shift);
|
||||
}
|
||||
return 1;
|
||||
@ -468,7 +469,7 @@ read_profile(struct file *file, char __user *buf, size_t count, loff_t *ppos)
|
||||
unsigned long p = *ppos;
|
||||
ssize_t read;
|
||||
char *pnt;
|
||||
unsigned int sample_step = 1 << prof_shift;
|
||||
unsigned long sample_step = 1UL << prof_shift;
|
||||
|
||||
profile_flip_buffers();
|
||||
if (p >= (prof_len+1)*sizeof(unsigned int))
|
||||
|
@ -1931,13 +1931,6 @@ static int validate_prctl_map_addr(struct prctl_mm_map *prctl_map)
|
||||
|
||||
error = -EINVAL;
|
||||
|
||||
/*
|
||||
* @brk should be after @end_data in traditional maps.
|
||||
*/
|
||||
if (prctl_map->start_brk <= prctl_map->end_data ||
|
||||
prctl_map->brk <= prctl_map->end_data)
|
||||
goto out;
|
||||
|
||||
/*
|
||||
* Neither we should allow to override limits if they set.
|
||||
*/
|
||||
|
@ -881,7 +881,6 @@ config HARDLOCKUP_DETECTOR
|
||||
depends on HAVE_HARDLOCKUP_DETECTOR_PERF || HAVE_HARDLOCKUP_DETECTOR_ARCH
|
||||
select LOCKUP_DETECTOR
|
||||
select HARDLOCKUP_DETECTOR_PERF if HAVE_HARDLOCKUP_DETECTOR_PERF
|
||||
select HARDLOCKUP_DETECTOR_ARCH if HAVE_HARDLOCKUP_DETECTOR_ARCH
|
||||
help
|
||||
Say Y here to enable the kernel to act as a watchdog to detect
|
||||
hard lockups.
|
||||
|
@ -605,7 +605,7 @@ static int p9_virtio_probe(struct virtio_device *vdev)
|
||||
chan->vc_wq = kmalloc(sizeof(wait_queue_head_t), GFP_KERNEL);
|
||||
if (!chan->vc_wq) {
|
||||
err = -ENOMEM;
|
||||
goto out_free_tag;
|
||||
goto out_remove_file;
|
||||
}
|
||||
init_waitqueue_head(chan->vc_wq);
|
||||
chan->ring_bufs_avail = 1;
|
||||
@ -623,6 +623,8 @@ static int p9_virtio_probe(struct virtio_device *vdev)
|
||||
|
||||
return 0;
|
||||
|
||||
out_remove_file:
|
||||
sysfs_remove_file(&vdev->dev.kobj, &dev_attr_mount_tag.attr);
|
||||
out_free_tag:
|
||||
kfree(tag);
|
||||
out_free_vq:
|
||||
|
@ -1168,6 +1168,9 @@ static struct sctp_association *__sctp_rcv_asconf_lookup(
|
||||
union sctp_addr_param *param;
|
||||
union sctp_addr paddr;
|
||||
|
||||
if (ntohs(ch->length) < sizeof(*asconf) + sizeof(struct sctp_paramhdr))
|
||||
return NULL;
|
||||
|
||||
/* Skip over the ADDIP header and find the Address parameter */
|
||||
param = (union sctp_addr_param *)(asconf + 1);
|
||||
|
||||
|
@ -2157,9 +2157,16 @@ static enum sctp_ierror sctp_verify_param(struct net *net,
|
||||
break;
|
||||
|
||||
case SCTP_PARAM_SET_PRIMARY:
|
||||
if (ep->asconf_enable)
|
||||
break;
|
||||
goto unhandled;
|
||||
if (!ep->asconf_enable)
|
||||
goto unhandled;
|
||||
|
||||
if (ntohs(param.p->length) < sizeof(struct sctp_addip_param) +
|
||||
sizeof(struct sctp_paramhdr)) {
|
||||
sctp_process_inv_paramlength(asoc, param.p,
|
||||
chunk, err_chunk);
|
||||
retval = SCTP_IERROR_ABORT;
|
||||
}
|
||||
break;
|
||||
|
||||
case SCTP_PARAM_HOST_NAME_ADDRESS:
|
||||
/* Tell the peer, we won't support this param. */
|
||||
|
@ -1960,9 +1960,6 @@ fail2:
|
||||
return error;
|
||||
}
|
||||
|
||||
|
||||
#define list_entry_is_head(pos, head, member) (&pos->member == (head))
|
||||
|
||||
/**
|
||||
* __next_ns - find the next namespace to list
|
||||
* @root: root namespace to stop search at (NOT NULL)
|
||||
|
@ -2864,7 +2864,8 @@ static int kvm_vm_ioctl_create_vcpu(struct kvm *kvm, u32 id)
|
||||
goto unlock_vcpu_destroy;
|
||||
}
|
||||
|
||||
BUG_ON(kvm->vcpus[atomic_read(&kvm->online_vcpus)]);
|
||||
vcpu->vcpu_idx = atomic_read(&kvm->online_vcpus);
|
||||
BUG_ON(kvm->vcpus[vcpu->vcpu_idx]);
|
||||
|
||||
/* Now it's all set up, let userspace reach it */
|
||||
kvm_get_kvm(kvm);
|
||||
@ -2874,7 +2875,7 @@ static int kvm_vm_ioctl_create_vcpu(struct kvm *kvm, u32 id)
|
||||
goto unlock_vcpu_destroy;
|
||||
}
|
||||
|
||||
kvm->vcpus[atomic_read(&kvm->online_vcpus)] = vcpu;
|
||||
kvm->vcpus[vcpu->vcpu_idx] = vcpu;
|
||||
|
||||
/*
|
||||
* Pairs with smp_rmb() in kvm_get_vcpu. Write kvm->vcpus
|
||||
|
Loading…
Reference in New Issue
Block a user