Commit fee5be18 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull s390 fixes from Heiko Carstens:
 "One commit is fixing lockdep irq state tracing which broke with -rc6.

  The other one fixes logical vs physical CPU address mixup in our PCI
  code.

  Summary:

   - fix lockdep irq state tracing

   - fix logical vs physical CPU address confusion in PCI code"

* tag 's390-5.10-6' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux:
  s390: fix irq state tracing
  s390/pci: fix CPU address in MSI for directed IRQ
parents c82a505c b1cae1f8
Loading
Loading
Loading
Loading
+0 −15
Original line number Diff line number Diff line
@@ -763,12 +763,7 @@ ENTRY(io_int_handler)
	xc	__PT_FLAGS(8,%r11),__PT_FLAGS(%r11)
	TSTMSK	__LC_CPU_FLAGS,_CIF_IGNORE_IRQ
	jo	.Lio_restore
#if IS_ENABLED(CONFIG_TRACE_IRQFLAGS)
	tmhh	%r8,0x300
	jz	1f
	TRACE_IRQS_OFF
1:
#endif
	xc	__SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15)
.Lio_loop:
	lgr	%r2,%r11		# pass pointer to pt_regs
@@ -791,12 +786,7 @@ ENTRY(io_int_handler)
	TSTMSK	__LC_CPU_FLAGS,_CIF_WORK
	jnz	.Lio_work
.Lio_restore:
#if IS_ENABLED(CONFIG_TRACE_IRQFLAGS)
	tm	__PT_PSW(%r11),3
	jno	0f
	TRACE_IRQS_ON
0:
#endif
	mvc	__LC_RETURN_PSW(16),__PT_PSW(%r11)
	tm	__PT_PSW+1(%r11),0x01	# returning to user ?
	jno	.Lio_exit_kernel
@@ -976,12 +966,7 @@ ENTRY(ext_int_handler)
	xc	__PT_FLAGS(8,%r11),__PT_FLAGS(%r11)
	TSTMSK	__LC_CPU_FLAGS,_CIF_IGNORE_IRQ
	jo	.Lio_restore
#if IS_ENABLED(CONFIG_TRACE_IRQFLAGS)
	tmhh	%r8,0x300
	jz	1f
	TRACE_IRQS_OFF
1:
#endif
	xc	__SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15)
	lgr	%r2,%r11		# pass pointer to pt_regs
	lghi	%r3,EXT_INTERRUPT
+2 −3
Original line number Diff line number Diff line
@@ -33,7 +33,7 @@ EXPORT_SYMBOL(__delay);

static void __udelay_disabled(unsigned long long usecs)
{
	unsigned long cr0, cr0_new, psw_mask, flags;
	unsigned long cr0, cr0_new, psw_mask;
	struct s390_idle_data idle;
	u64 end;

@@ -45,9 +45,8 @@ static void __udelay_disabled(unsigned long long usecs)
	psw_mask = __extract_psw() | PSW_MASK_EXT | PSW_MASK_WAIT;
	set_clock_comparator(end);
	set_cpu_flag(CIF_IGNORE_IRQ);
	local_irq_save(flags);
	psw_idle(&idle, psw_mask);
	local_irq_restore(flags);
	trace_hardirqs_off();
	clear_cpu_flag(CIF_IGNORE_IRQ);
	set_clock_comparator(S390_lowcore.clock_comparator);
	__ctl_load(cr0, 0, 0);
+11 −3
Original line number Diff line number Diff line
@@ -103,9 +103,10 @@ static int zpci_set_irq_affinity(struct irq_data *data, const struct cpumask *de
{
	struct msi_desc *entry = irq_get_msi_desc(data->irq);
	struct msi_msg msg = entry->msg;
	int cpu_addr = smp_cpu_get_cpu_address(cpumask_first(dest));

	msg.address_lo &= 0xff0000ff;
	msg.address_lo |= (cpumask_first(dest) << 8);
	msg.address_lo |= (cpu_addr << 8);
	pci_write_msi_msg(data->irq, &msg);

	return IRQ_SET_MASK_OK;
@@ -238,6 +239,7 @@ int arch_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
	unsigned long bit;
	struct msi_desc *msi;
	struct msi_msg msg;
	int cpu_addr;
	int rc, irq;

	zdev->aisb = -1UL;
@@ -287,9 +289,15 @@ int arch_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
					 handle_percpu_irq);
		msg.data = hwirq - bit;
		if (irq_delivery == DIRECTED) {
			if (msi->affinity)
				cpu = cpumask_first(&msi->affinity->mask);
			else
				cpu = 0;
			cpu_addr = smp_cpu_get_cpu_address(cpu);

			msg.address_lo = zdev->msi_addr & 0xff0000ff;
			msg.address_lo |= msi->affinity ?
				(cpumask_first(&msi->affinity->mask) << 8) : 0;
			msg.address_lo |= (cpu_addr << 8);

			for_each_possible_cpu(cpu) {
				airq_iv_set_data(zpci_ibv[cpu], hwirq, irq);
			}