Commit da87c77e authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull s390 fixes from Alexander Gordeev:

 - The function __storage_key_init_range() expects the end address to be
   the first byte outside the range to be initialized. Fix the callers
   that provide the last byte within the range instead.

 - 3270 Channel Command Word (CCW) may contain zero data address in case
   there is no data in the request. Add data availability check to avoid
   erroneous non-zero value as result of virt_to_dma32(NULL) application
   in cases there is no data

 - Add missing CFI directives for an unwinder to restore the return
   address in the vDSO assembler code

 - NUL-terminate kernel buffer when duplicating user space memory region
   on Channel IO (CIO) debugfs write inject

 - Fix wrong format string in zcrypt debug output

 - Return -EBUSY code when a CCA card is temporarily unavailabile

 - Restore a loop that retries derivation of a protected key from a
   secure key in cases the low level reports temporarily unavailability
   with -EBUSY code

* tag 's390-6.9-6' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux:
  s390/paes: Reestablish retry loop in paes
  s390/zcrypt: Use EBUSY to indicate temp unavailability
  s390/zcrypt: Handle ep11 cprb return code
  s390/zcrypt: Fix wrong format string in debug feature printout
  s390/cio: Ensure the copied buf is NUL terminated
  s390/vdso: Add CFI for RA register to asm macro vdso_func
  s390/3270: Fix buffer assignment
  s390/mm: Fix clearing storage keys for huge pages
  s390/mm: Fix storage key clearing for guest huge pages
parents 09bf0f19 7bbe449d
Loading
Loading
Loading
Loading
+13 −2
Original line number Diff line number Diff line
@@ -125,10 +125,21 @@ struct s390_pxts_ctx {
static inline int __paes_keyblob2pkey(struct key_blob *kb,
				     struct pkey_protkey *pk)
{
	return pkey_keyblob2pkey(kb->key, kb->keylen,
	int i, ret = -EIO;

	/* try three times in case of busy card */
	for (i = 0; ret && i < 3; i++) {
		if (ret == -EBUSY && in_task()) {
			if (msleep_interruptible(1000))
				return -EINTR;
		}
		ret = pkey_keyblob2pkey(kb->key, kb->keylen,
					pk->protkey, &pk->len, &pk->type);
	}

	return ret;
}

static inline int __paes_convert_key(struct s390_paes_ctx *ctx)
{
	int ret;
+1 −0
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@
#define CFI_DEF_CFA_OFFSET	.cfi_def_cfa_offset
#define CFI_ADJUST_CFA_OFFSET	.cfi_adjust_cfa_offset
#define CFI_RESTORE		.cfi_restore
#define CFI_REL_OFFSET		.cfi_rel_offset

#ifdef CONFIG_AS_CFI_VAL_OFFSET
#define CFI_VAL_OFFSET		.cfi_val_offset
+2 −0
Original line number Diff line number Diff line
@@ -24,8 +24,10 @@ __kernel_\func:
	CFI_DEF_CFA_OFFSET (STACK_FRAME_OVERHEAD + WRAPPER_FRAME_SIZE)
	CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD
	stg	%r14,STACK_FRAME_OVERHEAD(%r15)
	CFI_REL_OFFSET 14, STACK_FRAME_OVERHEAD
	brasl	%r14,__s390_vdso_\func
	lg	%r14,STACK_FRAME_OVERHEAD(%r15)
	CFI_RESTORE 14
	aghi	%r15,WRAPPER_FRAME_SIZE
	CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD
	CFI_RESTORE 15
+1 −1
Original line number Diff line number Diff line
@@ -2661,7 +2661,7 @@ static int __s390_enable_skey_hugetlb(pte_t *pte, unsigned long addr,
		return 0;

	start = pmd_val(*pmd) & HPAGE_MASK;
	end = start + HPAGE_SIZE - 1;
	end = start + HPAGE_SIZE;
	__storage_key_init_range(start, end);
	set_bit(PG_arch_1, &page->flags);
	cond_resched();
+1 −1
Original line number Diff line number Diff line
@@ -139,7 +139,7 @@ static void clear_huge_pte_skeys(struct mm_struct *mm, unsigned long rste)
	}

	if (!test_and_set_bit(PG_arch_1, &page->flags))
		__storage_key_init_range(paddr, paddr + size - 1);
		__storage_key_init_range(paddr, paddr + size);
}

void __set_huge_pte_at(struct mm_struct *mm, unsigned long addr,
Loading