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

 - clear 'Search boot program' flag when 'bootprog' sysfs file is
   written to override a value set from Hardware Management Console

 - fix cyclic dead-lock in zpci_zdev_put() and zpci_scan_devices()
   functions when triggering PCI device recovery using sysfs

 - annotate the expected lock context imbalance in zpci_release_device()
   function to fix a sparse complaint

 - fix the logic to fallback to the return address register value in the
   topmost frame when stack tracing uses a back chain

* tag 's390-6.19-3' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux:
  s390/stacktrace: Do not fallback to RA register
  s390/pci: Annotate lock context imbalance in zpci_release_device()
  s390/pci: Fix cyclic dead-lock in zpci_zdev_put() and zpci_scan_devices()
  s390/ipl: Clear SBP flag when bootprog is set
parents 40fbbd64 489e9665
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -748,6 +748,7 @@ ForEachMacros:
  - 'ynl_attr_for_each_nested'
  - 'ynl_attr_for_each_payload'
  - 'zorro_for_each_dev'
  - 'zpci_bus_for_each'

IncludeBlocks: Preserve
IncludeCategories:
+1 −0
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@ struct ipl_pl_hdr {
#define IPL_PL_FLAG_IPLPS	0x80
#define IPL_PL_FLAG_SIPL	0x40
#define IPL_PL_FLAG_IPLSR	0x20
#define IPL_PL_FLAG_SBP		0x10

/* IPL Parameter Block header */
struct ipl_pb_hdr {
+36 −12
Original line number Diff line number Diff line
@@ -262,6 +262,24 @@ static struct kobj_attribute sys_##_prefix##_##_name##_attr = \
			sys_##_prefix##_##_name##_show,			\
			sys_##_prefix##_##_name##_store)

#define DEFINE_IPL_ATTR_BOOTPROG_RW(_prefix, _name, _fmt_out, _fmt_in, _hdr, _value)	\
	IPL_ATTR_SHOW_FN(_prefix, _name, _fmt_out, (unsigned long long) _value)		\
static ssize_t sys_##_prefix##_##_name##_store(struct kobject *kobj,			\
		struct kobj_attribute *attr,						\
		const char *buf, size_t len)						\
{											\
	unsigned long long value;							\
	if (sscanf(buf, _fmt_in, &value) != 1)						\
		return -EINVAL;								\
	(_value) = value;								\
	(_hdr).flags &= ~IPL_PL_FLAG_SBP;						\
	return len;									\
}											\
static struct kobj_attribute sys_##_prefix##_##_name##_attr =				\
	__ATTR(_name, 0644,								\
			sys_##_prefix##_##_name##_show,					\
			sys_##_prefix##_##_name##_store)

#define DEFINE_IPL_ATTR_STR_RW(_prefix, _name, _fmt_out, _fmt_in, _value)\
IPL_ATTR_SHOW_FN(_prefix, _name, _fmt_out, _value)			\
static ssize_t sys_##_prefix##_##_name##_store(struct kobject *kobj,	\
@@ -818,12 +836,13 @@ DEFINE_IPL_ATTR_RW(reipl_fcp, wwpn, "0x%016llx\n", "%llx\n",
		   reipl_block_fcp->fcp.wwpn);
DEFINE_IPL_ATTR_RW(reipl_fcp, lun, "0x%016llx\n", "%llx\n",
		   reipl_block_fcp->fcp.lun);
DEFINE_IPL_ATTR_RW(reipl_fcp, bootprog, "%lld\n", "%lld\n",
		   reipl_block_fcp->fcp.bootprog);
DEFINE_IPL_ATTR_RW(reipl_fcp, br_lba, "%lld\n", "%lld\n",
		   reipl_block_fcp->fcp.br_lba);
DEFINE_IPL_ATTR_RW(reipl_fcp, device, "0.0.%04llx\n", "0.0.%llx\n",
		   reipl_block_fcp->fcp.devno);
DEFINE_IPL_ATTR_BOOTPROG_RW(reipl_fcp, bootprog, "%lld\n", "%lld\n",
			    reipl_block_fcp->hdr,
			    reipl_block_fcp->fcp.bootprog);

static void reipl_get_ascii_loadparm(char *loadparm,
				     struct ipl_parameter_block *ibp)
@@ -942,10 +961,11 @@ DEFINE_IPL_ATTR_RW(reipl_nvme, fid, "0x%08llx\n", "%llx\n",
		   reipl_block_nvme->nvme.fid);
DEFINE_IPL_ATTR_RW(reipl_nvme, nsid, "0x%08llx\n", "%llx\n",
		   reipl_block_nvme->nvme.nsid);
DEFINE_IPL_ATTR_RW(reipl_nvme, bootprog, "%lld\n", "%lld\n",
		   reipl_block_nvme->nvme.bootprog);
DEFINE_IPL_ATTR_RW(reipl_nvme, br_lba, "%lld\n", "%lld\n",
		   reipl_block_nvme->nvme.br_lba);
DEFINE_IPL_ATTR_BOOTPROG_RW(reipl_nvme, bootprog, "%lld\n", "%lld\n",
			    reipl_block_nvme->hdr,
			    reipl_block_nvme->nvme.bootprog);

static struct attribute *reipl_nvme_attrs[] = {
	&sys_reipl_nvme_fid_attr.attr,
@@ -1038,7 +1058,8 @@ static const struct bin_attribute *const reipl_eckd_bin_attrs[] = {
};

DEFINE_IPL_CCW_ATTR_RW(reipl_eckd, device, reipl_block_eckd->eckd);
DEFINE_IPL_ATTR_RW(reipl_eckd, bootprog, "%lld\n", "%lld\n",
DEFINE_IPL_ATTR_BOOTPROG_RW(reipl_eckd, bootprog, "%lld\n", "%lld\n",
			    reipl_block_eckd->hdr,
			    reipl_block_eckd->eckd.bootprog);

static struct attribute *reipl_eckd_attrs[] = {
@@ -1567,12 +1588,13 @@ DEFINE_IPL_ATTR_RW(dump_fcp, wwpn, "0x%016llx\n", "%llx\n",
		   dump_block_fcp->fcp.wwpn);
DEFINE_IPL_ATTR_RW(dump_fcp, lun, "0x%016llx\n", "%llx\n",
		   dump_block_fcp->fcp.lun);
DEFINE_IPL_ATTR_RW(dump_fcp, bootprog, "%lld\n", "%lld\n",
		   dump_block_fcp->fcp.bootprog);
DEFINE_IPL_ATTR_RW(dump_fcp, br_lba, "%lld\n", "%lld\n",
		   dump_block_fcp->fcp.br_lba);
DEFINE_IPL_ATTR_RW(dump_fcp, device, "0.0.%04llx\n", "0.0.%llx\n",
		   dump_block_fcp->fcp.devno);
DEFINE_IPL_ATTR_BOOTPROG_RW(dump_fcp, bootprog, "%lld\n", "%lld\n",
			    dump_block_fcp->hdr,
			    dump_block_fcp->fcp.bootprog);

DEFINE_IPL_ATTR_SCP_DATA_RW(dump_fcp, dump_block_fcp->hdr,
			    dump_block_fcp->fcp,
@@ -1604,10 +1626,11 @@ DEFINE_IPL_ATTR_RW(dump_nvme, fid, "0x%08llx\n", "%llx\n",
		   dump_block_nvme->nvme.fid);
DEFINE_IPL_ATTR_RW(dump_nvme, nsid, "0x%08llx\n", "%llx\n",
		   dump_block_nvme->nvme.nsid);
DEFINE_IPL_ATTR_RW(dump_nvme, bootprog, "%lld\n", "%llx\n",
		   dump_block_nvme->nvme.bootprog);
DEFINE_IPL_ATTR_RW(dump_nvme, br_lba, "%lld\n", "%llx\n",
		   dump_block_nvme->nvme.br_lba);
DEFINE_IPL_ATTR_BOOTPROG_RW(dump_nvme, bootprog, "%lld\n", "%llx\n",
			    dump_block_nvme->hdr,
			    dump_block_nvme->nvme.bootprog);

DEFINE_IPL_ATTR_SCP_DATA_RW(dump_nvme, dump_block_nvme->hdr,
			    dump_block_nvme->nvme,
@@ -1635,7 +1658,8 @@ static const struct attribute_group dump_nvme_attr_group = {

/* ECKD dump device attributes */
DEFINE_IPL_CCW_ATTR_RW(dump_eckd, device, dump_block_eckd->eckd);
DEFINE_IPL_ATTR_RW(dump_eckd, bootprog, "%lld\n", "%llx\n",
DEFINE_IPL_ATTR_BOOTPROG_RW(dump_eckd, bootprog, "%lld\n", "%llx\n",
			    dump_block_eckd->hdr,
			    dump_block_eckd->eckd.bootprog);

IPL_ATTR_BR_CHR_SHOW_FN(dump, dump_block_eckd->eckd);
+2 −16
Original line number Diff line number Diff line
@@ -104,7 +104,6 @@ void arch_stack_walk_user_common(stack_trace_consume_fn consume_entry, void *coo
	struct stack_frame_vdso_wrapper __user *sf_vdso;
	struct stack_frame_user __user *sf;
	unsigned long ip, sp;
	bool first = true;

	if (!current->mm)
		return;
@@ -133,24 +132,11 @@ void arch_stack_walk_user_common(stack_trace_consume_fn consume_entry, void *coo
			if (__get_user(ip, &sf->gprs[8]))
				break;
		}
		/* Sanity check: ABI requires SP to be 8 byte aligned. */
		if (sp & 0x7)
		/* Validate SP and RA (ABI requires SP to be 8 byte aligned). */
		if (sp & 0x7 || ip_invalid(ip))
			break;
		if (ip_invalid(ip)) {
			/*
			 * If the instruction address is invalid, and this
			 * is the first stack frame, assume r14 has not
			 * been written to the stack yet. Otherwise exit.
			 */
			if (!first)
				break;
			ip = regs->gprs[14];
			if (ip_invalid(ip))
				break;
		}
		if (!store_ip(consume_entry, cookie, entry, perf, ip))
			break;
		first = false;
	}
	pagefault_enable();
}
+6 −1
Original line number Diff line number Diff line
@@ -961,6 +961,7 @@ void zpci_device_reserved(struct zpci_dev *zdev)
}

void zpci_release_device(struct kref *kref)
	__releases(&zpci_list_lock)
{
	struct zpci_dev *zdev = container_of(kref, struct zpci_dev, kref);

@@ -1148,6 +1149,7 @@ static void zpci_add_devices(struct list_head *scan_list)

int zpci_scan_devices(void)
{
	struct zpci_bus *zbus;
	LIST_HEAD(scan_list);
	int rc;

@@ -1156,7 +1158,10 @@ int zpci_scan_devices(void)
		return rc;

	zpci_add_devices(&scan_list);
	zpci_bus_scan_busses();
	zpci_bus_for_each(zbus) {
		zpci_bus_scan_bus(zbus);
		cond_resched();
	}
	return 0;
}

Loading