|
@@ -46,6 +46,9 @@ debug_info_t *cio_debug_msg_id;
|
|
|
debug_info_t *cio_debug_trace_id;
|
|
|
debug_info_t *cio_debug_crw_id;
|
|
|
|
|
|
+DEFINE_PER_CPU_ALIGNED(struct irb, cio_irb);
|
|
|
+EXPORT_PER_CPU_SYMBOL(cio_irb);
|
|
|
+
|
|
|
/*
|
|
|
* Function: cio_debug_init
|
|
|
* Initializes three debug logs for common I/O:
|
|
@@ -560,7 +563,7 @@ static irqreturn_t do_cio_interrupt(int irq, void *dummy)
|
|
|
|
|
|
__this_cpu_write(s390_idle.nohz_delay, 1);
|
|
|
tpi_info = (struct tpi_info *) &get_irq_regs()->int_code;
|
|
|
- irb = (struct irb *) &S390_lowcore.irb;
|
|
|
+ irb = &__get_cpu_var(cio_irb);
|
|
|
sch = (struct subchannel *)(unsigned long) tpi_info->intparm;
|
|
|
if (!sch) {
|
|
|
/* Clear pending interrupt condition. */
|
|
@@ -609,7 +612,7 @@ void cio_tsch(struct subchannel *sch)
|
|
|
struct irb *irb;
|
|
|
int irq_context;
|
|
|
|
|
|
- irb = (struct irb *)&S390_lowcore.irb;
|
|
|
+ irb = &__get_cpu_var(cio_irb);
|
|
|
/* Store interrupt response block to lowcore. */
|
|
|
if (tsch(sch->schid, irb) != 0)
|
|
|
/* Not status pending or not operational. */
|
|
@@ -746,7 +749,7 @@ __clear_io_subchannel_easy(struct subchannel_id schid)
|
|
|
struct tpi_info ti;
|
|
|
|
|
|
if (tpi(&ti)) {
|
|
|
- tsch(ti.schid, (struct irb *)&S390_lowcore.irb);
|
|
|
+ tsch(ti.schid, &__get_cpu_var(cio_irb));
|
|
|
if (schid_equal(&ti.schid, &schid))
|
|
|
return 0;
|
|
|
}
|