This is the 5.4.149 stable release

-----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAmFQYpIACgkQONu9yGCS
 aT5nNBAAnao6g0C+ZSPUJrX3Aa9I+dcP8le9T4faUD1E8fa3XSIrDhUrZwhvdI06
 ljos1XzQe60/CJmY1jnfL4TOQqrfS6tLTseVGIhFAtJQorxxQwzuCEq/2sqlYz/A
 BEN1/g1XjXyFMmKw598luTClbHk91pnScxA0ZyJ28lhNeBnpuHKK5+PvqNT2bg6G
 Vc8IGPv7cd48FjfwBzDuWklsQE9FFHPtq2eyhAk6K9QbECnP9wgfdrPx87oyRGN6
 tPtSEhlwNM8EEaFZ1/1zgTgj3n35I3LXGfV19YRid20y1SbwB8yFloidx8SjaAOE
 rMpiyxcDgfYoeHw5WBt+f/QVLx3Ia8uEFgwFSHyD1btNrPGdAlatWgXSrNBLvQuy
 jIoDtqY9L5Ty3T3rBjyDlXl0oUUDD4JyVteGsrXlzVEHa7YaLIhvrcQ6Es09XDZX
 TXPinEMPTohO7/cCVHjXOuREXeYukXLrKuZBBNTutANP9Yx7Tj9yAwVtrnakkv1B
 WykWhjJSmOHcj3q8hm9i1GI8qo3sWIwvM0c8in1OLzA+vpjXPR9onA8PHYidj8LY
 f4E3I2Xp+zBj8WljLgHIJhpwdo8jq5StdYPl0y3Na/ZVU3El3VKtwiT0RieOnKfp
 aOj16+CdbCDpdDZofqu/Zio4Do0RFPsHHeEnfedH38aOw1bjctw=
 =e/m/
 -----END PGP SIGNATURE-----
gpgsig -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCgAdFiEEdQaENiSDAlGTDEbB7G51OISzHs0FAmFRuk4ACgkQ7G51OISz
 Hs05Iw/9EJFb9xJJhi1GzCVg6X5rF4Nna8yNwZOtEWtnG3fE0FcJJ1AP8pN0l93v
 yI+c6KbNl30hqI25ji/VEgoLlOOe5/5QctnPXryXrkf4jvoXQC2TZSGhFfznBlYK
 XcfbaYSlCf9fgaFQBDfi9S1/k/8yVDs9QKIKf6aUlXKmNWhF9I3Fp6nQ1cnaZjMp
 tMto2WOilgCFMwb9EuSTuSPHE0bDqmwk7npVQ8/HA2QdMzLySwHVUZKD8vC9Kvsc
 1csT8lkWak+7N5p2RNyrJAORL9OBvhdPZVyh0cMet00T+zDV0aUDpn3/6R4gnFUz
 TmRdG/oRMqlkhQYvKpFiE295AtU41TMjc9Mb0dg9KYCsCh9yTGgZdR0ftYOHFb+o
 wgXBkURAbj7JETTtRBVMRDEV8Zo1iJjpvGmILT8jO7IsQppkTh2JcjI5rnoxUdGB
 eAd5W36aZfnOEPdUpoWf2mNF8bgQodDVYHc8cPlknJPKP3GM6EZDUNEkKRFTe8hD
 /IP4yLrOvqaxP9n82bPNuRTpKM365Q+rmHkPlTof8ZLYCB52gdJBg9/oTVGfuLfE
 o+DtHU1sBuzukyPEJE2okb3D9uqKM0/xnUxhXQqxDFhXMcI5npllQ7FK71FOWtcp
 4YTGwf/Y4DmK0tckzNg1URnzATRR+6b8zjMR1zc9gfUawnBhwWU=
 =zMkr
 -----END PGP SIGNATURE-----

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

This is the 5.4.149 stable release

Signed-off-by: Andrey Zhizhikin <andrey.zhizhikin@leica-geosystems.com>
This commit is contained in:
Andrey Zhizhikin 2021-09-27 12:34:19 +00:00
commit 913880358f
53 changed files with 407 additions and 267 deletions

View File

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

View File

@ -16,6 +16,9 @@ extern void __gnu_mcount_nc(void);
#ifdef CONFIG_DYNAMIC_FTRACE #ifdef CONFIG_DYNAMIC_FTRACE
struct dyn_arch_ftrace { struct dyn_arch_ftrace {
#ifdef CONFIG_ARM_MODULE_PLTS
struct module *mod;
#endif
}; };
static inline unsigned long ftrace_call_adjust(unsigned long addr) static inline unsigned long ftrace_call_adjust(unsigned long addr)

View File

@ -13,18 +13,18 @@ arm_gen_nop(void)
} }
unsigned long 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 static inline unsigned long
arm_gen_branch(unsigned long pc, unsigned long addr) 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 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 #endif

View File

@ -19,8 +19,18 @@ enum {
}; };
#endif #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 mod_plt_sec {
struct elf32_shdr *plt; struct elf32_shdr *plt;
struct plt_entries *plt_ent;
int plt_count; int plt_count;
}; };

View File

@ -71,9 +71,10 @@ int ftrace_arch_code_modify_post_process(void)
return 0; 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, 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; int ret;
pc = (unsigned long)&ftrace_call; 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); ret = ftrace_modify_code(pc, 0, new, false);
#ifdef CONFIG_DYNAMIC_FTRACE_WITH_REGS #ifdef CONFIG_DYNAMIC_FTRACE_WITH_REGS
if (!ret) { if (!ret) {
pc = (unsigned long)&ftrace_regs_call; 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); 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 new, old;
unsigned long ip = rec->ip; 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); 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); 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 new, old;
unsigned long ip = rec->ip; 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); 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, int ftrace_make_nop(struct module *mod,
struct dyn_ftrace *rec, unsigned long addr) struct dyn_ftrace *rec, unsigned long addr)
{ {
unsigned long aaddr = adjust_address(rec, addr);
unsigned long ip = rec->ip; unsigned long ip = rec->ip;
unsigned long old; unsigned long old;
unsigned long new; unsigned long new;
int ret; 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); new = ftrace_nop_replace(rec);
ret = ftrace_modify_code(ip, old, new, true); ret = ftrace_modify_code(ip, old, new, true);

View File

@ -3,8 +3,9 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <asm/opcodes.h> #include <asm/opcodes.h>
static unsigned long static unsigned long __arm_gen_branch_thumb2(unsigned long pc,
__arm_gen_branch_thumb2(unsigned long pc, unsigned long addr, bool link) unsigned long addr, bool link,
bool warn)
{ {
unsigned long s, j1, j2, i1, i2, imm10, imm11; unsigned long s, j1, j2, i1, i2, imm10, imm11;
unsigned long first, second; 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); offset = (long)addr - (long)(pc + 4);
if (offset < -16777216 || offset > 16777214) { if (offset < -16777216 || offset > 16777214) {
WARN_ON_ONCE(1); WARN_ON_ONCE(warn);
return 0; return 0;
} }
@ -33,8 +34,8 @@ __arm_gen_branch_thumb2(unsigned long pc, unsigned long addr, bool link)
return __opcode_thumb32_compose(first, second); return __opcode_thumb32_compose(first, second);
} }
static unsigned long static unsigned long __arm_gen_branch_arm(unsigned long pc, unsigned long addr,
__arm_gen_branch_arm(unsigned long pc, unsigned long addr, bool link) bool link, bool warn)
{ {
unsigned long opcode = 0xea000000; unsigned long opcode = 0xea000000;
long offset; long offset;
@ -44,7 +45,7 @@ __arm_gen_branch_arm(unsigned long pc, unsigned long addr, bool link)
offset = (long)addr - (long)(pc + 8); offset = (long)addr - (long)(pc + 8);
if (unlikely(offset < -33554432 || offset > 33554428)) { if (unlikely(offset < -33554432 || offset > 33554428)) {
WARN_ON_ONCE(1); WARN_ON_ONCE(warn);
return 0; return 0;
} }
@ -54,10 +55,10 @@ __arm_gen_branch_arm(unsigned long pc, unsigned long addr, bool link)
} }
unsigned long 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)) if (IS_ENABLED(CONFIG_THUMB2_KERNEL))
return __arm_gen_branch_thumb2(pc, addr, link); return __arm_gen_branch_thumb2(pc, addr, link, warn);
else else
return __arm_gen_branch_arm(pc, addr, link); return __arm_gen_branch_arm(pc, addr, link, warn);
} }

View File

@ -4,6 +4,7 @@
*/ */
#include <linux/elf.h> #include <linux/elf.h>
#include <linux/ftrace.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/sort.h> #include <linux/sort.h>
@ -11,10 +12,6 @@
#include <asm/cache.h> #include <asm/cache.h>
#include <asm/opcodes.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 #ifdef CONFIG_THUMB2_KERNEL
#define PLT_ENT_LDR __opcode_to_mem_thumb32(0xf8dff000 | \ #define PLT_ENT_LDR __opcode_to_mem_thumb32(0xf8dff000 | \
(PLT_ENT_STRIDE - 4)) (PLT_ENT_STRIDE - 4))
@ -23,9 +20,11 @@
(PLT_ENT_STRIDE - 8)) (PLT_ENT_STRIDE - 8))
#endif #endif
struct plt_entries { static const u32 fixed_plts[] = {
u32 ldr[PLT_ENT_COUNT]; #ifdef CONFIG_DYNAMIC_FTRACE
u32 lit[PLT_ENT_COUNT]; FTRACE_ADDR,
MCOUNT_ADDR,
#endif
}; };
static bool in_init(const struct module *mod, unsigned long loc) 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; 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) 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 : struct mod_plt_sec *pltsec = !in_init(mod, loc) ? &mod->arch.core :
&mod->arch.init; &mod->arch.init;
struct plt_entries *plt;
int idx;
struct plt_entries *plt = (struct plt_entries *)pltsec->plt->sh_addr; /* cache the address, ELF header is available only during module load */
int idx = 0; 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 * Look for an existing entry pointing to 'val'. Given that the
* relocations are sorted, this will be the last entry we allocated. * 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, int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *sechdrs,
char *secstrings, struct module *mod) char *secstrings, struct module *mod)
{ {
unsigned long core_plts = 0; unsigned long core_plts = ARRAY_SIZE(fixed_plts);
unsigned long init_plts = 0; unsigned long init_plts = ARRAY_SIZE(fixed_plts);
Elf32_Shdr *s, *sechdrs_end = sechdrs + ehdr->e_shnum; Elf32_Shdr *s, *sechdrs_end = sechdrs + ehdr->e_shnum;
Elf32_Sym *syms = NULL; 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, mod->arch.core.plt->sh_size = round_up(core_plts * PLT_ENT_SIZE,
sizeof(struct plt_entries)); sizeof(struct plt_entries));
mod->arch.core.plt_count = 0; 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_type = SHT_NOBITS;
mod->arch.init.plt->sh_flags = SHF_EXECINSTR | SHF_ALLOC; 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, mod->arch.init.plt->sh_size = round_up(init_plts * PLT_ENT_SIZE,
sizeof(struct plt_entries)); sizeof(struct plt_entries));
mod->arch.init.plt_count = 0; mod->arch.init.plt_count = 0;
mod->arch.init.plt_ent = NULL;
pr_debug("%s: plt=%x, init.plt=%x\n", __func__, pr_debug("%s: plt=%x, init.plt=%x\n", __func__,
mod->arch.core.plt->sh_size, mod->arch.init.plt->sh_size); mod->arch.core.plt->sh_size, mod->arch.init.plt->sh_size);

View File

@ -469,7 +469,11 @@ static void __init free_highpages(void)
void __init mem_init(void) void __init mem_init(void)
{ {
#ifdef CONFIG_ARM_LPAE #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 #endif
set_max_mapnr(pfn_to_page(max_pfn) - mem_map); set_max_mapnr(pfn_to_page(max_pfn) - mem_map);

View File

@ -43,7 +43,7 @@ static void ci_leaf_init(struct cacheinfo *this_leaf,
this_leaf->type = type; 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; unsigned int ctype, level, leaves, fw_level;
struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu); struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu);
@ -78,7 +78,7 @@ static int __init_cache_level(unsigned int cpu)
return 0; return 0;
} }
static int __populate_cache_leaves(unsigned int cpu) int populate_cache_leaves(unsigned int cpu)
{ {
unsigned int level, idx; unsigned int level, idx;
enum cache_type type; enum cache_type type;
@ -97,6 +97,3 @@ static int __populate_cache_leaves(unsigned int cpu)
} }
return 0; return 0;
} }
DEFINE_SMP_CALL_CACHE_FUNCTION(init_cache_level)
DEFINE_SMP_CALL_CACHE_FUNCTION(populate_cache_leaves)

View File

@ -17,7 +17,7 @@ do { \
leaf++; \ leaf++; \
} while (0) } while (0)
static int __init_cache_level(unsigned int cpu) int init_cache_level(unsigned int cpu)
{ {
struct cpuinfo_mips *c = &current_cpu_data; struct cpuinfo_mips *c = &current_cpu_data;
struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu); 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); 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 = &current_cpu_data; struct cpuinfo_mips *c = &current_cpu_data;
struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu); struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu);
@ -98,6 +98,3 @@ static int __populate_cache_leaves(unsigned int cpu)
return 0; return 0;
} }
DEFINE_SMP_CALL_CACHE_FUNCTION(init_cache_level)
DEFINE_SMP_CALL_CACHE_FUNCTION(populate_cache_leaves)

View File

@ -16,7 +16,7 @@ static void ci_leaf_init(struct cacheinfo *this_leaf,
this_leaf->type = type; 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 cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu);
struct device_node *np = of_cpu_device_node_get(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; 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 cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu);
struct cacheinfo *this_leaf = this_cpu_ci->info_list; struct cacheinfo *this_leaf = this_cpu_ci->info_list;
@ -95,6 +95,3 @@ static int __populate_cache_leaves(unsigned int cpu)
return 0; return 0;
} }
DEFINE_SMP_CALL_CACHE_FUNCTION(init_cache_level)
DEFINE_SMP_CALL_CACHE_FUNCTION(populate_cache_leaves)

View File

@ -128,7 +128,7 @@ static long get_pfn(unsigned long user_addr, unsigned long access,
down_read(&current->mm->mmap_sem); down_read(&current->mm->mmap_sem);
ret = -EINVAL; ret = -EINVAL;
vma = find_vma(current->mm, user_addr); vma = find_vma(current->mm, user_addr);
if (!vma) if (!vma || user_addr < vma->vm_start)
goto out; goto out;
ret = -EACCES; ret = -EACCES;
if (!(vma->vm_flags & access)) if (!(vma->vm_flags & access))

View File

@ -994,7 +994,7 @@ static int virtio_uml_probe(struct platform_device *pdev)
rc = os_connect_socket(pdata->socket_path); rc = os_connect_socket(pdata->socket_path);
} while (rc == -EINTR); } while (rc == -EINTR);
if (rc < 0) if (rc < 0)
return rc; goto error_free;
vu_dev->sock = rc; vu_dev->sock = rc;
rc = vhost_user_init(vu_dev); rc = vhost_user_init(vu_dev);
@ -1010,6 +1010,8 @@ static int virtio_uml_probe(struct platform_device *pdev)
error_init: error_init:
os_close_file(vu_dev->sock); os_close_file(vu_dev->sock);
error_free:
kfree(vu_dev);
return rc; return rc;
} }

View File

@ -985,7 +985,7 @@ static void ci_leaf_init(struct cacheinfo *this_leaf,
this_leaf->priv = base->nb; 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); 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; 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; unsigned int idx, ret;
struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu); struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu);
@ -1033,6 +1033,3 @@ static int __populate_cache_leaves(unsigned int cpu)
return 0; return 0;
} }
DEFINE_SMP_CALL_CACHE_FUNCTION(init_cache_level)
DEFINE_SMP_CALL_CACHE_FUNCTION(populate_cache_leaves)

View File

@ -2414,6 +2414,7 @@ int blk_throtl_init(struct request_queue *q)
void blk_throtl_exit(struct request_queue *q) void blk_throtl_exit(struct request_queue *q)
{ {
BUG_ON(!q->td); BUG_ON(!q->td);
del_timer_sync(&q->td->service_queue.pending_timer);
throtl_shutdown_wq(q); throtl_shutdown_wq(q);
blkcg_deactivate_policy(q, &blkcg_policy_throtl); blkcg_deactivate_policy(q, &blkcg_policy_throtl);
free_percpu(q->td->latency_buckets[READ]); free_percpu(q->td->latency_buckets[READ]);

View File

@ -142,6 +142,26 @@ static struct mcfg_fixup mcfg_quirks[] = {
XGENE_V2_ECAM_MCFG(4, 0), XGENE_V2_ECAM_MCFG(4, 0),
XGENE_V2_ECAM_MCFG(4, 1), XGENE_V2_ECAM_MCFG(4, 1),
XGENE_V2_ECAM_MCFG(4, 2), 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]; static char mcfg_oem_id[ACPI_OEM_ID_SIZE];

View File

@ -305,7 +305,7 @@ config INTEL_IDMA64
config INTEL_IOATDMA config INTEL_IOATDMA
tristate "Intel I/OAT DMA support" tristate "Intel I/OAT DMA support"
depends on PCI && X86_64 depends on PCI && X86_64 && !UML
select DMA_ENGINE select DMA_ENGINE
select DMA_ENGINE_RAID select DMA_ENGINE_RAID
select DCA select DCA

View File

@ -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]; 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) || if (si->mmio_base_low != lower_32_bits(mem) ||
si->mmio_base_high != upper_32_bits(mem) || si->mmio_base_high != upper_32_bits(mem))
si->gsi_interrupt != irq) 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; return 0;
dev_dbg(&adev->dev, "matches with %.4s%04X (rev %u)\n", dev_dbg(&adev->dev, "matches with %.4s%04X (rev %u)\n",

View File

@ -1230,6 +1230,7 @@ static const struct of_device_id sprd_dma_match[] = {
{ .compatible = "sprd,sc9860-dma", }, { .compatible = "sprd,sc9860-dma", },
{}, {},
}; };
MODULE_DEVICE_TABLE(of, sprd_dma_match);
static int __maybe_unused sprd_dma_runtime_suspend(struct device *dev) static int __maybe_unused sprd_dma_runtime_suspend(struct device *dev)
{ {

View File

@ -2703,7 +2703,7 @@ static int xilinx_dma_probe(struct platform_device *pdev)
xdev->ext_addr = false; xdev->ext_addr = false;
/* Set the dma mask bits */ /* 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 */ /* Initialize the DMA engine */
xdev->common.dev = &pdev->dev; xdev->common.dev = &pdev->dev;

View File

@ -57,7 +57,7 @@ nvkm_control_mthd_pstate_info(struct nvkm_control *ctrl, void *data, u32 size)
args->v0.count = 0; args->v0.count = 0;
args->v0.ustate_ac = NVIF_CONTROL_PSTATE_INFO_V0_USTATE_DISABLE; args->v0.ustate_ac = NVIF_CONTROL_PSTATE_INFO_V0_USTATE_DISABLE;
args->v0.ustate_dc = 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; args->v0.pstate = NVIF_CONTROL_PSTATE_INFO_V0_PSTATE_UNKNOWN;
} }

View File

@ -239,9 +239,10 @@ int genphy_c45_read_link(struct phy_device *phydev)
/* The link state is latched low so that momentary link /* The link state is latched low so that momentary link
* drops can be detected. Do not double-read the status * 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); val = phy_read_mmd(phydev, devad, MDIO_STAT1);
if (val < 0) if (val < 0)
return val; return val;

View File

@ -1775,9 +1775,10 @@ int genphy_update_link(struct phy_device *phydev)
/* The link state is latched low so that momentary link /* The link state is latched low so that momentary link
* drops can be detected. Do not double-read the status * 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); status = phy_read(phydev, MII_BMSR);
if (status < 0) if (status < 0)
return status; return status;

View File

@ -156,15 +156,6 @@ static inline struct dino_device *DINO_DEV(struct pci_hba_data *hba)
return container_of(hba, struct dino_device, 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 * 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 ); DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_CIRRUS, PCI_DEVICE_ID_CIRRUS_6832, quirk_cirrus_cardbus );
#ifdef CONFIG_TULIP #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) static void pci_fixup_tulip(struct pci_dev *dev)
{ {
if (!pci_dev_is_behind_card_dino(dev)) if (!pci_dev_is_behind_card_dino(dev))

View File

@ -188,6 +188,8 @@
#define MSI_IRQ_NUM 32 #define MSI_IRQ_NUM 32
#define CFG_RD_CRS_VAL 0xffff0001
struct advk_pcie { struct advk_pcie {
struct platform_device *pdev; struct platform_device *pdev;
void __iomem *base; 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); 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; struct device *dev = &pcie->pdev->dev;
u32 reg; u32 reg;
@ -407,9 +409,30 @@ static int advk_pcie_check_pio_status(struct advk_pcie *pcie, u32 *val)
strcomp_status = "UR"; strcomp_status = "UR";
break; break;
case PIO_COMPLETION_STATUS_CRS: 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: /* PCIe r4.0, sec 2.3.2, says:
* If CRS Software Visibility is not enabled, the Root Complex * If CRS Software Visibility is not enabled, the Root Complex
* must re-issue the Configuration Request as a new Request. * 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 * A Root Complex implementation may choose to limit the number
* of Configuration Request/CRS Completion Status loops before * of Configuration Request/CRS Completion Status loops before
* determining that something is wrong with the target of the * 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: { case PCI_EXP_RTCTL: {
u32 val = advk_readl(pcie, PCIE_ISR0_MASK_REG); u32 val = advk_readl(pcie, PCIE_ISR0_MASK_REG);
*value = (val & PCIE_MSG_PM_PME_MASK) ? 0 : PCI_EXP_RTCTL_PMEIE; *value = (val & PCIE_MSG_PM_PME_MASK) ? 0 : PCI_EXP_RTCTL_PMEIE;
*value |= PCI_EXP_RTCAP_CRSVIS << 16;
return PCI_BRIDGE_EMUL_HANDLED; 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) static int advk_sw_pci_bridge_init(struct advk_pcie *pcie)
{ {
struct pci_bridge_emul *bridge = &pcie->bridge; struct pci_bridge_emul *bridge = &pcie->bridge;
int ret;
bridge->conf.vendor = advk_readl(pcie, PCIE_CORE_DEV_ID_REG) & 0xffff; bridge->conf.vendor = advk_readl(pcie, PCIE_CORE_DEV_ID_REG) & 0xffff;
bridge->conf.device = advk_readl(pcie, PCIE_CORE_DEV_ID_REG) >> 16; 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->data = pcie;
bridge->ops = &advk_pci_bridge_emul_ops; 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, 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) int where, int size, u32 *val)
{ {
struct advk_pcie *pcie = bus->sysdata; struct advk_pcie *pcie = bus->sysdata;
bool allow_crs;
u32 reg; u32 reg;
int ret; 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, return pci_bridge_emul_conf_read(&pcie->bridge, where,
size, val); 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 (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; *val = 0xffffffff;
return PCIBIOS_SET_FAILED; 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); advk_writel(pcie, 1, PIO_START);
ret = advk_pcie_wait_pio(pcie); 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; return PCIBIOS_SET_FAILED;
}
/* Check PIO status and get the read result */ /* 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) { if (ret < 0) {
*val = 0xffffffff; *val = 0xffffffff;
return PCIBIOS_SET_FAILED; return PCIBIOS_SET_FAILED;
@ -737,7 +798,7 @@ static int advk_pcie_wr_conf(struct pci_bus *bus, u32 devfn,
if (ret < 0) if (ret < 0)
return PCIBIOS_SET_FAILED; return PCIBIOS_SET_FAILED;
ret = advk_pcie_check_pio_status(pcie, NULL); ret = advk_pcie_check_pio_status(pcie, false, NULL);
if (ret < 0) if (ret < 0)
return PCIBIOS_SET_FAILED; return PCIBIOS_SET_FAILED;

View File

@ -164,4 +164,14 @@ struct pci_ecam_ops pci_32b_ops = {
.write = pci_generic_config_write32, .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 #endif

View File

@ -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, int pci_bridge_emul_init(struct pci_bridge_emul *bridge,
unsigned int flags) 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.header_type = PCI_HEADER_TYPE_BRIDGE;
bridge->conf.cache_line_size = 0x10; 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, bridge->pci_regs_behavior = kmemdup(pci_regs_behavior,
sizeof(pci_regs_behavior), sizeof(pci_regs_behavior),
GFP_KERNEL); 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->conf.capabilities_pointer = PCI_CAP_PCIE_START;
bridge->pcie_conf.cap_id = PCI_CAP_ID_EXP; bridge->pcie_conf.cap_id = PCI_CAP_ID_EXP;
/* Set PCIe v2, root port, slot support */ /* Set PCIe v2, root port, slot support */
bridge->pcie_conf.cap = PCI_EXP_TYPE_ROOT_PORT << 4 | 2 | bridge->pcie_conf.cap =
PCI_EXP_FLAGS_SLOT; cpu_to_le16(PCI_EXP_TYPE_ROOT_PORT << 4 | 2 |
PCI_EXP_FLAGS_SLOT);
bridge->pcie_cap_regs_behavior = bridge->pcie_cap_regs_behavior =
kmemdup(pcie_cap_regs_behavior, kmemdup(pcie_cap_regs_behavior,
sizeof(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; int reg = where & ~3;
pci_bridge_emul_read_status_t (*read_op)(struct pci_bridge_emul *bridge, pci_bridge_emul_read_status_t (*read_op)(struct pci_bridge_emul *bridge,
int reg, u32 *value); int reg, u32 *value);
u32 *cfgspace; __le32 *cfgspace;
const struct pci_bridge_reg_behavior *behavior; const struct pci_bridge_reg_behavior *behavior;
if (bridge->has_pcie && reg >= PCI_CAP_PCIE_END) { 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) { if (bridge->has_pcie && reg >= PCI_CAP_PCIE_START) {
reg -= PCI_CAP_PCIE_START; reg -= PCI_CAP_PCIE_START;
read_op = bridge->ops->read_pcie; read_op = bridge->ops->read_pcie;
cfgspace = (u32 *) &bridge->pcie_conf; cfgspace = (__le32 *) &bridge->pcie_conf;
behavior = bridge->pcie_cap_regs_behavior; behavior = bridge->pcie_cap_regs_behavior;
} else { } else {
read_op = bridge->ops->read_base; read_op = bridge->ops->read_base;
cfgspace = (u32 *) &bridge->conf; cfgspace = (__le32 *) &bridge->conf;
behavior = bridge->pci_regs_behavior; 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; ret = PCI_BRIDGE_EMUL_NOT_HANDLED;
if (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 * 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; int mask, ret, old, new, shift;
void (*write_op)(struct pci_bridge_emul *bridge, int reg, void (*write_op)(struct pci_bridge_emul *bridge, int reg,
u32 old, u32 new, u32 mask); u32 old, u32 new, u32 mask);
u32 *cfgspace; __le32 *cfgspace;
const struct pci_bridge_reg_behavior *behavior; const struct pci_bridge_reg_behavior *behavior;
if (bridge->has_pcie && reg >= PCI_CAP_PCIE_END) 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) { if (bridge->has_pcie && reg >= PCI_CAP_PCIE_START) {
reg -= PCI_CAP_PCIE_START; reg -= PCI_CAP_PCIE_START;
write_op = bridge->ops->write_pcie; write_op = bridge->ops->write_pcie;
cfgspace = (u32 *) &bridge->pcie_conf; cfgspace = (__le32 *) &bridge->pcie_conf;
behavior = bridge->pcie_cap_regs_behavior; behavior = bridge->pcie_cap_regs_behavior;
} else { } else {
write_op = bridge->ops->write_base; write_op = bridge->ops->write_base;
cfgspace = (u32 *) &bridge->conf; cfgspace = (__le32 *) &bridge->conf;
behavior = bridge->pci_regs_behavior; 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 */ /* Clear the W1C bits */
new &= ~((value << shift) & (behavior[reg / 4].w1c & mask)); new &= ~((value << shift) & (behavior[reg / 4].w1c & mask));
cfgspace[reg / 4] = new; cfgspace[reg / 4] = cpu_to_le32(new);
if (write_op) if (write_op)
write_op(bridge, reg, old, new, mask); write_op(bridge, reg, old, new, mask);

View File

@ -6,65 +6,65 @@
/* PCI configuration space of a PCI-to-PCI bridge. */ /* PCI configuration space of a PCI-to-PCI bridge. */
struct pci_bridge_emul_conf { struct pci_bridge_emul_conf {
u16 vendor; __le16 vendor;
u16 device; __le16 device;
u16 command; __le16 command;
u16 status; __le16 status;
u32 class_revision; __le32 class_revision;
u8 cache_line_size; u8 cache_line_size;
u8 latency_timer; u8 latency_timer;
u8 header_type; u8 header_type;
u8 bist; u8 bist;
u32 bar[2]; __le32 bar[2];
u8 primary_bus; u8 primary_bus;
u8 secondary_bus; u8 secondary_bus;
u8 subordinate_bus; u8 subordinate_bus;
u8 secondary_latency_timer; u8 secondary_latency_timer;
u8 iobase; u8 iobase;
u8 iolimit; u8 iolimit;
u16 secondary_status; __le16 secondary_status;
u16 membase; __le16 membase;
u16 memlimit; __le16 memlimit;
u16 pref_mem_base; __le16 pref_mem_base;
u16 pref_mem_limit; __le16 pref_mem_limit;
u32 prefbaseupper; __le32 prefbaseupper;
u32 preflimitupper; __le32 preflimitupper;
u16 iobaseupper; __le16 iobaseupper;
u16 iolimitupper; __le16 iolimitupper;
u8 capabilities_pointer; u8 capabilities_pointer;
u8 reserve[3]; u8 reserve[3];
u32 romaddr; __le32 romaddr;
u8 intline; u8 intline;
u8 intpin; u8 intpin;
u16 bridgectrl; __le16 bridgectrl;
}; };
/* PCI configuration space of the PCIe capabilities */ /* PCI configuration space of the PCIe capabilities */
struct pci_bridge_emul_pcie_conf { struct pci_bridge_emul_pcie_conf {
u8 cap_id; u8 cap_id;
u8 next; u8 next;
u16 cap; __le16 cap;
u32 devcap; __le32 devcap;
u16 devctl; __le16 devctl;
u16 devsta; __le16 devsta;
u32 lnkcap; __le32 lnkcap;
u16 lnkctl; __le16 lnkctl;
u16 lnksta; __le16 lnksta;
u32 slotcap; __le32 slotcap;
u16 slotctl; __le16 slotctl;
u16 slotsta; __le16 slotsta;
u16 rootctl; __le16 rootctl;
u16 rsvd; __le16 rootcap;
u32 rootsta; __le32 rootsta;
u32 devcap2; __le32 devcap2;
u16 devctl2; __le16 devctl2;
u16 devsta2; __le16 devsta2;
u32 lnkcap2; __le32 lnkcap2;
u16 lnkctl2; __le16 lnkctl2;
u16 lnksta2; __le16 lnksta2;
u32 slotcap2; __le32 slotcap2;
u16 slotctl2; __le16 slotctl2;
u16 slotsta2; __le16 slotsta2;
}; };
struct pci_bridge_emul; struct pci_bridge_emul;

View File

@ -329,23 +329,7 @@ err_pm_disable:
static int img_pwm_remove(struct platform_device *pdev) static int img_pwm_remove(struct platform_device *pdev)
{ {
struct img_pwm_chip *pwm_chip = platform_get_drvdata(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); pm_runtime_disable(&pdev->dev);
if (!pm_runtime_status_suspended(&pdev->dev)) if (!pm_runtime_status_suspended(&pdev->dev))
img_pwm_runtime_suspend(&pdev->dev); img_pwm_runtime_suspend(&pdev->dev);

View File

@ -120,17 +120,17 @@ static int lpc32xx_pwm_probe(struct platform_device *pdev)
lpc32xx->chip.npwm = 1; lpc32xx->chip.npwm = 1;
lpc32xx->chip.base = -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); ret = pwmchip_add(&lpc32xx->chip);
if (ret < 0) { if (ret < 0) {
dev_err(&pdev->dev, "failed to add PWM chip, error %d\n", ret); dev_err(&pdev->dev, "failed to add PWM chip, error %d\n", ret);
return 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); platform_set_drvdata(pdev, lpc32xx);
return 0; return 0;

View File

@ -383,20 +383,6 @@ static int rockchip_pwm_remove(struct platform_device *pdev)
{ {
struct rockchip_pwm_chip *pc = platform_get_drvdata(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->pclk);
clk_unprepare(pc->clk); clk_unprepare(pc->clk);

View File

@ -225,8 +225,6 @@ static int stm32_pwm_lp_remove(struct platform_device *pdev)
{ {
struct stm32_pwm_lp *priv = platform_get_drvdata(pdev); struct stm32_pwm_lp *priv = platform_get_drvdata(pdev);
pwm_disable(&priv->chip.pwms[0]);
return pwmchip_remove(&priv->chip); return pwmchip_remove(&priv->chip);
} }

View File

@ -625,6 +625,7 @@ config RTC_DRV_FM3130
config RTC_DRV_RX8010 config RTC_DRV_RX8010
tristate "Epson RX8010SJ" tristate "Epson RX8010SJ"
select REGMAP_I2C
help help
If you say yes here you get support for the Epson RX8010SJ RTC If you say yes here you get support for the Epson RX8010SJ RTC
chip. chip.

View File

@ -4338,7 +4338,7 @@ static void TranslateRxSignalStuff819xUsb(struct sk_buff *skb,
bpacket_match_bssid = (type != IEEE80211_FTYPE_CTL) && 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)) (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); && (!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)); (ether_addr_equal(praddr, priv->ieee80211->dev->dev_addr));
if (WLAN_FC_GET_FRAMETYPE(fc) == IEEE80211_STYPE_BEACON) if (WLAN_FC_GET_FRAMETYPE(fc) == IEEE80211_STYPE_BEACON)

View File

@ -1070,6 +1070,7 @@ static int exynos_tmu_probe(struct platform_device *pdev)
data->sclk = devm_clk_get(&pdev->dev, "tmu_sclk"); data->sclk = devm_clk_get(&pdev->dev, "tmu_sclk");
if (IS_ERR(data->sclk)) { if (IS_ERR(data->sclk)) {
dev_err(&pdev->dev, "Failed to get sclk\n"); dev_err(&pdev->dev, "Failed to get sclk\n");
ret = PTR_ERR(data->sclk);
goto err_clk; goto err_clk;
} else { } else {
ret = clk_prepare_enable(data->sclk); ret = clk_prepare_enable(data->sclk);

View File

@ -2070,7 +2070,7 @@ static void restore_cur(struct vc_data *vc)
enum { ESnormal, ESesc, ESsquare, ESgetpars, ESfunckey, enum { ESnormal, ESesc, ESsquare, ESgetpars, ESfunckey,
EShash, ESsetG0, ESsetG1, ESpercent, EScsiignore, ESnonstd, EShash, ESsetG0, ESsetG1, ESpercent, EScsiignore, ESnonstd,
ESpalette, ESosc }; ESpalette, ESosc, ESapc, ESpm, ESdcs };
/* console_lock is held (except via vc_init()) */ /* console_lock is held (except via vc_init()) */
static void reset_terminal(struct vc_data *vc, int do_clear) 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); 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 */ /* console_lock is held */
static void do_con_trol(struct tty_struct *tty, struct vc_data *vc, int c) static void do_con_trol(struct tty_struct *tty, struct vc_data *vc, int c)
{ {
/* /*
* Control characters can be used in the _middle_ * 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; return;
switch (c) { switch (c) {
case 0: case 0:
return; return;
case 7: case 7:
if (vc->vc_state == ESosc) if (ansi_control_string(vc->vc_state))
vc->vc_state = ESnormal; vc->vc_state = ESnormal;
else if (vc->vc_bell_duration) else if (vc->vc_bell_duration)
kd_mksound(vc->vc_bell_pitch, 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 ']': case ']':
vc->vc_state = ESnonstd; vc->vc_state = ESnonstd;
return; return;
case '_':
vc->vc_state = ESapc;
return;
case '^':
vc->vc_state = ESpm;
return;
case '%': case '%':
vc->vc_state = ESpercent; vc->vc_state = ESpercent;
return; return;
@ -2212,6 +2226,9 @@ static void do_con_trol(struct tty_struct *tty, struct vc_data *vc, int c)
case 'H': case 'H':
vc->vc_tab_stop[7 & (vc->vc_x >> 5)] |= (1 << (vc->vc_x & 31)); vc->vc_tab_stop[7 & (vc->vc_x >> 5)] |= (1 << (vc->vc_x & 31));
return; return;
case 'P':
vc->vc_state = ESdcs;
return;
case 'Z': case 'Z':
respond_ID(tty); respond_ID(tty);
return; 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_translate = set_translate(vc->vc_G1_charset, vc);
vc->vc_state = ESnormal; vc->vc_state = ESnormal;
return; return;
case ESapc:
return;
case ESosc: case ESosc:
return; return;
case ESpm:
return;
case ESdcs:
return;
default: default:
vc->vc_state = ESnormal; vc->vc_state = ESnormal;
} }

View File

@ -742,6 +742,8 @@ static int btrfs_free_stale_devices(const char *path,
struct btrfs_device *device, *tmp_device; struct btrfs_device *device, *tmp_device;
int ret = 0; int ret = 0;
lockdep_assert_held(&uuid_mutex);
if (path) if (path)
ret = -ENOENT; ret = -ENOENT;
@ -1181,11 +1183,12 @@ static struct btrfs_fs_devices *clone_fs_devices(struct btrfs_fs_devices *orig)
struct btrfs_device *orig_dev; struct btrfs_device *orig_dev;
int ret = 0; int ret = 0;
lockdep_assert_held(&uuid_mutex);
fs_devices = alloc_fs_devices(orig->fsid, NULL); fs_devices = alloc_fs_devices(orig->fsid, NULL);
if (IS_ERR(fs_devices)) if (IS_ERR(fs_devices))
return fs_devices; return fs_devices;
mutex_lock(&orig->device_list_mutex);
fs_devices->total_devices = orig->total_devices; fs_devices->total_devices = orig->total_devices;
list_for_each_entry(orig_dev, &orig->devices, dev_list) { 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; device->fs_devices = fs_devices;
fs_devices->num_devices++; fs_devices->num_devices++;
} }
mutex_unlock(&orig->device_list_mutex);
return fs_devices; return fs_devices;
error: error:
mutex_unlock(&orig->device_list_mutex);
free_fs_devices(fs_devices); free_fs_devices(fs_devices);
return ERR_PTR(ret); return ERR_PTR(ret);
} }

View File

@ -1775,6 +1775,8 @@ static u64 __mark_caps_flushing(struct inode *inode,
* try to invalidate mapping pages without blocking. * try to invalidate mapping pages without blocking.
*/ */
static int try_nonblocking_invalidate(struct inode *inode) 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); struct ceph_inode_info *ci = ceph_inode(inode);
u32 invalidating_gen = ci->i_rdcache_gen; u32 invalidating_gen = ci->i_rdcache_gen;

View File

@ -1469,22 +1469,6 @@ retry_snap:
goto out; 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); down_read(&osdc->lock);
map_flags = osdc->osdmap->flags; map_flags = osdc->osdmap->flags;
pool_flags = ceph_pg_pool_flags(osdc->osdmap, ci->i_layout.pool_id); pool_flags = ceph_pg_pool_flags(osdc->osdmap, ci->i_layout.pool_id);
@ -1495,6 +1479,16 @@ retry_snap:
goto out; 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", dout("aio_write %p %llx.%llx %llu~%zd getting caps. i_size %llu\n",
inode, ceph_vinop(inode), pos, count, i_size_read(inode)); inode, ceph_vinop(inode), pos, count, i_size_read(inode));
if (fi->fmode & CEPH_FILE_MODE_LAZY) if (fi->fmode & CEPH_FILE_MODE_LAZY)
@ -1507,6 +1501,12 @@ retry_snap:
if (err < 0) if (err < 0)
goto out; 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", dout("aio_write %p %llx.%llx %llu~%zd got cap refs on %s\n",
inode, ceph_vinop(inode), pos, count, ceph_cap_string(got)); inode, ceph_vinop(inode), pos, count, ceph_cap_string(got));
@ -1590,6 +1590,8 @@ retry_snap:
} }
goto out_unlocked; goto out_unlocked;
out_caps:
ceph_put_cap_refs(ci, got);
out: out:
if (direct_lock) if (direct_lock)
ceph_end_io_direct(inode); ceph_end_io_direct(inode);

View File

@ -64,11 +64,9 @@ static const struct sysfs_ops nilfs_##name##_attr_ops = { \
#define NILFS_DEV_INT_GROUP_TYPE(name, parent_name) \ #define NILFS_DEV_INT_GROUP_TYPE(name, parent_name) \
static void nilfs_##name##_attr_release(struct kobject *kobj) \ static void nilfs_##name##_attr_release(struct kobject *kobj) \
{ \ { \
struct nilfs_sysfs_##parent_name##_subgroups *subgroups; \ struct nilfs_sysfs_##parent_name##_subgroups *subgroups = container_of(kobj, \
struct the_nilfs *nilfs = container_of(kobj->parent, \ struct nilfs_sysfs_##parent_name##_subgroups, \
struct the_nilfs, \ sg_##name##_kobj); \
ns_##parent_name##_kobj); \
subgroups = nilfs->ns_##parent_name##_subgroups; \
complete(&subgroups->sg_##name##_kobj_unregister); \ complete(&subgroups->sg_##name##_kobj_unregister); \
} \ } \
static struct kobj_type nilfs_##name##_ktype = { \ 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, \ err = kobject_init_and_add(kobj, &nilfs_##name##_ktype, parent, \
#name); \ #name); \
if (err) \ if (err) \
return err; \ kobject_put(kobj); \
return 0; \ return err; \
} \ } \
static void nilfs_sysfs_delete_##name##_group(struct the_nilfs *nilfs) \ 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) if (err)
return err; kobject_put(&root->snapshot_kobj);
return 0; return err;
} }
void nilfs_sysfs_delete_snapshot_group(struct nilfs_root *root) 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, err = kobject_init_and_add(&nilfs->ns_dev_kobj, &nilfs_dev_ktype, NULL,
"%s", sb->s_id); "%s", sb->s_id);
if (err) if (err)
goto free_dev_subgroups; goto cleanup_dev_kobject;
err = nilfs_sysfs_create_mounted_snapshots_group(nilfs); err = nilfs_sysfs_create_mounted_snapshots_group(nilfs);
if (err) if (err)
@ -1037,9 +1035,7 @@ delete_mounted_snapshots_group:
nilfs_sysfs_delete_mounted_snapshots_group(nilfs); nilfs_sysfs_delete_mounted_snapshots_group(nilfs);
cleanup_dev_kobject: cleanup_dev_kobject:
kobject_del(&nilfs->ns_dev_kobj); kobject_put(&nilfs->ns_dev_kobj);
free_dev_subgroups:
kfree(nilfs->ns_dev_subgroups); kfree(nilfs->ns_dev_subgroups);
failed_create_device_group: failed_create_device_group:

View File

@ -797,14 +797,13 @@ nilfs_find_or_create_root(struct the_nilfs *nilfs, __u64 cno)
void nilfs_put_root(struct nilfs_root *root) 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); if (refcount_dec_and_lock(&root->count, &nilfs->ns_cptree_lock)) {
spin_lock(&nilfs->ns_cptree_lock);
rb_erase(&root->rb_node, &nilfs->ns_cptree); rb_erase(&root->rb_node, &nilfs->ns_cptree);
spin_unlock(&nilfs->ns_cptree_lock); spin_unlock(&nilfs->ns_cptree_lock);
nilfs_sysfs_delete_snapshot_group(root);
iput(root->ifile); iput(root->ifile);
kfree(root); kfree(root);

View File

@ -78,24 +78,6 @@ struct cpu_cacheinfo {
bool cpu_map_populated; 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); struct cpu_cacheinfo *get_cpu_cacheinfo(unsigned int cpu);
int init_cache_level(unsigned int cpu); int init_cache_level(unsigned int cpu);
int populate_cache_leaves(unsigned int cpu); int populate_cache_leaves(unsigned int cpu);

View File

@ -266,7 +266,8 @@ struct kvm_vcpu {
struct preempt_notifier preempt_notifier; struct preempt_notifier preempt_notifier;
#endif #endif
int cpu; 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 srcu_idx;
int mode; int mode;
u64 requests; 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) static inline int kvm_vcpu_get_idx(struct kvm_vcpu *vcpu)
{ {
struct kvm_vcpu *tmp; return vcpu->vcpu_idx;
int idx;
kvm_for_each_vcpu(idx, tmp, vcpu->kvm)
if (tmp == vcpu)
return idx;
BUG();
} }
#define kvm_for_each_memslot(memslot, slots) \ #define kvm_for_each_memslot(memslot, slots) \

View File

@ -51,6 +51,7 @@ extern struct pci_ecam_ops pci_generic_ecam_ops;
#if defined(CONFIG_ACPI) && defined(CONFIG_PCI_QUIRKS) #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_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 hisi_pcie_ops; /* HiSilicon */
extern struct pci_ecam_ops thunder_pem_ecam_ops; /* Cavium ThunderX 1.x & 2.x */ 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 */ extern struct pci_ecam_ops pci_thunder_ecam_ops; /* Cavium ThunderX 1.x */

View File

@ -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 void thermal_zone_set_trips(struct thermal_zone_device *tz)
{ } { }
static inline struct thermal_cooling_device * 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) const struct thermal_cooling_device_ops *ops)
{ return ERR_PTR(-ENODEV); } { return ERR_PTR(-ENODEV); }
static inline struct thermal_cooling_device * static inline struct thermal_cooling_device *
thermal_of_cooling_device_register(struct device_node *np, 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); } { return ERR_PTR(-ENODEV); }
static inline struct thermal_cooling_device * static inline struct thermal_cooling_device *
devm_thermal_of_cooling_device_register(struct device *dev, devm_thermal_of_cooling_device_register(struct device *dev,

View File

@ -41,7 +41,8 @@ struct profile_hit {
#define NR_PROFILE_GRP (NR_PROFILE_HIT/PROFILE_GRPSZ) #define NR_PROFILE_GRP (NR_PROFILE_HIT/PROFILE_GRPSZ)
static atomic_t *prof_buffer; 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; int prof_on __read_mostly;
EXPORT_SYMBOL_GPL(prof_on); EXPORT_SYMBOL_GPL(prof_on);
@ -67,8 +68,8 @@ int profile_setup(char *str)
if (str[strlen(sleepstr)] == ',') if (str[strlen(sleepstr)] == ',')
str += strlen(sleepstr) + 1; str += strlen(sleepstr) + 1;
if (get_option(&str, &par)) if (get_option(&str, &par))
prof_shift = par; prof_shift = clamp(par, 0, BITS_PER_LONG - 1);
pr_info("kernel sleep profiling enabled (shift: %ld)\n", pr_info("kernel sleep profiling enabled (shift: %u)\n",
prof_shift); prof_shift);
#else #else
pr_warn("kernel sleep profiling requires CONFIG_SCHEDSTATS\n"); pr_warn("kernel sleep profiling requires CONFIG_SCHEDSTATS\n");
@ -78,21 +79,21 @@ int profile_setup(char *str)
if (str[strlen(schedstr)] == ',') if (str[strlen(schedstr)] == ',')
str += strlen(schedstr) + 1; str += strlen(schedstr) + 1;
if (get_option(&str, &par)) if (get_option(&str, &par))
prof_shift = par; prof_shift = clamp(par, 0, BITS_PER_LONG - 1);
pr_info("kernel schedule profiling enabled (shift: %ld)\n", pr_info("kernel schedule profiling enabled (shift: %u)\n",
prof_shift); prof_shift);
} else if (!strncmp(str, kvmstr, strlen(kvmstr))) { } else if (!strncmp(str, kvmstr, strlen(kvmstr))) {
prof_on = KVM_PROFILING; prof_on = KVM_PROFILING;
if (str[strlen(kvmstr)] == ',') if (str[strlen(kvmstr)] == ',')
str += strlen(kvmstr) + 1; str += strlen(kvmstr) + 1;
if (get_option(&str, &par)) if (get_option(&str, &par))
prof_shift = par; prof_shift = clamp(par, 0, BITS_PER_LONG - 1);
pr_info("kernel KVM profiling enabled (shift: %ld)\n", pr_info("kernel KVM profiling enabled (shift: %u)\n",
prof_shift); prof_shift);
} else if (get_option(&str, &par)) { } else if (get_option(&str, &par)) {
prof_shift = par; prof_shift = clamp(par, 0, BITS_PER_LONG - 1);
prof_on = CPU_PROFILING; prof_on = CPU_PROFILING;
pr_info("kernel profiling enabled (shift: %ld)\n", pr_info("kernel profiling enabled (shift: %u)\n",
prof_shift); prof_shift);
} }
return 1; return 1;
@ -468,7 +469,7 @@ read_profile(struct file *file, char __user *buf, size_t count, loff_t *ppos)
unsigned long p = *ppos; unsigned long p = *ppos;
ssize_t read; ssize_t read;
char *pnt; char *pnt;
unsigned int sample_step = 1 << prof_shift; unsigned long sample_step = 1UL << prof_shift;
profile_flip_buffers(); profile_flip_buffers();
if (p >= (prof_len+1)*sizeof(unsigned int)) if (p >= (prof_len+1)*sizeof(unsigned int))

View File

@ -1927,13 +1927,6 @@ static int validate_prctl_map_addr(struct prctl_mm_map *prctl_map)
error = -EINVAL; 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. * Neither we should allow to override limits if they set.
*/ */

View File

@ -868,7 +868,6 @@ config HARDLOCKUP_DETECTOR
depends on HAVE_HARDLOCKUP_DETECTOR_PERF || HAVE_HARDLOCKUP_DETECTOR_ARCH depends on HAVE_HARDLOCKUP_DETECTOR_PERF || HAVE_HARDLOCKUP_DETECTOR_ARCH
select LOCKUP_DETECTOR select LOCKUP_DETECTOR
select HARDLOCKUP_DETECTOR_PERF if HAVE_HARDLOCKUP_DETECTOR_PERF select HARDLOCKUP_DETECTOR_PERF if HAVE_HARDLOCKUP_DETECTOR_PERF
select HARDLOCKUP_DETECTOR_ARCH if HAVE_HARDLOCKUP_DETECTOR_ARCH
help help
Say Y here to enable the kernel to act as a watchdog to detect Say Y here to enable the kernel to act as a watchdog to detect
hard lockups. hard lockups.

View File

@ -605,7 +605,7 @@ static int p9_virtio_probe(struct virtio_device *vdev)
chan->vc_wq = kmalloc(sizeof(wait_queue_head_t), GFP_KERNEL); chan->vc_wq = kmalloc(sizeof(wait_queue_head_t), GFP_KERNEL);
if (!chan->vc_wq) { if (!chan->vc_wq) {
err = -ENOMEM; err = -ENOMEM;
goto out_free_tag; goto out_remove_file;
} }
init_waitqueue_head(chan->vc_wq); init_waitqueue_head(chan->vc_wq);
chan->ring_bufs_avail = 1; chan->ring_bufs_avail = 1;
@ -623,6 +623,8 @@ static int p9_virtio_probe(struct virtio_device *vdev)
return 0; return 0;
out_remove_file:
sysfs_remove_file(&vdev->dev.kobj, &dev_attr_mount_tag.attr);
out_free_tag: out_free_tag:
kfree(tag); kfree(tag);
out_free_vq: out_free_vq:

View File

@ -1168,6 +1168,9 @@ static struct sctp_association *__sctp_rcv_asconf_lookup(
union sctp_addr_param *param; union sctp_addr_param *param;
union sctp_addr paddr; 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 */ /* Skip over the ADDIP header and find the Address parameter */
param = (union sctp_addr_param *)(asconf + 1); param = (union sctp_addr_param *)(asconf + 1);

View File

@ -2157,9 +2157,16 @@ static enum sctp_ierror sctp_verify_param(struct net *net,
break; break;
case SCTP_PARAM_SET_PRIMARY: case SCTP_PARAM_SET_PRIMARY:
if (ep->asconf_enable) if (!ep->asconf_enable)
break; goto unhandled;
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: case SCTP_PARAM_HOST_NAME_ADDRESS:
/* Tell the peer, we won't support this param. */ /* Tell the peer, we won't support this param. */

View File

@ -1960,9 +1960,6 @@ fail2:
return error; return error;
} }
#define list_entry_is_head(pos, head, member) (&pos->member == (head))
/** /**
* __next_ns - find the next namespace to list * __next_ns - find the next namespace to list
* @root: root namespace to stop search at (NOT NULL) * @root: root namespace to stop search at (NOT NULL)

View File

@ -2864,7 +2864,8 @@ static int kvm_vm_ioctl_create_vcpu(struct kvm *kvm, u32 id)
goto unlock_vcpu_destroy; 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 */ /* Now it's all set up, let userspace reach it */
kvm_get_kvm(kvm); kvm_get_kvm(kvm);
@ -2874,7 +2875,7 @@ static int kvm_vm_ioctl_create_vcpu(struct kvm *kvm, u32 id)
goto unlock_vcpu_destroy; 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 * Pairs with smp_rmb() in kvm_get_vcpu. Write kvm->vcpus