mirror of
https://github.com/torvalds/linux.git
synced 2024-12-26 04:42:12 +00:00
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)
|
||||
{
|
||||
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);
|
||||
@ -951,7 +951,7 @@ static inline int pgd_none(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)
|
||||
@ -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
|
||||
struct spinlock;
|
||||
static inline int pmd_move_must_withdraw(struct spinlock *new_pmd_ptl,
|
||||
struct spinlock *old_pmd_ptl,
|
||||
struct vm_area_struct *vma)
|
||||
{
|
||||
if (radix_enabled())
|
||||
return false;
|
||||
/*
|
||||
* 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;
|
||||
}
|
||||
|
||||
|
||||
extern int pmd_move_must_withdraw(struct spinlock *new_pmd_ptl,
|
||||
struct spinlock *old_pmd_ptl,
|
||||
struct vm_area_struct *vma);
|
||||
/*
|
||||
* Hash translation mode use the deposited table to store hash pte
|
||||
* slot information.
|
||||
*/
|
||||
#define arch_needs_pgtable_deposit arch_needs_pgtable_deposit
|
||||
static inline bool arch_needs_pgtable_deposit(void)
|
||||
{
|
||||
|
@ -47,6 +47,7 @@ enum perf_event_powerpc_regs {
|
||||
PERF_REG_POWERPC_DAR,
|
||||
PERF_REG_POWERPC_DSISR,
|
||||
PERF_REG_POWERPC_SIER,
|
||||
PERF_REG_POWERPC_MMCRA,
|
||||
PERF_REG_POWERPC_MAX,
|
||||
};
|
||||
#endif /* _UAPI_ASM_POWERPC_PERF_REGS_H */
|
||||
|
@ -852,11 +852,12 @@ start_here:
|
||||
|
||||
/* set up the PTE pointers for the Abatron bdiGDB.
|
||||
*/
|
||||
tovirt(r6,r6)
|
||||
lis r5, abatron_pteptrs@h
|
||||
ori r5, r5, abatron_pteptrs@l
|
||||
stw r5, 0xf0(0) /* Must match your Abatron config file */
|
||||
tophys(r5,r5)
|
||||
lis r6, swapper_pg_dir@h
|
||||
ori r6, r6, swapper_pg_dir@l
|
||||
stw r6, 0(r5)
|
||||
|
||||
/* Now turn on the MMU for real! */
|
||||
|
@ -755,11 +755,12 @@ SYSCALL_DEFINE0(rt_sigreturn)
|
||||
if (restore_tm_sigcontexts(current, &uc->uc_mcontext,
|
||||
&uc_transact->uc_mcontext))
|
||||
goto badframe;
|
||||
}
|
||||
} else
|
||||
#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
|
||||
* context does not have MSR active, and recheckpoint was
|
||||
* not called since restore_tm_sigcontexts() was not called
|
||||
|
@ -967,13 +967,6 @@ out:
|
||||
}
|
||||
#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
|
||||
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);
|
||||
}
|
||||
#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_DSISR, dsisr),
|
||||
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)
|
||||
@ -83,6 +84,11 @@ u64 perf_reg_value(struct pt_regs *regs, int idx)
|
||||
!is_sier_available()))
|
||||
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]);
|
||||
}
|
||||
|
||||
|
@ -237,12 +237,12 @@ static int ocm_debugfs_show(struct seq_file *m, void *v)
|
||||
continue;
|
||||
|
||||
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(NC) : %d Bytes\n", ocm->nc.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.MemTotal : %d Bytes\n", ocm->nc.memtotal);
|
||||
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);
|
||||
}
|
||||
|
||||
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.MemTotal : %d Bytes\n", ocm->c.memtotal);
|
||||
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 {
|
||||
/* 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->ops = &pnv_npu_peers_ops;
|
||||
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) {
|
||||
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;
|
||||
|
||||
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];
|
||||
uint64_t rc, token;
|
||||
uint64_t saved = 0;
|
||||
|
||||
/*
|
||||
* 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,
|
||||
p->blocks, BIND_ANY_ADDR, token);
|
||||
token = ret[0];
|
||||
if (!saved)
|
||||
saved = ret[1];
|
||||
cond_resched();
|
||||
} while (rc == H_BUSY);
|
||||
|
||||
@ -64,7 +67,7 @@ static int drc_pmem_bind(struct papr_scm_priv *p)
|
||||
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);
|
||||
|
||||
|
@ -264,7 +264,9 @@ void __init pSeries_final_fixup(void)
|
||||
if (!of_device_is_compatible(nvdn->parent,
|
||||
"ibm,power9-npu"))
|
||||
continue;
|
||||
#ifdef CONFIG_PPC_POWERNV
|
||||
WARN_ON_ONCE(pnv_npu2_init(hose));
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -47,6 +47,7 @@ enum perf_event_powerpc_regs {
|
||||
PERF_REG_POWERPC_DAR,
|
||||
PERF_REG_POWERPC_DSISR,
|
||||
PERF_REG_POWERPC_SIER,
|
||||
PERF_REG_POWERPC_MMCRA,
|
||||
PERF_REG_POWERPC_MAX,
|
||||
};
|
||||
#endif /* _UAPI_ASM_POWERPC_PERF_REGS_H */
|
||||
|
@ -63,7 +63,8 @@ static const char *reg_names[] = {
|
||||
[PERF_REG_POWERPC_TRAP] = "trap",
|
||||
[PERF_REG_POWERPC_DAR] = "dar",
|
||||
[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)
|
||||
|
@ -53,6 +53,7 @@ const struct sample_reg sample_reg_masks[] = {
|
||||
SMPL_REG(dar, PERF_REG_POWERPC_DAR),
|
||||
SMPL_REG(dsisr, PERF_REG_POWERPC_DSISR),
|
||||
SMPL_REG(sier, PERF_REG_POWERPC_SIER),
|
||||
SMPL_REG(mmcra, PERF_REG_POWERPC_MMCRA),
|
||||
SMPL_REG_END
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user