From 33583c3657ef30cd7f4cb563071ac23cb6ff69a0 Mon Sep 17 00:00:00 2001 From: Heiko Carstens Date: Mon, 5 Nov 2007 11:10:07 +0100 Subject: [S390] cio: use INIT_WORK to initialize struct work. Use INIT_WORK to initialize struct work and don't initialize a struct work partial by explicitly initializing its private structures. Fixes the following lockdep bug because no key was assigned: INFO: trying to register non-static key. the code is fine but needs lockdep annotation. turning off the locking correctness validator. 0000000001f07bb8 0000000001f07bf8 0000000000000002 0000000000000000 0000000001f07c98 0000000001f07c10 0000000001f07c10 0000000000015406 0000000000000000 0000000000000002 0000000000000000 0000000000000000 0000000001f07bf8 000000000000000c 0000000001f07bf8 0000000001f07c68 000000000039ae60 0000000000015406 0000000001f07bf8 0000000001f07c48 Call Trace: ([<0000000000015376>] show_trace+0xda/0x104) [<0000000000015460>] show_stack+0xc0/0xf8 [<00000000000154c6>] dump_stack+0x2e/0x3c [<000000000006a71e>] __lock_acquire+0x47e/0x11a0 [<000000000006b4f0>] lock_acquire+0xb0/0xd8 [<00000000000555a6>] run_workqueue+0x1aa/0x24c [<00000000000556de>] worker_thread+0x96/0xf4 [<000000000005c210>] kthread+0x90/0xb4 [<000000000001947a>] kernel_thread_starter+0x6/0xc [<0000000000019474>] kernel_thread_starter+0x0/0xc Signed-off-by: Heiko Carstens Signed-off-by: Martin Schwidefsky --- drivers/s390/cio/device.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c index 7ee57f084a89..74f6b539974a 100644 --- a/drivers/s390/cio/device.c +++ b/drivers/s390/cio/device.c @@ -738,7 +738,7 @@ static int io_subchannel_initialize_dev(struct subchannel *sch, atomic_set(&cdev->private->onoff, 0); cdev->dev.parent = &sch->dev; cdev->dev.release = ccw_device_release; - INIT_LIST_HEAD(&cdev->private->kick_work.entry); + INIT_WORK(&cdev->private->kick_work, NULL); cdev->dev.groups = ccwdev_attr_groups; /* Do first half of device_register. */ device_initialize(&cdev->dev); -- cgit v1.2.3 From 0fc3ddd67a6781238b038165d9dd8c1f9ba81111 Mon Sep 17 00:00:00 2001 From: Christian Borntraeger Date: Mon, 5 Nov 2007 11:10:08 +0100 Subject: [S390] Fix smsgiucv init on no iucv machines smsgiucv is a driver that relies on iucv to work properly. If iucv ans smsgiucv are compiled into the kernel and run on an lpar the following scenario happens: iucv is initialized early as a subsystem. It checks for z/VM and returns with EPROTONOTSUPPORT. Later smsgiucv tries to run driver_register with iucv_bus as bus. As this bus is not initialized the driver core and list debugging issue several warnings and oopses. Solution is to let smsgiucv also check for z/VM and return EPROTONOTSUPPORT as well. Signed-off-by: Christian Borntraeger Signed-off-by: Martin Schwidefsky --- drivers/s390/net/smsgiucv.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/s390/net/smsgiucv.c b/drivers/s390/net/smsgiucv.c index 3ccca5871fdf..47bb47b48581 100644 --- a/drivers/s390/net/smsgiucv.c +++ b/drivers/s390/net/smsgiucv.c @@ -148,6 +148,10 @@ static int __init smsg_init(void) { int rc; + if (!MACHINE_IS_VM) { + rc = -EPROTONOSUPPORT; + goto out; + } rc = driver_register(&smsg_driver); if (rc != 0) goto out; -- cgit v1.2.3 From 931bb68ba6355b7111966c90822ed862c102a9cd Mon Sep 17 00:00:00 2001 From: Gerald Schaefer Date: Mon, 5 Nov 2007 11:10:09 +0100 Subject: [S390] device_schedule_callback() for dcssblk. Unregistering a device from within a device attribute handler leads to a deadlock. Need to use device_schedule_callback() to unregister device in error path. Signed-off-by: Gerald Schaefer Signed-off-by: Martin Schwidefsky --- drivers/s390/block/dcssblk.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/drivers/s390/block/dcssblk.c b/drivers/s390/block/dcssblk.c index 859f870552e3..5e083d1f57e7 100644 --- a/drivers/s390/block/dcssblk.c +++ b/drivers/s390/block/dcssblk.c @@ -193,6 +193,12 @@ dcssblk_segment_warn(int rc, char* seg_name) } } +static void dcssblk_unregister_callback(struct device *dev) +{ + device_unregister(dev); + put_device(dev); +} + /* * device attribute for switching shared/nonshared (exclusive) * operation (show + store) @@ -276,8 +282,7 @@ removeseg: blk_cleanup_queue(dev_info->dcssblk_queue); dev_info->gd->queue = NULL; put_disk(dev_info->gd); - device_unregister(dev); - put_device(dev); + rc = device_schedule_callback(dev, dcssblk_unregister_callback); out: up_write(&dcssblk_devices_sem); return rc; -- cgit v1.2.3 From 0d2be08893605be00de0f95ee7e4b8917ea1ebc3 Mon Sep 17 00:00:00 2001 From: Heiko Carstens Date: Mon, 5 Nov 2007 11:10:10 +0100 Subject: [S390] Fix compile on !CONFIG_SMP. Commit fae8b22d3e3e3a3d317a7746493997af02a3f35c "[S390] Add per-cpu idle time / idle count sysfs attributes" causes a link error on !CONFIG_SMP. Fix this by adding some #ifdef's. Real fix would be to cleanup the code since we don't register a cpu on !CONFIG_SMP. But that would be quite a big patch. For the time being this is good enough. arch/s390/kernel/built-in.o: In function `do_monitor_call': (.text+0x50d4): undefined reference to `per_cpu__s390_idle' arch/s390/kernel/built-in.o: In function `cpu_idle': (.text+0x518c): undefined reference to `per_cpu__s390_idle' make: *** [.tmp_vmlinux1] Error 1 Signed-off-by: Heiko Carstens Signed-off-by: Martin Schwidefsky --- arch/s390/kernel/process.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c index 96492cf2d491..29f7884b4ffa 100644 --- a/arch/s390/kernel/process.c +++ b/arch/s390/kernel/process.c @@ -92,6 +92,7 @@ EXPORT_SYMBOL(unregister_idle_notifier); void do_monitor_call(struct pt_regs *regs, long interruption_code) { +#ifdef CONFIG_SMP struct s390_idle_data *idle; idle = &__get_cpu_var(s390_idle); @@ -99,7 +100,7 @@ void do_monitor_call(struct pt_regs *regs, long interruption_code) idle->idle_time += get_clock() - idle->idle_enter; idle->in_idle = 0; spin_unlock(&idle->lock); - +#endif /* disable monitor call class 0 */ __ctl_clear_bit(8, 15); @@ -114,7 +115,9 @@ extern void s390_handle_mcck(void); static void default_idle(void) { int cpu, rc; +#ifdef CONFIG_SMP struct s390_idle_data *idle; +#endif /* CPU is going idle. */ cpu = smp_processor_id(); @@ -151,13 +154,14 @@ static void default_idle(void) s390_handle_mcck(); return; } - +#ifdef CONFIG_SMP idle = &__get_cpu_var(s390_idle); spin_lock(&idle->lock); idle->idle_count++; idle->in_idle = 1; idle->idle_enter = get_clock(); spin_unlock(&idle->lock); +#endif trace_hardirqs_on(); /* Wait for external, I/O or machine check interrupt. */ __load_psw_mask(psw_kernel_bits | PSW_MASK_WAIT | -- cgit v1.2.3 From 0b8da654b6c13b40b0e0efd916ee57ed13f9fa1f Mon Sep 17 00:00:00 2001 From: Heiko Carstens Date: Mon, 5 Nov 2007 11:10:11 +0100 Subject: [S390] Fix memory detection. Yet another patch in the countless series of memory detection fixes: if the last area of the reported storage size is a hole the detection loop will loop forever. Just break chunk detection loop if its end is going to be larger than reported storage size. Signed-off-by: Heiko Carstens Signed-off-by: Martin Schwidefsky --- arch/s390/kernel/early.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/arch/s390/kernel/early.c b/arch/s390/kernel/early.c index e6289ee74ecd..8bf4ae1150be 100644 --- a/arch/s390/kernel/early.c +++ b/arch/s390/kernel/early.c @@ -200,11 +200,13 @@ static noinline __init void find_memory_chunks(unsigned long memsize) cc = __tprot(addr); while (cc == old_cc) { addr += CHUNK_INCR; - cc = __tprot(addr); + if (addr >= memsize) + break; #ifndef CONFIG_64BIT if (addr == ADDR2G) break; #endif + cc = __tprot(addr); } if (old_addr != addr && -- cgit v1.2.3 From b2eaee6e81696d80d9c6ecfcbba8951673e83934 Mon Sep 17 00:00:00 2001 From: Roel Kluin <12o3l@tiscali.nl> Date: Mon, 5 Nov 2007 11:10:12 +0100 Subject: [S390] Fix priority mistakes in drivers/s390/cio/cmf.c Fixes priority mistakes similar to '!x & y' Signed-off-by: Roel Kluin <12o3l@tiscali.nl> Signed-off-by: Martin Schwidefsky --- drivers/s390/cio/cmf.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/s390/cio/cmf.c b/drivers/s390/cio/cmf.c index 725b0dd14269..f4c132ab39ed 100644 --- a/drivers/s390/cio/cmf.c +++ b/drivers/s390/cio/cmf.c @@ -343,10 +343,10 @@ static int cmf_copy_block(struct ccw_device *cdev) if (sch->schib.scsw.fctl & SCSW_FCTL_START_FUNC) { /* Don't copy if a start function is in progress. */ - if ((!sch->schib.scsw.actl & SCSW_ACTL_SUSPENDED) && + if ((!(sch->schib.scsw.actl & SCSW_ACTL_SUSPENDED)) && (sch->schib.scsw.actl & (SCSW_ACTL_DEVACT | SCSW_ACTL_SCHACT)) && - (!sch->schib.scsw.stctl & SCSW_STCTL_SEC_STATUS)) + (!(sch->schib.scsw.stctl & SCSW_STCTL_SEC_STATUS))) return -EBUSY; } cmb_data = cdev->private->cmb; -- cgit v1.2.3 From 69d39d6669a01e26ae6dbf5c3e84e0d1b6ccf332 Mon Sep 17 00:00:00 2001 From: Heiko Carstens Date: Mon, 5 Nov 2007 11:10:13 +0100 Subject: [S390] Rename "idle_time" attribute to "idle_time_us". Seems that people prefer to have the unit encoded in the attribute name. Also makes parsing easier. Now we have: # cat /sys/devices/system/cpu/cpu0/idle_time_us 131473592 instead of # cat /sys/devices/system/cpu/cpu0/idle_time 131473592 us Cc: Arjan van de Ven Signed-off-by: Heiko Carstens Signed-off-by: Martin Schwidefsky --- arch/s390/kernel/smp.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c index 1d97fe1c0e53..b05ae8584258 100644 --- a/arch/s390/kernel/smp.c +++ b/arch/s390/kernel/smp.c @@ -788,14 +788,14 @@ static ssize_t show_idle_time(struct sys_device *dev, char *buf) } new_time = idle->idle_time; spin_unlock_irq(&idle->lock); - return sprintf(buf, "%llu us\n", new_time >> 12); + return sprintf(buf, "%llu\n", new_time >> 12); } -static SYSDEV_ATTR(idle_time, 0444, show_idle_time, NULL); +static SYSDEV_ATTR(idle_time_us, 0444, show_idle_time, NULL); static struct attribute *cpu_attrs[] = { &attr_capability.attr, &attr_idle_count.attr, - &attr_idle_time.attr, + &attr_idle_time_us.attr, NULL, }; -- cgit v1.2.3 From d2cb0e6ecbe0ef93ab36631cd17ec6cf92b69c5a Mon Sep 17 00:00:00 2001 From: Christian Borntraeger Date: Mon, 5 Nov 2007 11:10:14 +0100 Subject: [S390] tod clock: announce clocksource as perfect The Time of Day clock is the standard time source for s390. It is - monotonic - allows very fast reading - architecture guarantees at least microsecond stepping - available as part of the architecture We should announce the rate of tod as 400 to be in sync with the description found in clocksource.h: "400-499:Perfect The ideal clocksource. A must-use where available." This change will prefer tod over less reliable clock sources. Signed-off-by: Christian Borntraeger Signed-off-by: Martin Schwidefsky --- arch/s390/kernel/time.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/s390/kernel/time.c b/arch/s390/kernel/time.c index 48dae49bc1ec..a963fe81359e 100644 --- a/arch/s390/kernel/time.c +++ b/arch/s390/kernel/time.c @@ -307,7 +307,7 @@ static cycle_t read_tod_clock(void) static struct clocksource clocksource_tod = { .name = "tod", - .rating = 100, + .rating = 400, .read = read_tod_clock, .mask = -1ULL, .mult = 1000, -- cgit v1.2.3