Merge branch 'fixes' into next
There's a few important fixes in our fixes branch, in particular the pgd/pud_present() one, so merge it now.
This commit is contained in:
commit
637cfeb9f9
@ -904,7 +904,7 @@ static inline int pud_none(pud_t pud)
|
|||||||
|
|
||||||
static inline int pud_present(pud_t pud)
|
static inline int pud_present(pud_t pud)
|
||||||
{
|
{
|
||||||
return (pud_raw(pud) & cpu_to_be64(_PAGE_PRESENT));
|
return !!(pud_raw(pud) & cpu_to_be64(_PAGE_PRESENT));
|
||||||
}
|
}
|
||||||
|
|
||||||
extern struct page *pud_page(pud_t pud);
|
extern struct page *pud_page(pud_t pud);
|
||||||
@ -951,7 +951,7 @@ static inline int pgd_none(pgd_t pgd)
|
|||||||
|
|
||||||
static inline int pgd_present(pgd_t pgd)
|
static inline int pgd_present(pgd_t pgd)
|
||||||
{
|
{
|
||||||
return (pgd_raw(pgd) & cpu_to_be64(_PAGE_PRESENT));
|
return !!(pgd_raw(pgd) & cpu_to_be64(_PAGE_PRESENT));
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline pte_t pgd_pte(pgd_t pgd)
|
static inline pte_t pgd_pte(pgd_t pgd)
|
||||||
@ -1258,21 +1258,13 @@ extern pmd_t pmdp_invalidate(struct vm_area_struct *vma, unsigned long address,
|
|||||||
|
|
||||||
#define pmd_move_must_withdraw pmd_move_must_withdraw
|
#define pmd_move_must_withdraw pmd_move_must_withdraw
|
||||||
struct spinlock;
|
struct spinlock;
|
||||||
static inline int pmd_move_must_withdraw(struct spinlock *new_pmd_ptl,
|
extern int pmd_move_must_withdraw(struct spinlock *new_pmd_ptl,
|
||||||
struct spinlock *old_pmd_ptl,
|
struct spinlock *old_pmd_ptl,
|
||||||
struct vm_area_struct *vma)
|
struct vm_area_struct *vma);
|
||||||
{
|
/*
|
||||||
if (radix_enabled())
|
* Hash translation mode use the deposited table to store hash pte
|
||||||
return false;
|
* slot information.
|
||||||
/*
|
*/
|
||||||
* Archs like ppc64 use pgtable to store per pmd
|
|
||||||
* specific information. So when we switch the pmd,
|
|
||||||
* we should also withdraw and deposit the pgtable
|
|
||||||
*/
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#define arch_needs_pgtable_deposit arch_needs_pgtable_deposit
|
#define arch_needs_pgtable_deposit arch_needs_pgtable_deposit
|
||||||
static inline bool arch_needs_pgtable_deposit(void)
|
static inline bool arch_needs_pgtable_deposit(void)
|
||||||
{
|
{
|
||||||
|
@ -47,6 +47,7 @@ enum perf_event_powerpc_regs {
|
|||||||
PERF_REG_POWERPC_DAR,
|
PERF_REG_POWERPC_DAR,
|
||||||
PERF_REG_POWERPC_DSISR,
|
PERF_REG_POWERPC_DSISR,
|
||||||
PERF_REG_POWERPC_SIER,
|
PERF_REG_POWERPC_SIER,
|
||||||
|
PERF_REG_POWERPC_MMCRA,
|
||||||
PERF_REG_POWERPC_MAX,
|
PERF_REG_POWERPC_MAX,
|
||||||
};
|
};
|
||||||
#endif /* _UAPI_ASM_POWERPC_PERF_REGS_H */
|
#endif /* _UAPI_ASM_POWERPC_PERF_REGS_H */
|
||||||
|
@ -852,11 +852,12 @@ start_here:
|
|||||||
|
|
||||||
/* set up the PTE pointers for the Abatron bdiGDB.
|
/* set up the PTE pointers for the Abatron bdiGDB.
|
||||||
*/
|
*/
|
||||||
tovirt(r6,r6)
|
|
||||||
lis r5, abatron_pteptrs@h
|
lis r5, abatron_pteptrs@h
|
||||||
ori r5, r5, abatron_pteptrs@l
|
ori r5, r5, abatron_pteptrs@l
|
||||||
stw r5, 0xf0(0) /* Must match your Abatron config file */
|
stw r5, 0xf0(0) /* Must match your Abatron config file */
|
||||||
tophys(r5,r5)
|
tophys(r5,r5)
|
||||||
|
lis r6, swapper_pg_dir@h
|
||||||
|
ori r6, r6, swapper_pg_dir@l
|
||||||
stw r6, 0(r5)
|
stw r6, 0(r5)
|
||||||
|
|
||||||
/* Now turn on the MMU for real! */
|
/* Now turn on the MMU for real! */
|
||||||
|
@ -755,11 +755,12 @@ SYSCALL_DEFINE0(rt_sigreturn)
|
|||||||
if (restore_tm_sigcontexts(current, &uc->uc_mcontext,
|
if (restore_tm_sigcontexts(current, &uc->uc_mcontext,
|
||||||
&uc_transact->uc_mcontext))
|
&uc_transact->uc_mcontext))
|
||||||
goto badframe;
|
goto badframe;
|
||||||
}
|
} else
|
||||||
#endif
|
#endif
|
||||||
/* Fall through, for non-TM restore */
|
{
|
||||||
if (!MSR_TM_ACTIVE(msr)) {
|
|
||||||
/*
|
/*
|
||||||
|
* Fall through, for non-TM restore
|
||||||
|
*
|
||||||
* Unset MSR[TS] on the thread regs since MSR from user
|
* Unset MSR[TS] on the thread regs since MSR from user
|
||||||
* context does not have MSR active, and recheckpoint was
|
* context does not have MSR active, and recheckpoint was
|
||||||
* not called since restore_tm_sigcontexts() was not called
|
* not called since restore_tm_sigcontexts() was not called
|
||||||
|
@ -967,13 +967,6 @@ out:
|
|||||||
}
|
}
|
||||||
#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
|
#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
|
||||||
|
|
||||||
#if defined(CONFIG_FTRACE_SYSCALLS) && defined(CONFIG_PPC64)
|
|
||||||
unsigned long __init arch_syscall_addr(int nr)
|
|
||||||
{
|
|
||||||
return sys_call_table[nr*2];
|
|
||||||
}
|
|
||||||
#endif /* CONFIG_FTRACE_SYSCALLS && CONFIG_PPC64 */
|
|
||||||
|
|
||||||
#ifdef PPC64_ELF_ABI_v1
|
#ifdef PPC64_ELF_ABI_v1
|
||||||
char *arch_ftrace_match_adjust(char *str, const char *search)
|
char *arch_ftrace_match_adjust(char *str, const char *search)
|
||||||
{
|
{
|
||||||
|
@ -400,3 +400,25 @@ void arch_report_meminfo(struct seq_file *m)
|
|||||||
atomic_long_read(&direct_pages_count[MMU_PAGE_1G]) << 20);
|
atomic_long_read(&direct_pages_count[MMU_PAGE_1G]) << 20);
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_PROC_FS */
|
#endif /* CONFIG_PROC_FS */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For hash translation mode, we use the deposited table to store hash slot
|
||||||
|
* information and they are stored at PTRS_PER_PMD offset from related pmd
|
||||||
|
* location. Hence a pmd move requires deposit and withdraw.
|
||||||
|
*
|
||||||
|
* For radix translation with split pmd ptl, we store the deposited table in the
|
||||||
|
* pmd page. Hence if we have different pmd page we need to withdraw during pmd
|
||||||
|
* move.
|
||||||
|
*
|
||||||
|
* With hash we use deposited table always irrespective of anon or not.
|
||||||
|
* With radix we use deposited table only for anonymous mapping.
|
||||||
|
*/
|
||||||
|
int pmd_move_must_withdraw(struct spinlock *new_pmd_ptl,
|
||||||
|
struct spinlock *old_pmd_ptl,
|
||||||
|
struct vm_area_struct *vma)
|
||||||
|
{
|
||||||
|
if (radix_enabled())
|
||||||
|
return (new_pmd_ptl != old_pmd_ptl) && vma_is_anonymous(vma);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
@ -70,6 +70,7 @@ static unsigned int pt_regs_offset[PERF_REG_POWERPC_MAX] = {
|
|||||||
PT_REGS_OFFSET(PERF_REG_POWERPC_DAR, dar),
|
PT_REGS_OFFSET(PERF_REG_POWERPC_DAR, dar),
|
||||||
PT_REGS_OFFSET(PERF_REG_POWERPC_DSISR, dsisr),
|
PT_REGS_OFFSET(PERF_REG_POWERPC_DSISR, dsisr),
|
||||||
PT_REGS_OFFSET(PERF_REG_POWERPC_SIER, dar),
|
PT_REGS_OFFSET(PERF_REG_POWERPC_SIER, dar),
|
||||||
|
PT_REGS_OFFSET(PERF_REG_POWERPC_MMCRA, dsisr),
|
||||||
};
|
};
|
||||||
|
|
||||||
u64 perf_reg_value(struct pt_regs *regs, int idx)
|
u64 perf_reg_value(struct pt_regs *regs, int idx)
|
||||||
@ -83,6 +84,11 @@ u64 perf_reg_value(struct pt_regs *regs, int idx)
|
|||||||
!is_sier_available()))
|
!is_sier_available()))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if (idx == PERF_REG_POWERPC_MMCRA &&
|
||||||
|
(IS_ENABLED(CONFIG_FSL_EMB_PERF_EVENT) ||
|
||||||
|
IS_ENABLED(CONFIG_PPC32)))
|
||||||
|
return 0;
|
||||||
|
|
||||||
return regs_get_register(regs, pt_regs_offset[idx]);
|
return regs_get_register(regs, pt_regs_offset[idx]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -237,12 +237,12 @@ static int ocm_debugfs_show(struct seq_file *m, void *v)
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
seq_printf(m, "PPC4XX OCM : %d\n", ocm->index);
|
seq_printf(m, "PPC4XX OCM : %d\n", ocm->index);
|
||||||
seq_printf(m, "PhysAddr : %pa[p]\n", &(ocm->phys));
|
seq_printf(m, "PhysAddr : %pa\n", &(ocm->phys));
|
||||||
seq_printf(m, "MemTotal : %d Bytes\n", ocm->memtotal);
|
seq_printf(m, "MemTotal : %d Bytes\n", ocm->memtotal);
|
||||||
seq_printf(m, "MemTotal(NC) : %d Bytes\n", ocm->nc.memtotal);
|
seq_printf(m, "MemTotal(NC) : %d Bytes\n", ocm->nc.memtotal);
|
||||||
seq_printf(m, "MemTotal(C) : %d Bytes\n\n", ocm->c.memtotal);
|
seq_printf(m, "MemTotal(C) : %d Bytes\n\n", ocm->c.memtotal);
|
||||||
|
|
||||||
seq_printf(m, "NC.PhysAddr : %pa[p]\n", &(ocm->nc.phys));
|
seq_printf(m, "NC.PhysAddr : %pa\n", &(ocm->nc.phys));
|
||||||
seq_printf(m, "NC.VirtAddr : 0x%p\n", ocm->nc.virt);
|
seq_printf(m, "NC.VirtAddr : 0x%p\n", ocm->nc.virt);
|
||||||
seq_printf(m, "NC.MemTotal : %d Bytes\n", ocm->nc.memtotal);
|
seq_printf(m, "NC.MemTotal : %d Bytes\n", ocm->nc.memtotal);
|
||||||
seq_printf(m, "NC.MemFree : %d Bytes\n", ocm->nc.memfree);
|
seq_printf(m, "NC.MemFree : %d Bytes\n", ocm->nc.memfree);
|
||||||
@ -252,7 +252,7 @@ static int ocm_debugfs_show(struct seq_file *m, void *v)
|
|||||||
blk->size, blk->owner);
|
blk->size, blk->owner);
|
||||||
}
|
}
|
||||||
|
|
||||||
seq_printf(m, "\nC.PhysAddr : %pa[p]\n", &(ocm->c.phys));
|
seq_printf(m, "\nC.PhysAddr : %pa\n", &(ocm->c.phys));
|
||||||
seq_printf(m, "C.VirtAddr : 0x%p\n", ocm->c.virt);
|
seq_printf(m, "C.VirtAddr : 0x%p\n", ocm->c.virt);
|
||||||
seq_printf(m, "C.MemTotal : %d Bytes\n", ocm->c.memtotal);
|
seq_printf(m, "C.MemTotal : %d Bytes\n", ocm->c.memtotal);
|
||||||
seq_printf(m, "C.MemFree : %d Bytes\n", ocm->c.memfree);
|
seq_printf(m, "C.MemFree : %d Bytes\n", ocm->c.memfree);
|
||||||
|
@ -560,7 +560,7 @@ struct iommu_table_group *pnv_try_setup_npu_table_group(struct pnv_ioda_pe *pe)
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Create a group for 1 GPU and attached NPUs for POWER8 */
|
/* Create a group for 1 GPU and attached NPUs for POWER8 */
|
||||||
pe->npucomp = kzalloc(sizeof(pe->npucomp), GFP_KERNEL);
|
pe->npucomp = kzalloc(sizeof(*pe->npucomp), GFP_KERNEL);
|
||||||
table_group = &pe->npucomp->table_group;
|
table_group = &pe->npucomp->table_group;
|
||||||
table_group->ops = &pnv_npu_peers_ops;
|
table_group->ops = &pnv_npu_peers_ops;
|
||||||
iommu_register_group(table_group, hose->global_number,
|
iommu_register_group(table_group, hose->global_number,
|
||||||
|
@ -2681,7 +2681,8 @@ static void pnv_pci_ioda_setup_iommu_api(void)
|
|||||||
list_for_each_entry(hose, &hose_list, list_node) {
|
list_for_each_entry(hose, &hose_list, list_node) {
|
||||||
phb = hose->private_data;
|
phb = hose->private_data;
|
||||||
|
|
||||||
if (phb->type == PNV_PHB_NPU_NVLINK)
|
if (phb->type == PNV_PHB_NPU_NVLINK ||
|
||||||
|
phb->type == PNV_PHB_NPU_OCAPI)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
list_for_each_entry(pe, &phb->ioda.pe_list, list) {
|
list_for_each_entry(pe, &phb->ioda.pe_list, list) {
|
||||||
|
@ -43,6 +43,7 @@ static int drc_pmem_bind(struct papr_scm_priv *p)
|
|||||||
{
|
{
|
||||||
unsigned long ret[PLPAR_HCALL_BUFSIZE];
|
unsigned long ret[PLPAR_HCALL_BUFSIZE];
|
||||||
uint64_t rc, token;
|
uint64_t rc, token;
|
||||||
|
uint64_t saved = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* When the hypervisor cannot map all the requested memory in a single
|
* When the hypervisor cannot map all the requested memory in a single
|
||||||
@ -56,6 +57,8 @@ static int drc_pmem_bind(struct papr_scm_priv *p)
|
|||||||
rc = plpar_hcall(H_SCM_BIND_MEM, ret, p->drc_index, 0,
|
rc = plpar_hcall(H_SCM_BIND_MEM, ret, p->drc_index, 0,
|
||||||
p->blocks, BIND_ANY_ADDR, token);
|
p->blocks, BIND_ANY_ADDR, token);
|
||||||
token = ret[0];
|
token = ret[0];
|
||||||
|
if (!saved)
|
||||||
|
saved = ret[1];
|
||||||
cond_resched();
|
cond_resched();
|
||||||
} while (rc == H_BUSY);
|
} while (rc == H_BUSY);
|
||||||
|
|
||||||
@ -64,7 +67,7 @@ static int drc_pmem_bind(struct papr_scm_priv *p)
|
|||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
p->bound_addr = ret[1];
|
p->bound_addr = saved;
|
||||||
|
|
||||||
dev_dbg(&p->pdev->dev, "bound drc %x to %pR\n", p->drc_index, &p->res);
|
dev_dbg(&p->pdev->dev, "bound drc %x to %pR\n", p->drc_index, &p->res);
|
||||||
|
|
||||||
|
@ -264,7 +264,9 @@ void __init pSeries_final_fixup(void)
|
|||||||
if (!of_device_is_compatible(nvdn->parent,
|
if (!of_device_is_compatible(nvdn->parent,
|
||||||
"ibm,power9-npu"))
|
"ibm,power9-npu"))
|
||||||
continue;
|
continue;
|
||||||
|
#ifdef CONFIG_PPC_POWERNV
|
||||||
WARN_ON_ONCE(pnv_npu2_init(hose));
|
WARN_ON_ONCE(pnv_npu2_init(hose));
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -47,6 +47,7 @@ enum perf_event_powerpc_regs {
|
|||||||
PERF_REG_POWERPC_DAR,
|
PERF_REG_POWERPC_DAR,
|
||||||
PERF_REG_POWERPC_DSISR,
|
PERF_REG_POWERPC_DSISR,
|
||||||
PERF_REG_POWERPC_SIER,
|
PERF_REG_POWERPC_SIER,
|
||||||
|
PERF_REG_POWERPC_MMCRA,
|
||||||
PERF_REG_POWERPC_MAX,
|
PERF_REG_POWERPC_MAX,
|
||||||
};
|
};
|
||||||
#endif /* _UAPI_ASM_POWERPC_PERF_REGS_H */
|
#endif /* _UAPI_ASM_POWERPC_PERF_REGS_H */
|
||||||
|
@ -63,7 +63,8 @@ static const char *reg_names[] = {
|
|||||||
[PERF_REG_POWERPC_TRAP] = "trap",
|
[PERF_REG_POWERPC_TRAP] = "trap",
|
||||||
[PERF_REG_POWERPC_DAR] = "dar",
|
[PERF_REG_POWERPC_DAR] = "dar",
|
||||||
[PERF_REG_POWERPC_DSISR] = "dsisr",
|
[PERF_REG_POWERPC_DSISR] = "dsisr",
|
||||||
[PERF_REG_POWERPC_SIER] = "sier"
|
[PERF_REG_POWERPC_SIER] = "sier",
|
||||||
|
[PERF_REG_POWERPC_MMCRA] = "mmcra"
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline const char *perf_reg_name(int id)
|
static inline const char *perf_reg_name(int id)
|
||||||
|
@ -53,6 +53,7 @@ const struct sample_reg sample_reg_masks[] = {
|
|||||||
SMPL_REG(dar, PERF_REG_POWERPC_DAR),
|
SMPL_REG(dar, PERF_REG_POWERPC_DAR),
|
||||||
SMPL_REG(dsisr, PERF_REG_POWERPC_DSISR),
|
SMPL_REG(dsisr, PERF_REG_POWERPC_DSISR),
|
||||||
SMPL_REG(sier, PERF_REG_POWERPC_SIER),
|
SMPL_REG(sier, PERF_REG_POWERPC_SIER),
|
||||||
|
SMPL_REG(mmcra, PERF_REG_POWERPC_MMCRA),
|
||||||
SMPL_REG_END
|
SMPL_REG_END
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user