Merge tag 'powerpc-4.19-2' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux
Pull powerpc fixes from Michael Ellerman: - An implementation for the newly added hv_ops->flush() for the OPAL hvc console driver backends, I forgot to apply this after merging the hvc driver changes before the merge window. - Enable all PCI bridges at boot on powernv, to avoid races when multiple children of a bridge try to enable it simultaneously. This is a workaround until the PCI core can be enhanced to fix the races. - A fix to query PowerVM for the correct system topology at boot before initialising sched domains, seen in some configurations to cause broken scheduling etc. - A fix for pte_access_permitted() on "nohash" platforms. - Two commits to fix SIGBUS when using remap_pfn_range() seen on Power9 due to a workaround when using the nest MMU (GPUs, accelerators). - Another fix to the VFIO code used by KVM, the previous fix had some bugs which caused guests to not start in some configurations. - A handful of other minor fixes. Thanks to: Aneesh Kumar K.V, Benjamin Herrenschmidt, Christophe Leroy, Hari Bathini, Luke Dashjr, Mahesh Salgaonkar, Nicholas Piggin, Paul Mackerras, Srikar Dronamraju. * tag 'powerpc-4.19-2' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux: powerpc/mce: Fix SLB rebolting during MCE recovery path. KVM: PPC: Book3S: Fix guest DMA when guest partially backed by THP pages powerpc/mm/radix: Only need the Nest MMU workaround for R -> RW transition powerpc/mm/books3s: Add new pte bit to mark pte temporarily invalid. powerpc/nohash: fix pte_access_permitted() powerpc/topology: Get topology for shared processors at boot powerpc64/ftrace: Include ftrace.h needed for enable/disable calls powerpc/powernv/pci: Work around races in PCI bridge enabling powerpc/fadump: cleanup crash memory ranges support powerpc/powernv: provide a console flush operation for opal hvc driver powerpc/traps: Avoid rate limit messages from show unhandled signals powerpc/64s: Fix PACA_IRQ_HARD_DIS accounting in idle_power4()
This commit is contained in:
@@ -44,6 +44,16 @@
|
||||
|
||||
#define _PAGE_PTE 0x4000000000000000UL /* distinguishes PTEs from pointers */
|
||||
#define _PAGE_PRESENT 0x8000000000000000UL /* pte contains a translation */
|
||||
/*
|
||||
* We need to mark a pmd pte invalid while splitting. We can do that by clearing
|
||||
* the _PAGE_PRESENT bit. But then that will be taken as a swap pte. In order to
|
||||
* differentiate between two use a SW field when invalidating.
|
||||
*
|
||||
* We do that temporary invalidate for regular pte entry in ptep_set_access_flags
|
||||
*
|
||||
* This is used only when _PAGE_PRESENT is cleared.
|
||||
*/
|
||||
#define _PAGE_INVALID _RPAGE_SW0
|
||||
|
||||
/*
|
||||
* Top and bottom bits of RPN which can be used by hash
|
||||
@@ -568,7 +578,13 @@ static inline pte_t pte_clear_savedwrite(pte_t pte)
|
||||
|
||||
static inline int pte_present(pte_t pte)
|
||||
{
|
||||
return !!(pte_raw(pte) & cpu_to_be64(_PAGE_PRESENT));
|
||||
/*
|
||||
* A pte is considerent present if _PAGE_PRESENT is set.
|
||||
* We also need to consider the pte present which is marked
|
||||
* invalid during ptep_set_access_flags. Hence we look for _PAGE_INVALID
|
||||
* if we find _PAGE_PRESENT cleared.
|
||||
*/
|
||||
return !!(pte_raw(pte) & cpu_to_be64(_PAGE_PRESENT | _PAGE_INVALID));
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PPC_MEM_KEYS
|
||||
|
@@ -51,17 +51,14 @@ static inline int pte_present(pte_t pte)
|
||||
#define pte_access_permitted pte_access_permitted
|
||||
static inline bool pte_access_permitted(pte_t pte, bool write)
|
||||
{
|
||||
unsigned long pteval = pte_val(pte);
|
||||
/*
|
||||
* A read-only access is controlled by _PAGE_USER bit.
|
||||
* We have _PAGE_READ set for WRITE and EXECUTE
|
||||
*/
|
||||
unsigned long need_pte_bits = _PAGE_PRESENT | _PAGE_USER;
|
||||
if (!pte_present(pte) || !pte_user(pte) || !pte_read(pte))
|
||||
return false;
|
||||
|
||||
if (write)
|
||||
need_pte_bits |= _PAGE_WRITE;
|
||||
|
||||
if ((pteval & need_pte_bits) != need_pte_bits)
|
||||
if (write && !pte_write(pte))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
|
@@ -308,6 +308,7 @@ extern void opal_configure_cores(void);
|
||||
extern int opal_get_chars(uint32_t vtermno, char *buf, int count);
|
||||
extern int opal_put_chars(uint32_t vtermno, const char *buf, int total_len);
|
||||
extern int opal_put_chars_atomic(uint32_t vtermno, const char *buf, int total_len);
|
||||
extern int opal_flush_chars(uint32_t vtermno, bool wait);
|
||||
extern int opal_flush_console(uint32_t vtermno);
|
||||
|
||||
extern void hvc_opal_init_early(void);
|
||||
|
@@ -92,6 +92,7 @@ extern int stop_topology_update(void);
|
||||
extern int prrn_is_enabled(void);
|
||||
extern int find_and_online_cpu_nid(int cpu);
|
||||
extern int timed_topology_update(int nsecs);
|
||||
extern void __init shared_proc_topology_init(void);
|
||||
#else
|
||||
static inline int start_topology_update(void)
|
||||
{
|
||||
@@ -113,6 +114,10 @@ static inline int timed_topology_update(int nsecs)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
static inline void shared_proc_topology_init(void) {}
|
||||
#endif
|
||||
#endif /* CONFIG_NUMA && CONFIG_PPC_SPLPAR */
|
||||
|
||||
#include <asm-generic/topology.h>
|
||||
|
Reference in New Issue
Block a user