]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
s390/ipl: Implement diag308 loop for zfcpdump
authorMichael Holzheu <holzheu@linux.vnet.ibm.com>
Mon, 21 Jan 2013 17:35:15 +0000 (18:35 +0100)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Thu, 14 Feb 2013 14:55:05 +0000 (15:55 +0100)
When a zfcpdump is triggered and a second dump on the same CEC is
already in progress for another LPAR, diagnose 308 returns with
an error code until the first dump is finished. Currently the
second Linux stops with a disabled wait PSW in that case.

This is improved now by by triggering diag 308 in a loop until
it works.

Signed-off-by: Michael Holzheu <holzheu@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/kernel/ipl.c

index 6ffcd3203215a2bcacb50bc35ae12229113b0ff4..d8a6a385d0480dcd46e4dba51642532d83ea7889 100644 (file)
@@ -1414,6 +1414,16 @@ static struct kobj_attribute dump_type_attr =
 
 static struct kset *dump_kset;
 
+static void diag308_dump(void *dump_block)
+{
+       diag308(DIAG308_SET, dump_block);
+       while (1) {
+               if (diag308(DIAG308_DUMP, NULL) != 0x302)
+                       break;
+               udelay_simple(USEC_PER_SEC);
+       }
+}
+
 static void __dump_run(void *unused)
 {
        struct ccw_dev_id devid;
@@ -1432,12 +1442,10 @@ static void __dump_run(void *unused)
                __cpcmd(buf, NULL, 0, NULL);
                break;
        case DUMP_METHOD_CCW_DIAG:
-               diag308(DIAG308_SET, dump_block_ccw);
-               diag308(DIAG308_DUMP, NULL);
+               diag308_dump(dump_block_ccw);
                break;
        case DUMP_METHOD_FCP_DIAG:
-               diag308(DIAG308_SET, dump_block_fcp);
-               diag308(DIAG308_DUMP, NULL);
+               diag308_dump(dump_block_fcp);
                break;
        default:
                break;