Commit 95d0b9d8 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'powerpc-6.3-4' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux

Pull powerpc fixes from Michael Ellerman:

 - Fix a false positive warning in __pte_needs_flush() (with DEBUG_VM=y)

 - Fix oops when a PF_IO_WORKER thread tries to core dump

 - Don't try to reconfigure VAS when it's disabled

Thanks to Benjamin Gray, Haren Myneni, Jens Axboe, Nathan Lynch, and
Russell Currey.

* tag 'powerpc-6.3-4' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux:
  powerpc/pseries/vas: Ignore VAS update for DLPAR if copy/paste is not enabled
  powerpc: Don't try to copy PPR for task with NULL pt_regs
  powerpc/64s: Fix __pte_needs_flush() false positive warning
parents f7772da6 eca9f6e6
...@@ -148,6 +148,11 @@ static inline void flush_tlb_fix_spurious_fault(struct vm_area_struct *vma, ...@@ -148,6 +148,11 @@ static inline void flush_tlb_fix_spurious_fault(struct vm_area_struct *vma,
*/ */
} }
static inline bool __pte_protnone(unsigned long pte)
{
return (pte & (pgprot_val(PAGE_NONE) | _PAGE_RWX)) == pgprot_val(PAGE_NONE);
}
static inline bool __pte_flags_need_flush(unsigned long oldval, static inline bool __pte_flags_need_flush(unsigned long oldval,
unsigned long newval) unsigned long newval)
{ {
...@@ -164,8 +169,8 @@ static inline bool __pte_flags_need_flush(unsigned long oldval, ...@@ -164,8 +169,8 @@ static inline bool __pte_flags_need_flush(unsigned long oldval,
/* /*
* We do not expect kernel mappings or non-PTEs or not-present PTEs. * We do not expect kernel mappings or non-PTEs or not-present PTEs.
*/ */
VM_WARN_ON_ONCE(oldval & _PAGE_PRIVILEGED); VM_WARN_ON_ONCE(!__pte_protnone(oldval) && oldval & _PAGE_PRIVILEGED);
VM_WARN_ON_ONCE(newval & _PAGE_PRIVILEGED); VM_WARN_ON_ONCE(!__pte_protnone(newval) && newval & _PAGE_PRIVILEGED);
VM_WARN_ON_ONCE(!(oldval & _PAGE_PTE)); VM_WARN_ON_ONCE(!(oldval & _PAGE_PTE));
VM_WARN_ON_ONCE(!(newval & _PAGE_PTE)); VM_WARN_ON_ONCE(!(newval & _PAGE_PTE));
VM_WARN_ON_ONCE(!(oldval & _PAGE_PRESENT)); VM_WARN_ON_ONCE(!(oldval & _PAGE_PRESENT));
......
...@@ -290,6 +290,9 @@ static int gpr_set(struct task_struct *target, const struct user_regset *regset, ...@@ -290,6 +290,9 @@ static int gpr_set(struct task_struct *target, const struct user_regset *regset,
static int ppr_get(struct task_struct *target, const struct user_regset *regset, static int ppr_get(struct task_struct *target, const struct user_regset *regset,
struct membuf to) struct membuf to)
{ {
if (!target->thread.regs)
return -EINVAL;
return membuf_write(&to, &target->thread.regs->ppr, sizeof(u64)); return membuf_write(&to, &target->thread.regs->ppr, sizeof(u64));
} }
...@@ -297,6 +300,9 @@ static int ppr_set(struct task_struct *target, const struct user_regset *regset, ...@@ -297,6 +300,9 @@ static int ppr_set(struct task_struct *target, const struct user_regset *regset,
unsigned int pos, unsigned int count, const void *kbuf, unsigned int pos, unsigned int count, const void *kbuf,
const void __user *ubuf) const void __user *ubuf)
{ {
if (!target->thread.regs)
return -EINVAL;
return user_regset_copyin(&pos, &count, &kbuf, &ubuf, return user_regset_copyin(&pos, &count, &kbuf, &ubuf,
&target->thread.regs->ppr, 0, sizeof(u64)); &target->thread.regs->ppr, 0, sizeof(u64));
} }
......
...@@ -856,6 +856,13 @@ int pseries_vas_dlpar_cpu(void) ...@@ -856,6 +856,13 @@ int pseries_vas_dlpar_cpu(void)
{ {
int new_nr_creds, rc; int new_nr_creds, rc;
/*
* NX-GZIP is not enabled. Nothing to do for DLPAR event
*/
if (!copypaste_feat)
return 0;
rc = h_query_vas_capabilities(H_QUERY_VAS_CAPABILITIES, rc = h_query_vas_capabilities(H_QUERY_VAS_CAPABILITIES,
vascaps[VAS_GZIP_DEF_FEAT_TYPE].feat, vascaps[VAS_GZIP_DEF_FEAT_TYPE].feat,
(u64)virt_to_phys(&hv_cop_caps)); (u64)virt_to_phys(&hv_cop_caps));
...@@ -1012,6 +1019,7 @@ static int __init pseries_vas_init(void) ...@@ -1012,6 +1019,7 @@ static int __init pseries_vas_init(void)
* Linux supports user space COPY/PASTE only with Radix * Linux supports user space COPY/PASTE only with Radix
*/ */
if (!radix_enabled()) { if (!radix_enabled()) {
copypaste_feat = false;
pr_err("API is supported only with radix page tables\n"); pr_err("API is supported only with radix page tables\n");
return -ENOTSUPP; return -ENOTSUPP;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment