Commit 95d0b9d8 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
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
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -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,
					  unsigned long newval)
{
@@ -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.
	 */
	VM_WARN_ON_ONCE(oldval & _PAGE_PRIVILEGED);
	VM_WARN_ON_ONCE(newval & _PAGE_PRIVILEGED);
	VM_WARN_ON_ONCE(!__pte_protnone(oldval) && oldval & _PAGE_PRIVILEGED);
	VM_WARN_ON_ONCE(!__pte_protnone(newval) && newval & _PAGE_PRIVILEGED);
	VM_WARN_ON_ONCE(!(oldval & _PAGE_PTE));
	VM_WARN_ON_ONCE(!(newval & _PAGE_PTE));
	VM_WARN_ON_ONCE(!(oldval & _PAGE_PRESENT));
+6 −0
Original line number Diff line number Diff line
@@ -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,
		   struct membuf to)
{
	if (!target->thread.regs)
		return -EINVAL;

	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,
		   unsigned int pos, unsigned int count, const void *kbuf,
		   const void __user *ubuf)
{
	if (!target->thread.regs)
		return -EINVAL;

	return user_regset_copyin(&pos, &count, &kbuf, &ubuf,
				  &target->thread.regs->ppr, 0, sizeof(u64));
}
+8 −0
Original line number Diff line number Diff line
@@ -856,6 +856,13 @@ int pseries_vas_dlpar_cpu(void)
{
	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,
				      vascaps[VAS_GZIP_DEF_FEAT_TYPE].feat,
				      (u64)virt_to_phys(&hv_cop_caps));
@@ -1012,6 +1019,7 @@ static int __init pseries_vas_init(void)
	 * Linux supports user space COPY/PASTE only with Radix
	 */
	if (!radix_enabled()) {
		copypaste_feat = false;
		pr_err("API is supported only with radix page tables\n");
		return -ENOTSUPP;
	}