powerpc fixes for 5.3 #3
Wire up the new clone3 syscall. A fix for the PAPR SCM nvdimm driver, to fix a crash when firmware gives us a device that's attached to a non-online NUMA node. A fix for a boot failure on 32-bit with KASAN enabled. Three fixes for implicit fall through warnings, some of which are errors for us due to -Werror. Thanks to: Aneesh Kumar K.V, Christophe Leroy, Kees Cook, Santosh Sivaraj, Stephen Rothwell. -----BEGIN PGP SIGNATURE----- iQJHBAABCAAxFiEEJFGtCPCthwEv2Y/bUevqPMjhpYAFAl1GwsMTHG1wZUBlbGxl cm1hbi5pZC5hdQAKCRBR6+o8yOGlgGYjD/4qVVDSPfbEBj+1yH5wIFPNZeEg+VW1 duHRlaWI+p+U0/quj91IFTXXgdOiv9Rk8N2BiypYfDX8qXHZqvTSyK97axURw9vt To45oEVhDLF0YBY8u9kiY3DiSgmyDffpc3b70pcJtSbSgSpe7bgd7lNBi9lnxBM5 KZ+TmwYb35m3c9NtNpy0kiZf9pgBt9X+CkjSxyuDewEcQm3oEPTgjZQ+6EDluoF+ El6c26QZQynkozUqpVDfM/j8tNQXJGc1WAtBk/LKhgp9TXUZL9owl/0exuQw1pWG NHGpM1BJ9hb1f7Kvw07z+/Vrbszt5ktUtI9owG09W/Lr5yHSP/CCvodwN+OgAhus 28jDNiDBXzI1TpUEj1mifU0lf8q/0oUQ2EP3gh95y9/kYDN8YcQ/iqK3YWKMcED8 y7WllrZmkahjSWAOpCKW2qkQUV5KcuWKf4s8w9uik9AgXAScob2JXG92igkUTyA0 8FXeMSKie9mO45XpTf+z+uXpb/t0omqOIFuC/ZT4hNZTMPeoUPkn68UAhJNUU9xX WO+HEcy3s38d9LZkftHmbVRBpE+5IR2k+tdE3BI3lSpNyj5jellZSIvXnZSY0jQn fYc5F0mX+XGyP3aKF1I7EQsLIYTJI3QjLD+5knELetEyGSXP4uxvAuy7CYDxtGE+ cEagmCkZGMcP7g== =WT8n -----END PGP SIGNATURE----- Merge tag 'powerpc-5.3-3' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux Pull powerpc fixes from Michael Ellerman: "Some more powerpc fixes for 5.3: - Wire up the new clone3 syscall. - A fix for the PAPR SCM nvdimm driver, to fix a crash when firmware gives us a device that's attached to a non-online NUMA node. - A fix for a boot failure on 32-bit with KASAN enabled. - Three fixes for implicit fall through warnings, some of which are errors for us due to -Werror. Thanks to: Aneesh Kumar K.V, Christophe Leroy, Kees Cook, Santosh Sivaraj, Stephen Rothwell" * tag 'powerpc-5.3-3' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux: powerpc/kasan: fix early boot failure on PPC32 drivers/macintosh/smu.c: Mark expected switch fall-through powerpc/spe: Mark expected switch fall-throughs powerpc/nvdimm: Pick nearby online node if the device node is not online powerpc/kvm: Fall through switch case explicitly powerpc: Wire up clone3 syscall
This commit is contained in:
commit
4b6f23161b
|
@ -49,6 +49,7 @@
|
|||
#define __ARCH_WANT_SYS_FORK
|
||||
#define __ARCH_WANT_SYS_VFORK
|
||||
#define __ARCH_WANT_SYS_CLONE
|
||||
#define __ARCH_WANT_SYS_CLONE3
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* _ASM_POWERPC_UNISTD_H_ */
|
||||
|
|
|
@ -176,9 +176,11 @@ static int emulate_spe(struct pt_regs *regs, unsigned int reg,
|
|||
ret |= __get_user_inatomic(temp.v[1], p++);
|
||||
ret |= __get_user_inatomic(temp.v[2], p++);
|
||||
ret |= __get_user_inatomic(temp.v[3], p++);
|
||||
/* fall through */
|
||||
case 4:
|
||||
ret |= __get_user_inatomic(temp.v[4], p++);
|
||||
ret |= __get_user_inatomic(temp.v[5], p++);
|
||||
/* fall through */
|
||||
case 2:
|
||||
ret |= __get_user_inatomic(temp.v[6], p++);
|
||||
ret |= __get_user_inatomic(temp.v[7], p++);
|
||||
|
@ -259,9 +261,11 @@ static int emulate_spe(struct pt_regs *regs, unsigned int reg,
|
|||
ret |= __put_user_inatomic(data.v[1], p++);
|
||||
ret |= __put_user_inatomic(data.v[2], p++);
|
||||
ret |= __put_user_inatomic(data.v[3], p++);
|
||||
/* fall through */
|
||||
case 4:
|
||||
ret |= __put_user_inatomic(data.v[4], p++);
|
||||
ret |= __put_user_inatomic(data.v[5], p++);
|
||||
/* fall through */
|
||||
case 2:
|
||||
ret |= __put_user_inatomic(data.v[6], p++);
|
||||
ret |= __put_user_inatomic(data.v[7], p++);
|
||||
|
|
|
@ -597,6 +597,14 @@ ppc_clone:
|
|||
stw r0,_TRAP(r1) /* register set saved */
|
||||
b sys_clone
|
||||
|
||||
.globl ppc_clone3
|
||||
ppc_clone3:
|
||||
SAVE_NVGPRS(r1)
|
||||
lwz r0,_TRAP(r1)
|
||||
rlwinm r0,r0,0,0,30 /* clear LSB to indicate full */
|
||||
stw r0,_TRAP(r1) /* register set saved */
|
||||
b sys_clone3
|
||||
|
||||
.globl ppc_swapcontext
|
||||
ppc_swapcontext:
|
||||
SAVE_NVGPRS(r1)
|
||||
|
|
|
@ -487,6 +487,11 @@ _GLOBAL(ppc_clone)
|
|||
bl sys_clone
|
||||
b .Lsyscall_exit
|
||||
|
||||
_GLOBAL(ppc_clone3)
|
||||
bl save_nvgprs
|
||||
bl sys_clone3
|
||||
b .Lsyscall_exit
|
||||
|
||||
_GLOBAL(ppc32_swapcontext)
|
||||
bl save_nvgprs
|
||||
bl compat_sys_swapcontext
|
||||
|
|
|
@ -516,4 +516,4 @@
|
|||
432 common fsmount sys_fsmount
|
||||
433 common fspick sys_fspick
|
||||
434 common pidfd_open sys_pidfd_open
|
||||
# 435 reserved for clone3
|
||||
435 nospu clone3 ppc_clone3
|
||||
|
|
|
@ -239,6 +239,7 @@ static int kvmppc_mmu_book3s_32_xlate_pte(struct kvm_vcpu *vcpu, gva_t eaddr,
|
|||
case 2:
|
||||
case 6:
|
||||
pte->may_write = true;
|
||||
/* fall through */
|
||||
case 3:
|
||||
case 5:
|
||||
case 7:
|
||||
|
|
|
@ -21,7 +21,7 @@ static void kasan_populate_pte(pte_t *ptep, pgprot_t prot)
|
|||
__set_pte_at(&init_mm, va, ptep, pfn_pte(PHYS_PFN(pa), prot), 0);
|
||||
}
|
||||
|
||||
static int kasan_init_shadow_page_tables(unsigned long k_start, unsigned long k_end)
|
||||
static int __ref kasan_init_shadow_page_tables(unsigned long k_start, unsigned long k_end)
|
||||
{
|
||||
pmd_t *pmd;
|
||||
unsigned long k_cur, k_next;
|
||||
|
@ -35,7 +35,10 @@ static int kasan_init_shadow_page_tables(unsigned long k_start, unsigned long k_
|
|||
if ((void *)pmd_page_vaddr(*pmd) != kasan_early_shadow_pte)
|
||||
continue;
|
||||
|
||||
new = pte_alloc_one_kernel(&init_mm);
|
||||
if (slab_is_available())
|
||||
new = pte_alloc_one_kernel(&init_mm);
|
||||
else
|
||||
new = memblock_alloc(PTE_FRAG_SIZE, PTE_FRAG_SIZE);
|
||||
|
||||
if (!new)
|
||||
return -ENOMEM;
|
||||
|
|
|
@ -275,12 +275,32 @@ static const struct attribute_group *papr_scm_dimm_groups[] = {
|
|||
NULL,
|
||||
};
|
||||
|
||||
static inline int papr_scm_node(int node)
|
||||
{
|
||||
int min_dist = INT_MAX, dist;
|
||||
int nid, min_node;
|
||||
|
||||
if ((node == NUMA_NO_NODE) || node_online(node))
|
||||
return node;
|
||||
|
||||
min_node = first_online_node;
|
||||
for_each_online_node(nid) {
|
||||
dist = node_distance(node, nid);
|
||||
if (dist < min_dist) {
|
||||
min_dist = dist;
|
||||
min_node = nid;
|
||||
}
|
||||
}
|
||||
return min_node;
|
||||
}
|
||||
|
||||
static int papr_scm_nvdimm_init(struct papr_scm_priv *p)
|
||||
{
|
||||
struct device *dev = &p->pdev->dev;
|
||||
struct nd_mapping_desc mapping;
|
||||
struct nd_region_desc ndr_desc;
|
||||
unsigned long dimm_flags;
|
||||
int target_nid, online_nid;
|
||||
|
||||
p->bus_desc.ndctl = papr_scm_ndctl;
|
||||
p->bus_desc.module = THIS_MODULE;
|
||||
|
@ -319,8 +339,10 @@ static int papr_scm_nvdimm_init(struct papr_scm_priv *p)
|
|||
|
||||
memset(&ndr_desc, 0, sizeof(ndr_desc));
|
||||
ndr_desc.attr_groups = region_attr_groups;
|
||||
ndr_desc.numa_node = dev_to_node(&p->pdev->dev);
|
||||
ndr_desc.target_node = ndr_desc.numa_node;
|
||||
target_nid = dev_to_node(&p->pdev->dev);
|
||||
online_nid = papr_scm_node(target_nid);
|
||||
ndr_desc.numa_node = online_nid;
|
||||
ndr_desc.target_node = target_nid;
|
||||
ndr_desc.res = &p->res;
|
||||
ndr_desc.of_node = p->dn;
|
||||
ndr_desc.provider_data = p;
|
||||
|
@ -338,6 +360,9 @@ static int papr_scm_nvdimm_init(struct papr_scm_priv *p)
|
|||
ndr_desc.res, p->dn);
|
||||
goto err;
|
||||
}
|
||||
if (target_nid != online_nid)
|
||||
dev_info(dev, "Region registered with target node %d and online node %d",
|
||||
target_nid, online_nid);
|
||||
|
||||
return 0;
|
||||
|
||||
|
|
|
@ -852,6 +852,7 @@ int smu_queue_i2c(struct smu_i2c_cmd *cmd)
|
|||
break;
|
||||
case SMU_I2C_TRANSFER_COMBINED:
|
||||
cmd->info.devaddr &= 0xfe;
|
||||
/* fall through */
|
||||
case SMU_I2C_TRANSFER_STDSUB:
|
||||
if (cmd->info.sublen > 3)
|
||||
return -EINVAL;
|
||||
|
|
Loading…
Reference in New Issue