Merge branch 'for-linus' of git://git390.osdl.marist.edu/pub/scm/linux-2.6

* 'for-linus' of git://git390.osdl.marist.edu/pub/scm/linux-2.6:
[S390] qdio: prevent stack clobber
[S390] nohz: Fix __udelay.

+78 -71
+2
arch/s390/kernel/time.c
··· 169 169 170 170 static void clock_comparator_interrupt(__u16 code) 171 171 { 172 + if (S390_lowcore.clock_comparator == -1ULL) 173 + set_clock_comparator(S390_lowcore.clock_comparator); 172 174 } 173 175 174 176 static void etr_timing_alert(struct etr_irq_parm *);
+56 -36
arch/s390/lib/delay.c
··· 1 1 /* 2 - * arch/s390/lib/delay.c 3 2 * Precise Delay Loops for S390 4 3 * 5 - * S390 version 6 - * Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation 7 - * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com), 8 - * 9 - * Derived from "arch/i386/lib/delay.c" 10 - * Copyright (C) 1993 Linus Torvalds 11 - * Copyright (C) 1997 Martin Mares <mj@atrey.karlin.mff.cuni.cz> 4 + * Copyright IBM Corp. 1999,2008 5 + * Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com>, 6 + * Heiko Carstens <heiko.carstens@de.ibm.com>, 12 7 */ 13 8 14 9 #include <linux/sched.h> ··· 24 29 asm volatile("0: brct %0,0b" : : "d" ((loops/2) + 1)); 25 30 } 26 31 27 - /* 28 - * Waits for 'usecs' microseconds using the TOD clock comparator. 29 - */ 30 - void __udelay(unsigned long usecs) 32 + static void __udelay_disabled(unsigned long usecs) 31 33 { 32 - u64 end, time, old_cc = 0; 33 - unsigned long flags, cr0, mask, dummy; 34 - int irq_context; 34 + unsigned long mask, cr0, cr0_saved; 35 + u64 clock_saved; 35 36 36 - irq_context = in_interrupt(); 37 - if (!irq_context) 38 - local_bh_disable(); 39 - local_irq_save(flags); 40 - if (raw_irqs_disabled_flags(flags)) { 41 - old_cc = local_tick_disable(); 42 - S390_lowcore.clock_comparator = -1ULL; 43 - __ctl_store(cr0, 0, 0); 44 - dummy = (cr0 & 0xffff00e0) | 0x00000800; 45 - __ctl_load(dummy , 0, 0); 46 - mask = psw_kernel_bits | PSW_MASK_WAIT | PSW_MASK_EXT; 47 - } else 48 - mask = psw_kernel_bits | PSW_MASK_WAIT | 49 - PSW_MASK_EXT | PSW_MASK_IO; 37 + clock_saved = local_tick_disable(); 38 + set_clock_comparator(get_clock() + ((u64) usecs << 12)); 39 + __ctl_store(cr0_saved, 0, 0); 40 + cr0 = (cr0_saved & 0xffff00e0) | 0x00000800; 41 + __ctl_load(cr0 , 0, 0); 42 + mask = psw_kernel_bits | PSW_MASK_WAIT | PSW_MASK_EXT; 43 + trace_hardirqs_on(); 44 + __load_psw_mask(mask); 45 + local_irq_disable(); 46 + __ctl_load(cr0_saved, 0, 0); 47 + local_tick_enable(clock_saved); 48 + set_clock_comparator(S390_lowcore.clock_comparator); 49 + } 50 50 51 + static void __udelay_enabled(unsigned long usecs) 52 + { 53 + unsigned long mask; 54 + u64 end, time; 55 + 56 + mask = psw_kernel_bits | PSW_MASK_WAIT | PSW_MASK_EXT | PSW_MASK_IO; 51 57 end = get_clock() + ((u64) usecs << 12); 52 58 do { 53 59 time = end < S390_lowcore.clock_comparator ? ··· 58 62 __load_psw_mask(mask); 59 63 local_irq_disable(); 60 64 } while (get_clock() < end); 61 - 62 - if (raw_irqs_disabled_flags(flags)) { 63 - __ctl_load(cr0, 0, 0); 64 - local_tick_enable(old_cc); 65 - } 66 - if (!irq_context) 67 - _local_bh_enable(); 68 65 set_clock_comparator(S390_lowcore.clock_comparator); 66 + } 67 + 68 + /* 69 + * Waits for 'usecs' microseconds using the TOD clock comparator. 70 + */ 71 + void __udelay(unsigned long usecs) 72 + { 73 + unsigned long flags; 74 + 75 + preempt_disable(); 76 + local_irq_save(flags); 77 + if (in_irq()) { 78 + __udelay_disabled(usecs); 79 + goto out; 80 + } 81 + if (in_softirq()) { 82 + if (raw_irqs_disabled_flags(flags)) 83 + __udelay_disabled(usecs); 84 + else 85 + __udelay_enabled(usecs); 86 + goto out; 87 + } 88 + if (raw_irqs_disabled_flags(flags)) { 89 + local_bh_disable(); 90 + __udelay_disabled(usecs); 91 + _local_bh_enable(); 92 + goto out; 93 + } 94 + __udelay_enabled(usecs); 95 + out: 69 96 local_irq_restore(flags); 97 + preempt_enable(); 70 98 }
+20 -35
drivers/s390/cio/qdio_setup.c
··· 447 447 { 448 448 char s[80]; 449 449 450 - sprintf(s, "%s sc:%x ", cdev->dev.bus_id, irq_ptr->schid.sch_no); 451 - 450 + sprintf(s, "qdio: %s ", dev_name(&cdev->dev)); 452 451 switch (irq_ptr->qib.qfmt) { 453 452 case QDIO_QETH_QFMT: 454 - sprintf(s + strlen(s), "OSADE "); 453 + sprintf(s + strlen(s), "OSA "); 455 454 break; 456 455 case QDIO_ZFCP_QFMT: 457 456 sprintf(s + strlen(s), "ZFCP "); 458 457 break; 459 458 case QDIO_IQDIO_QFMT: 460 - sprintf(s + strlen(s), "HiperSockets "); 459 + sprintf(s + strlen(s), "HS "); 461 460 break; 462 461 } 463 - sprintf(s + strlen(s), "using: "); 464 - 465 - if (!is_thinint_irq(irq_ptr)) 466 - sprintf(s + strlen(s), "no"); 467 - sprintf(s + strlen(s), "AdapterInterrupts "); 468 - if (!(irq_ptr->sch_token != 0)) 469 - sprintf(s + strlen(s), "no"); 470 - sprintf(s + strlen(s), "QEBSM "); 471 - if (!(irq_ptr->qib.ac & QIB_AC_OUTBOUND_PCI_SUPPORTED)) 472 - sprintf(s + strlen(s), "no"); 473 - sprintf(s + strlen(s), "OutboundPCI "); 474 - if (!css_general_characteristics.aif_tdd) 475 - sprintf(s + strlen(s), "no"); 476 - sprintf(s + strlen(s), "TDD\n"); 477 - printk(KERN_INFO "qdio: %s", s); 478 - 479 - memset(s, 0, sizeof(s)); 480 - sprintf(s, "%s SIGA required: ", cdev->dev.bus_id); 481 - if (irq_ptr->siga_flag.input) 482 - sprintf(s + strlen(s), "Read "); 483 - if (irq_ptr->siga_flag.output) 484 - sprintf(s + strlen(s), "Write "); 485 - if (irq_ptr->siga_flag.sync) 486 - sprintf(s + strlen(s), "Sync "); 487 - if (!irq_ptr->siga_flag.no_sync_ti) 488 - sprintf(s + strlen(s), "SyncAI "); 489 - if (!irq_ptr->siga_flag.no_sync_out_ti) 490 - sprintf(s + strlen(s), "SyncOutAI "); 491 - if (!irq_ptr->siga_flag.no_sync_out_pci) 492 - sprintf(s + strlen(s), "SyncOutPCI"); 462 + sprintf(s + strlen(s), "on SC %x using ", irq_ptr->schid.sch_no); 463 + sprintf(s + strlen(s), "AI:%d ", is_thinint_irq(irq_ptr)); 464 + sprintf(s + strlen(s), "QEBSM:%d ", (irq_ptr->sch_token) ? 1 : 0); 465 + sprintf(s + strlen(s), "PCI:%d ", 466 + (irq_ptr->qib.ac & QIB_AC_OUTBOUND_PCI_SUPPORTED) ? 1 : 0); 467 + sprintf(s + strlen(s), "TDD:%d ", css_general_characteristics.aif_tdd); 468 + sprintf(s + strlen(s), "SIGA:"); 469 + sprintf(s + strlen(s), "%s", (irq_ptr->siga_flag.input) ? "R" : " "); 470 + sprintf(s + strlen(s), "%s", (irq_ptr->siga_flag.output) ? "W" : " "); 471 + sprintf(s + strlen(s), "%s", (irq_ptr->siga_flag.sync) ? "S" : " "); 472 + sprintf(s + strlen(s), "%s", 473 + (!irq_ptr->siga_flag.no_sync_ti) ? "A" : " "); 474 + sprintf(s + strlen(s), "%s", 475 + (!irq_ptr->siga_flag.no_sync_out_ti) ? "O" : " "); 476 + sprintf(s + strlen(s), "%s", 477 + (!irq_ptr->siga_flag.no_sync_out_pci) ? "P" : " "); 493 478 sprintf(s + strlen(s), "\n"); 494 - printk(KERN_INFO "qdio: %s", s); 479 + printk(KERN_INFO "%s", s); 495 480 } 496 481 497 482 int __init qdio_setup_init(void)