Skip to contentSkip to conversation

s390 bux fixes for 2.6.25-rc4.

PATCH New Martin Schwidefsky 1 participant 11 messages Mar 5, 2008

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

cover s390 bux fixes for 2.6.25-rc4.

Assorted bug fixes for s390. The shortlog:

Christian Borntraeger (1):
[S390] sclp_vt220: speed up console output for interactive work

Heiko Carstens (3):
[S390] idle: Fix machine check handling in idle loop. [S390] Get rid of memcpy gcc warning workaround. [S390] Fix IPL from NSS.

Hongjie Yang (1):
[S390] incorrect reipl nss name.

Martin Schwidefsky (1):
[S390] Update default configuration.

Michael Holzheu (1):
[S390] Load disabled wait psw if reipl fails.

Ralph Wuerthner (1):
[S390] zcrypt: fix ap_device_list handling

Stefan Weinhuber (2):
[S390] dasd: let dasd erp matching recognize alias recovery [S390] dasd: fix reference counting in display method for proc/dasd/devices

Signature · 4 lines
blue skies,
   Martin.

"Reality continues to ruin my life." - Calvin.
#1 lore raw

PATCH 1/10 Update default configuration.

From: Martin Schwidefsky <[email protected]>

---

 arch/s390/defconfig |   18 +++++++++++++-----
 1 file changed, 13 insertions(+), 5 deletions(-)
arch/s390/defconfig +13 -5
Index: quilt-2.6/arch/s390/defconfig
===================================================================
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.24
-# Sat Feb  9 12:13:01 2008
+# Linux kernel version: 2.6.25-rc4
+# Wed Mar  5 11:22:59 2008
 #
 CONFIG_MMU=y
 CONFIG_ZONE_DMA=y
@@ -43,12 +43,15 @@ CONFIG_CGROUPS=y
 # CONFIG_CGROUP_DEBUG is not set
 CONFIG_CGROUP_NS=y
 # CONFIG_CPUSETS is not set
+CONFIG_GROUP_SCHED=y
 CONFIG_FAIR_GROUP_SCHED=y
-CONFIG_FAIR_USER_SCHED=y
-# CONFIG_FAIR_CGROUP_SCHED is not set
+# CONFIG_RT_GROUP_SCHED is not set
+CONFIG_USER_SCHED=y
+# CONFIG_CGROUP_SCHED is not set
 # CONFIG_CGROUP_CPUACCT is not set
 # CONFIG_RESOURCE_COUNTERS is not set
 CONFIG_SYSFS_DEPRECATED=y
+CONFIG_SYSFS_DEPRECATED_V2=y
 # CONFIG_RELAY is not set
 CONFIG_NAMESPACES=y
 CONFIG_UTS_NS=y
@@ -85,7 +88,9 @@ CONFIG_SLAB=y
 # CONFIG_MARKERS is not set
 CONFIG_HAVE_OPROFILE=y
 CONFIG_KPROBES=y
+CONFIG_KRETPROBES=y
 CONFIG_HAVE_KPROBES=y
+CONFIG_HAVE_KRETPROBES=y
 CONFIG_PROC_PAGE_MONITOR=y
 CONFIG_SLABINFO=y
 CONFIG_RT_MUTEXES=y
@@ -185,6 +190,7 @@ CONFIG_IPL=y
 CONFIG_IPL_VM=y
 CONFIG_BINFMT_ELF=y
 CONFIG_BINFMT_MISC=m
+CONFIG_FORCE_MAX_ZONEORDER=9
 # CONFIG_PROCESS_DEBUG is not set
 CONFIG_PFAULT=y
 # CONFIG_SHARED_KERNEL is not set
@@ -435,6 +441,7 @@ CONFIG_DASD_EER=y
 CONFIG_MISC_DEVICES=y
 # CONFIG_EEPROM_93CX6 is not set
 # CONFIG_ENCLOSURE_SERVICES is not set
+# CONFIG_HAVE_IDE is not set
 
 #
 # SCSI device support
@@ -593,6 +600,7 @@ CONFIG_S390_VMUR=m
 #
 # Sonics Silicon Backplane
 #
+# CONFIG_MEMSTICK is not set
 
 #
 # File systems
@@ -750,7 +758,6 @@ CONFIG_DEBUG_BUGVERBOSE=y
 # CONFIG_DEBUG_LIST is not set
 # CONFIG_DEBUG_SG is not set
 # CONFIG_FRAME_POINTER is not set
-CONFIG_FORCED_INLINING=y
 # CONFIG_RCU_TORTURE_TEST is not set
 # CONFIG_KPROBES_SANITY_TEST is not set
 # CONFIG_BACKTRACE_SELF_TEST is not set
@@ -759,6 +766,7 @@ CONFIG_FORCED_INLINING=y
 # CONFIG_LATENCYTOP is not set
 CONFIG_SAMPLES=y
 # CONFIG_SAMPLE_KOBJECT is not set
+# CONFIG_SAMPLE_KPROBES is not set
 # CONFIG_DEBUG_PAGEALLOC is not set
 
 #
Signature · 4 lines
blue skies,
   Martin.

"Reality continues to ruin my life." - Calvin.
#2 lore raw

PATCH 2/10 idle: Fix machine check handling in idle loop.

In reply to Martin Schwidefsky

From: Heiko Carstens <[email protected]>

If a machine check handling is pending when the idle loop is entered default_idle will be left with timer ticks and virtual timer disabled. Fix this by "calling" the idle_chain. Also a BUG_ON(!in_interrupt) in start_hz_timer must be removed since the function now gets called from non interrupt context as well.

---

 arch/s390/kernel/process.c |    4 ++++
 arch/s390/kernel/time.c    |    2 --
 2 files changed, 4 insertions(+), 2 deletions(-)
arch/s390/kernel/process.c +4 -0
Index: quilt-2.6/arch/s390/kernel/process.c
===================================================================
@@ -152,6 +152,10 @@ static void default_idle(void)
 	local_mcck_disable();
 	if (test_thread_flag(TIF_MCCK_PENDING)) {
 		local_mcck_enable();
+		/* disable monitor call class 0 */
+		__ctl_clear_bit(8, 15);
+		atomic_notifier_call_chain(&idle_chain, S390_CPU_NOT_IDLE,
+					   hcpu);
 		local_irq_enable();
 		s390_handle_mcck();
 		return;
arch/s390/kernel/time.c +0 -2
Index: quilt-2.6/arch/s390/kernel/time.c
===================================================================
@@ -209,8 +209,6 @@ static void stop_hz_timer(void)
  */
 static void start_hz_timer(void)
 {
-	BUG_ON(!in_interrupt());
-
 	if (!cpu_isset(smp_processor_id(), nohz_cpu_mask))
 		return;
 	account_ticks(get_clock());
Signature · 4 lines
blue skies,
   Martin.

"Reality continues to ruin my life." - Calvin.
#3 lore raw

PATCH 3/10 Get rid of memcpy gcc warning workaround.

In reply to Martin Schwidefsky

From: Heiko Carstens <[email protected]>

Compile smp.o with -Wno-nonnull so gcc stops warning about memcpy being used with a null parameter. Also remove the workaround code and use a char * cast instead of a void * cast to do computations.

---

 arch/s390/kernel/Makefile |    5 +++++
 arch/s390/kernel/smp.c    |   10 ++--------
 2 files changed, 7 insertions(+), 8 deletions(-)
arch/s390/kernel/Makefile +5 -0
Index: quilt-2.6/arch/s390/kernel/Makefile
===================================================================
@@ -4,6 +4,11 @@
 
 EXTRA_AFLAGS	:= -traditional
 
+#
+# Passing null pointers is ok for smp code, since we access the lowcore here.
+#
+CFLAGS_smp.o	:= -Wno-nonnull
+
 obj-y	:=  bitmap.o traps.o time.o process.o base.o early.o \
             setup.o sys_s390.o ptrace.o signal.o cpcmd.o ebcdic.o \
 	    semaphore.o s390_ext.o debug.o irq.o ipl.o dis.o diag.o
arch/s390/kernel/smp.c +2 -8
Index: quilt-2.6/arch/s390/kernel/smp.c
===================================================================
@@ -629,14 +629,8 @@ static int __cpuinit smp_alloc_lowcore(i
 	panic_stack = __get_free_page(GFP_KERNEL);
 	if (!panic_stack || !async_stack)
 		goto out;
-	/*
-	 * Only need to copy the first 512 bytes from address 0. But since
-	 * the compiler emits a warning if src == NULL for memcpy use copy_page
-	 * instead. Copies more than needed but this code is not performance
-	 * critical.
-	 */
-	copy_page(lowcore, &S390_lowcore);
-	memset((void *)lowcore + 512, 0, sizeof(*lowcore) - 512);
+	memcpy(lowcore, &S390_lowcore, 512);
+	memset((char *)lowcore + 512, 0, sizeof(*lowcore) - 512);
 	lowcore->async_stack = async_stack + ASYNC_SIZE;
 	lowcore->panic_stack = panic_stack + PAGE_SIZE;
 
Signature · 4 lines
blue skies,
   Martin.

"Reality continues to ruin my life." - Calvin.
#4 lore raw

PATCH 4/10 dasd: let dasd erp matching recognize alias recovery

In reply to Martin Schwidefsky

From: Stefan Weinhuber <[email protected]>

When a request fails that was started on an alias device then the first recovery step is to retry it on the base device. If the recovery request fails again with the same symptoms, the next step should not be a simple retry, but should be a proper recovery based on sense data, etc. To do so, the dasd recovery functions need to recognize the alias recovery step in the erp chain by comparing the start devices.

---

 drivers/s390/block/dasd_3990_erp.c |    6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)
drivers/s390/block/dasd_3990_erp.c +2 -4
Index: quilt-2.6/drivers/s390/block/dasd_3990_erp.c
===================================================================
@@ -2310,10 +2310,8 @@ static int
 dasd_3990_erp_error_match(struct dasd_ccw_req *cqr1, struct dasd_ccw_req *cqr2)
 {
 
-	/* check failed CCW */
-	if (cqr1->irb.scsw.cpa != cqr2->irb.scsw.cpa) {
-		//	return 0;	/* CCW doesn't match */
-	}
+	if (cqr1->startdev != cqr2->startdev)
+		return 0;
 
 	if (cqr1->irb.esw.esw0.erw.cons != cqr2->irb.esw.esw0.erw.cons)
 		return 0;
Signature · 4 lines
blue skies,
   Martin.

"Reality continues to ruin my life." - Calvin.
#5 lore raw

PATCH 5/10 dasd: fix reference counting in display method for proc/dasd/devices

In reply to Martin Schwidefsky

From: Stefan Weinhuber <[email protected]>

Using the /proc/dasd/devices interface leaves the reference counter of alias devices in an inconsistent state. A process that tries to set such a device offline afterwards will hang.
The dasd_devices_show function returns immediately for alias devices and this code path was missing a dasd_put_device call.

---

 drivers/s390/block/dasd_proc.c |    4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/s390/block/dasd_proc.c +3 -1
Index: quilt-2.6/drivers/s390/block/dasd_proc.c
===================================================================
@@ -62,8 +62,10 @@ dasd_devices_show(struct seq_file *m, vo
 		return 0;
 	if (device->block)
 		block = device->block;
-	else
+	else {
+		dasd_put_device(device);
 		return 0;
+	}
 	/* Print device number. */
 	seq_printf(m, "%s", device->cdev->dev.bus_id);
 	/* Print discipline string. */
Signature · 4 lines
blue skies,
   Martin.

"Reality continues to ruin my life." - Calvin.
#6 lore raw

PATCH 6/10 sclp_vt220: speed up console output for interactive work

In reply to Martin Schwidefsky

From: Christian Borntraeger <[email protected]>

Currently an output buffer can wait up to HZ/2 until the buffer is flushed. The wait time is noticeable in interactive tools like mc.

Change the value to HZ/20, which seems enough for interactive work.

---

 drivers/s390/char/sclp_vt220.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/s390/char/sclp_vt220.c +1 -1
Index: quilt-2.6/drivers/s390/char/sclp_vt220.c
===================================================================
@@ -367,7 +367,7 @@ sclp_vt220_timeout(unsigned long data)
 	sclp_vt220_emit_current();
 }
 
-#define BUFFER_MAX_DELAY	HZ/2
+#define BUFFER_MAX_DELAY	HZ/20
 
 /* 
  * Internal implementation of the write function. Write COUNT bytes of data
Signature · 4 lines
blue skies,
   Martin.

"Reality continues to ruin my life." - Calvin.
#7 lore raw

PATCH 7/10 zcrypt: fix ap_device_list handling

In reply to Martin Schwidefsky

From: Ralph Wuerthner <[email protected]>

In ap_device_probe() we can add the new ap device to the internal device list only if the device probe function successfully returns. Otherwise we might end up with an invalid device in the internal ap device list.

---

 drivers/s390/crypto/ap_bus.c |   12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)
drivers/s390/crypto/ap_bus.c +7 -5
Index: quilt-2.6/drivers/s390/crypto/ap_bus.c
===================================================================
@@ -490,10 +490,12 @@ static int ap_device_probe(struct device
 	int rc;
 
 	ap_dev->drv = ap_drv;
-	spin_lock_bh(&ap_device_lock);
-	list_add(&ap_dev->list, &ap_device_list);
-	spin_unlock_bh(&ap_device_lock);
 	rc = ap_drv->probe ? ap_drv->probe(ap_dev) : -ENODEV;
+	if (!rc) {
+		spin_lock_bh(&ap_device_lock);
+		list_add(&ap_dev->list, &ap_device_list);
+		spin_unlock_bh(&ap_device_lock);
+	}
 	return rc;
 }
 
@@ -532,11 +534,11 @@ static int ap_device_remove(struct devic
 
 	ap_flush_queue(ap_dev);
 	del_timer_sync(&ap_dev->timeout);
-	if (ap_drv->remove)
-		ap_drv->remove(ap_dev);
 	spin_lock_bh(&ap_device_lock);
 	list_del_init(&ap_dev->list);
 	spin_unlock_bh(&ap_device_lock);
+	if (ap_drv->remove)
+		ap_drv->remove(ap_dev);
 	spin_lock_bh(&ap_dev->lock);
 	atomic_sub(ap_dev->queue_count, &ap_poll_requests);
 	spin_unlock_bh(&ap_dev->lock);
Signature · 4 lines
blue skies,
   Martin.

"Reality continues to ruin my life." - Calvin.
#8 lore raw

PATCH 8/10 Fix IPL from NSS.

In reply to Martin Schwidefsky

From: Heiko Carstens <[email protected]>

IPL from NSS didn't work because the memory detection routine omits any memory sections with a size lower than what MAX_ORDER defines. This causes the detection routine to skip the first memory segment which has a size of 1MB. Which later on will let the kernel think that there is no memory available at all.
Since in addition the z/VM memory increment size is 1MB force MAX_ORDER to be 9, so we can support 1MB segments.

---

 arch/s390/Kconfig |    4 ++++
 1 file changed, 4 insertions(+)
arch/s390/Kconfig +4 -0
Index: quilt-2.6/arch/s390/Kconfig
===================================================================
@@ -351,6 +351,10 @@ endchoice
 
 source "fs/Kconfig.binfmt"
 
+config FORCE_MAX_ZONEORDER
+	int
+	default "9"
+
 config PROCESS_DEBUG
 	bool "Show crashed user process info"
 	help
Signature · 4 lines
blue skies,
   Martin.

"Reality continues to ruin my life." - Calvin.
#9 lore raw

PATCH 9/10 Load disabled wait psw if reipl fails.

In reply to Martin Schwidefsky

From: Michael Holzheu <[email protected]>

Normally this should not happen, but it's cleaner to do it that way.

---

 arch/s390/kernel/ipl.c |    1 +
 1 file changed, 1 insertion(+)
arch/s390/kernel/ipl.c +1 -0
Index: quilt-2.6/arch/s390/kernel/ipl.c
===================================================================
@@ -704,6 +704,7 @@ void reipl_run(struct shutdown_trigger *
 	default:
 		break;
 	}
+	disabled_wait((unsigned long) __builtin_return_address(0));
 }
 
 static void __init reipl_probe(void)
Signature · 4 lines
blue skies,
   Martin.

"Reality continues to ruin my life." - Calvin.
#10 lore raw

PATCH 10/10 incorrect reipl nss name.

In reply to Martin Schwidefsky

From: Hongjie Yang <[email protected]>

/sys/firmware/reipl/nss/name contains the nss name when defsys or savesys command has been executed. If the defsys or savesys command fails the kernel_nss_name has to be cleared since a reipl on that nss name won't be possible.

---

 arch/s390/kernel/early.c |    8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)
arch/s390/kernel/early.c +6 -2
Index: quilt-2.6/arch/s390/kernel/early.c
===================================================================
@@ -88,13 +88,17 @@ static noinline __init void create_kerne
 
 	__cpcmd(defsys_cmd, NULL, 0, &response);
 
-	if (response != 0)
+	if (response != 0) {
+		kernel_nss_name[0] = '\0';
 		return;
+	}
 
 	__cpcmd(savesys_cmd, NULL, 0, &response);
 
-	if (response != strlen(savesys_cmd))
+	if (response != strlen(savesys_cmd)) {
+		kernel_nss_name[0] = '\0';
 		return;
+	}
 
 	ipl_flags = IPL_NSS_VALID;
 }
Signature · 4 lines
blue skies,
   Martin.

"Reality continues to ruin my life." - Calvin.