Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bfed6d0f authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull s390 fixes from Martin Schwidefsky:
 "Improvements and bug fixes for 5.1-rc2:

   - Fix early free of the channel program in vfio

   - On AP device removal make sure that all messages are flushed with
     the driver still attached that queued the message

   - Limit brk randomization to 32MB to reduce the chance that the heap
     of ld.so is placed after the main stack

   - Add a rolling average for the steal time of a CPU, this will be
     needed for KVM to decide when to do busy waiting

   - Fix a warning in the CPU-MF code

   - Add a notification handler for AP configuration change to react
     faster to new AP devices"

* tag 's390-5.1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux:
  s390/cpumf: Fix warning from check_processor_id
  zcrypt: handle AP Info notification from CHSC SEI command
  vfio: ccw: only free cp on final interrupt
  s390/vtime: steal time exponential moving average
  s390/zcrypt: revisit ap device remove procedure
  s390: limit brk randomization to 32MB
parents 97c41a6b b6ffdf27
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -360,4 +360,15 @@ static inline struct ap_queue_status ap_dqap(ap_qid_t qid,
	return reg1;
}

/*
 * Interface to tell the AP bus code that a configuration
 * change has happened. The bus code should at least do
 * an ap bus resource rescan.
 */
#if IS_ENABLED(CONFIG_ZCRYPT)
void ap_bus_cfg_chg(void);
#else
static inline void ap_bus_cfg_chg(void){};
#endif

#endif /* _ASM_S390_AP_H_ */
+7 −4
Original line number Diff line number Diff line
@@ -252,11 +252,14 @@ do { \

/*
 * Cache aliasing on the latest machines calls for a mapping granularity
 * of 512KB. For 64-bit processes use a 512KB alignment and a randomization
 * of up to 1GB. For 31-bit processes the virtual address space is limited,
 * use no alignment and limit the randomization to 8MB.
 * of 512KB for the anonymous mapping base. For 64-bit processes use a
 * 512KB alignment and a randomization of up to 1GB. For 31-bit processes
 * the virtual address space is limited, use no alignment and limit the
 * randomization to 8MB.
 * For the additional randomization of the program break use 32MB for
 * 64-bit and 8MB for 31-bit.
 */
#define BRK_RND_MASK	(is_compat_task() ? 0x7ffUL : 0x3ffffUL)
#define BRK_RND_MASK	(is_compat_task() ? 0x7ffUL : 0x1fffUL)
#define MMAP_RND_MASK	(is_compat_task() ? 0x7ffUL : 0x3ff80UL)
#define MMAP_ALIGN_MASK	(is_compat_task() ? 0 : 0x7fUL)
#define STACK_RND_MASK	MMAP_RND_MASK
+31 −30
Original line number Diff line number Diff line
@@ -91,52 +91,53 @@ struct lowcore {
	__u64	hardirq_timer;			/* 0x02e8 */
	__u64	softirq_timer;			/* 0x02f0 */
	__u64	steal_timer;			/* 0x02f8 */
	__u64	last_update_timer;		/* 0x0300 */
	__u64	last_update_clock;		/* 0x0308 */
	__u64	int_clock;			/* 0x0310 */
	__u64	mcck_clock;			/* 0x0318 */
	__u64	clock_comparator;		/* 0x0320 */
	__u64	boot_clock[2];			/* 0x0328 */
	__u64	avg_steal_timer;		/* 0x0300 */
	__u64	last_update_timer;		/* 0x0308 */
	__u64	last_update_clock;		/* 0x0310 */
	__u64	int_clock;			/* 0x0318*/
	__u64	mcck_clock;			/* 0x0320 */
	__u64	clock_comparator;		/* 0x0328 */
	__u64	boot_clock[2];			/* 0x0330 */

	/* Current process. */
	__u64	current_task;			/* 0x0338 */
	__u64	kernel_stack;			/* 0x0340 */
	__u64	current_task;			/* 0x0340 */
	__u64	kernel_stack;			/* 0x0348 */

	/* Interrupt, DAT-off and restartstack. */
	__u64	async_stack;			/* 0x0348 */
	__u64	nodat_stack;			/* 0x0350 */
	__u64	restart_stack;			/* 0x0358 */
	__u64	async_stack;			/* 0x0350 */
	__u64	nodat_stack;			/* 0x0358 */
	__u64	restart_stack;			/* 0x0360 */

	/* Restart function and parameter. */
	__u64	restart_fn;			/* 0x0360 */
	__u64	restart_data;			/* 0x0368 */
	__u64	restart_source;			/* 0x0370 */
	__u64	restart_fn;			/* 0x0368 */
	__u64	restart_data;			/* 0x0370 */
	__u64	restart_source;			/* 0x0378 */

	/* Address space pointer. */
	__u64	kernel_asce;			/* 0x0378 */
	__u64	user_asce;			/* 0x0380 */
	__u64	vdso_asce;			/* 0x0388 */
	__u64	kernel_asce;			/* 0x0380 */
	__u64	user_asce;			/* 0x0388 */
	__u64	vdso_asce;			/* 0x0390 */

	/*
	 * The lpp and current_pid fields form a
	 * 64-bit value that is set as program
	 * parameter with the LPP instruction.
	 */
	__u32	lpp;				/* 0x0390 */
	__u32	current_pid;			/* 0x0394 */
	__u32	lpp;				/* 0x0398 */
	__u32	current_pid;			/* 0x039c */

	/* SMP info area */
	__u32	cpu_nr;				/* 0x0398 */
	__u32	softirq_pending;		/* 0x039c */
	__u32	preempt_count;			/* 0x03a0 */
	__u32	spinlock_lockval;		/* 0x03a4 */
	__u32	spinlock_index;			/* 0x03a8 */
	__u32	fpu_flags;			/* 0x03ac */
	__u64	percpu_offset;			/* 0x03b0 */
	__u64	vdso_per_cpu_data;		/* 0x03b8 */
	__u64	machine_flags;			/* 0x03c0 */
	__u64	gmap;				/* 0x03c8 */
	__u8	pad_0x03d0[0x0400-0x03d0];	/* 0x03d0 */
	__u32	cpu_nr;				/* 0x03a0 */
	__u32	softirq_pending;		/* 0x03a4 */
	__u32	preempt_count;			/* 0x03a8 */
	__u32	spinlock_lockval;		/* 0x03ac */
	__u32	spinlock_index;			/* 0x03b0 */
	__u32	fpu_flags;			/* 0x03b4 */
	__u64	percpu_offset;			/* 0x03b8 */
	__u64	vdso_per_cpu_data;		/* 0x03c0 */
	__u64	machine_flags;			/* 0x03c8 */
	__u64	gmap;				/* 0x03d0 */
	__u8	pad_0x03d8[0x0400-0x03d8];	/* 0x03d8 */

	/* br %r1 trampoline */
	__u16	br_r1_trampoline;		/* 0x0400 */
+13 −6
Original line number Diff line number Diff line
@@ -196,23 +196,30 @@ static void cf_diag_perf_event_destroy(struct perf_event *event)
 */
static int __hw_perf_event_init(struct perf_event *event)
{
	struct cpu_cf_events *cpuhw = this_cpu_ptr(&cpu_cf_events);
	struct perf_event_attr *attr = &event->attr;
	struct cpu_cf_events *cpuhw;
	enum cpumf_ctr_set i;
	int err = 0;

	debug_sprintf_event(cf_diag_dbg, 5,
			    "%s event %p cpu %d authorized %#x\n", __func__,
			    event, event->cpu, cpuhw->info.auth_ctl);
	debug_sprintf_event(cf_diag_dbg, 5, "%s event %p cpu %d\n", __func__,
			    event, event->cpu);

	event->hw.config = attr->config;
	event->hw.config_base = 0;
	local64_set(&event->count, 0);

	/* Add all authorized counter sets to config_base */
	/* Add all authorized counter sets to config_base. The
	 * the hardware init function is either called per-cpu or just once
	 * for all CPUS (event->cpu == -1).  This depends on the whether
	 * counting is started for all CPUs or on a per workload base where
	 * the perf event moves from one CPU to another CPU.
	 * Checking the authorization on any CPU is fine as the hardware
	 * applies the same authorization settings to all CPUs.
	 */
	cpuhw = &get_cpu_var(cpu_cf_events);
	for (i = CPUMF_CTR_SET_BASIC; i < CPUMF_CTR_SET_MAX; ++i)
		if (cpuhw->info.auth_ctl & cpumf_ctr_ctl[i])
			event->hw.config_base |= cpumf_ctr_ctl[i];
	put_cpu_var(cpu_cf_events);

	/* No authorized counter sets, nothing to count/sample */
	if (!event->hw.config_base) {
+2 −1
Original line number Diff line number Diff line
@@ -266,7 +266,8 @@ static void pcpu_prepare_secondary(struct pcpu *pcpu, int cpu)
	lc->percpu_offset = __per_cpu_offset[cpu];
	lc->kernel_asce = S390_lowcore.kernel_asce;
	lc->machine_flags = S390_lowcore.machine_flags;
	lc->user_timer = lc->system_timer = lc->steal_timer = 0;
	lc->user_timer = lc->system_timer =
		lc->steal_timer = lc->avg_steal_timer = 0;
	__ctl_store(lc->cregs_save_area, 0, 15);
	save_access_regs((unsigned int *) lc->access_regs_save_area);
	memcpy(lc->stfle_fac_list, S390_lowcore.stfle_fac_list,
Loading