Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux

Pull s390 fixes from Martin Schwidefsky:
"Three kvm related memory management fixes, a fix for show_trace, a fix
for early console output and a patch from Ben to help prevent compile
errors in regard to irq functions (or our lack thereof)"

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux:
s390/pci: Implement IRQ functions if !PCI
s390/sclp: fix new line detection
s390/pgtable: make pgste lock an explicit barrier
s390/pgtable: Save pgste during modify_prot_start/commit
s390/dumpstack: fix address ranges for asynchronous and panic stack
s390/pgtable: Fix guest overindication for change bit

+95 -48
+22 -10
arch/s390/include/asm/pgtable.h
··· 623 623 " csg %0,%1,%2\n" 624 624 " jl 0b\n" 625 625 : "=&d" (old), "=&d" (new), "=Q" (ptep[PTRS_PER_PTE]) 626 - : "Q" (ptep[PTRS_PER_PTE]) : "cc"); 626 + : "Q" (ptep[PTRS_PER_PTE]) : "cc", "memory"); 627 627 #endif 628 628 return __pgste(new); 629 629 } ··· 635 635 " nihh %1,0xff7f\n" /* clear RCP_PCL_BIT */ 636 636 " stg %1,%0\n" 637 637 : "=Q" (ptep[PTRS_PER_PTE]) 638 - : "d" (pgste_val(pgste)), "Q" (ptep[PTRS_PER_PTE]) : "cc"); 638 + : "d" (pgste_val(pgste)), "Q" (ptep[PTRS_PER_PTE]) 639 + : "cc", "memory"); 639 640 preempt_enable(); 641 + #endif 642 + } 643 + 644 + static inline void pgste_set(pte_t *ptep, pgste_t pgste) 645 + { 646 + #ifdef CONFIG_PGSTE 647 + *(pgste_t *)(ptep + PTRS_PER_PTE) = pgste; 640 648 #endif 641 649 } 642 650 ··· 712 704 { 713 705 #ifdef CONFIG_PGSTE 714 706 unsigned long address; 715 - unsigned long okey, nkey; 707 + unsigned long nkey; 716 708 717 709 if (pte_val(entry) & _PAGE_INVALID) 718 710 return; 711 + VM_BUG_ON(!(pte_val(*ptep) & _PAGE_INVALID)); 719 712 address = pte_val(entry) & PAGE_MASK; 720 - okey = nkey = page_get_storage_key(address); 721 - nkey &= ~(_PAGE_ACC_BITS | _PAGE_FP_BIT); 722 - /* Set page access key and fetch protection bit from pgste */ 723 - nkey |= (pgste_val(pgste) & (RCP_ACC_BITS | RCP_FP_BIT)) >> 56; 724 - if (okey != nkey) 725 - page_set_storage_key(address, nkey, 0); 713 + /* 714 + * Set page access key and fetch protection bit from pgste. 715 + * The guest C/R information is still in the PGSTE, set real 716 + * key C/R to 0. 717 + */ 718 + nkey = (pgste_val(pgste) & (RCP_ACC_BITS | RCP_FP_BIT)) >> 56; 719 + page_set_storage_key(address, nkey, 0); 726 720 #endif 727 721 } 728 722 ··· 1109 1099 if (!mm_exclusive(mm)) 1110 1100 __ptep_ipte(address, ptep); 1111 1101 1112 - if (mm_has_pgste(mm)) 1102 + if (mm_has_pgste(mm)) { 1113 1103 pgste = pgste_update_all(&pte, pgste); 1104 + pgste_set(ptep, pgste); 1105 + } 1114 1106 return pte; 1115 1107 } 1116 1108
+8 -4
arch/s390/kernel/dumpstack.c
··· 74 74 75 75 static void show_trace(struct task_struct *task, unsigned long *stack) 76 76 { 77 + const unsigned long frame_size = 78 + STACK_FRAME_OVERHEAD + sizeof(struct pt_regs); 77 79 register unsigned long __r15 asm ("15"); 78 80 unsigned long sp; 79 81 ··· 84 82 sp = task ? task->thread.ksp : __r15; 85 83 printk("Call Trace:\n"); 86 84 #ifdef CONFIG_CHECK_STACK 87 - sp = __show_trace(sp, S390_lowcore.panic_stack - 4096, 88 - S390_lowcore.panic_stack); 85 + sp = __show_trace(sp, 86 + S390_lowcore.panic_stack + frame_size - 4096, 87 + S390_lowcore.panic_stack + frame_size); 89 88 #endif 90 - sp = __show_trace(sp, S390_lowcore.async_stack - ASYNC_SIZE, 91 - S390_lowcore.async_stack); 89 + sp = __show_trace(sp, 90 + S390_lowcore.async_stack + frame_size - ASYNC_SIZE, 91 + S390_lowcore.async_stack + frame_size); 92 92 if (task) 93 93 __show_trace(sp, (unsigned long) task_stack_page(task), 94 94 (unsigned long) task_stack_page(task) + THREAD_SIZE);
+64
arch/s390/kernel/irq.c
··· 311 311 spin_unlock(&ma_subclass_lock); 312 312 } 313 313 EXPORT_SYMBOL(measurement_alert_subclass_unregister); 314 + 315 + void synchronize_irq(unsigned int irq) 316 + { 317 + /* 318 + * Not needed, the handler is protected by a lock and IRQs that occur 319 + * after the handler is deleted are just NOPs. 320 + */ 321 + } 322 + EXPORT_SYMBOL_GPL(synchronize_irq); 323 + 324 + #ifndef CONFIG_PCI 325 + 326 + /* Only PCI devices have dynamically-defined IRQ handlers */ 327 + 328 + int request_irq(unsigned int irq, irq_handler_t handler, 329 + unsigned long irqflags, const char *devname, void *dev_id) 330 + { 331 + return -EINVAL; 332 + } 333 + EXPORT_SYMBOL_GPL(request_irq); 334 + 335 + void free_irq(unsigned int irq, void *dev_id) 336 + { 337 + WARN_ON(1); 338 + } 339 + EXPORT_SYMBOL_GPL(free_irq); 340 + 341 + void enable_irq(unsigned int irq) 342 + { 343 + WARN_ON(1); 344 + } 345 + EXPORT_SYMBOL_GPL(enable_irq); 346 + 347 + void disable_irq(unsigned int irq) 348 + { 349 + WARN_ON(1); 350 + } 351 + EXPORT_SYMBOL_GPL(disable_irq); 352 + 353 + #endif /* !CONFIG_PCI */ 354 + 355 + void disable_irq_nosync(unsigned int irq) 356 + { 357 + disable_irq(irq); 358 + } 359 + EXPORT_SYMBOL_GPL(disable_irq_nosync); 360 + 361 + unsigned long probe_irq_on(void) 362 + { 363 + return 0; 364 + } 365 + EXPORT_SYMBOL_GPL(probe_irq_on); 366 + 367 + int probe_irq_off(unsigned long val) 368 + { 369 + return 0; 370 + } 371 + EXPORT_SYMBOL_GPL(probe_irq_off); 372 + 373 + unsigned int probe_irq_mask(unsigned long val) 374 + { 375 + return val; 376 + } 377 + EXPORT_SYMBOL_GPL(probe_irq_mask);
+1 -1
arch/s390/kernel/sclp.S
··· 225 225 ahi %r2,1 226 226 ltr %r0,%r0 # end of string? 227 227 jz .LfinalizemtoS4 228 - chi %r0,0x15 # end of line (NL)? 228 + chi %r0,0x0a # end of line (NL)? 229 229 jz .LfinalizemtoS4 230 230 stc %r0,0(%r6,%r7) # copy to mto 231 231 la %r11,0(%r6,%r7)
-33
arch/s390/pci/pci.c
··· 302 302 return rc; 303 303 } 304 304 305 - void synchronize_irq(unsigned int irq) 306 - { 307 - /* 308 - * Not needed, the handler is protected by a lock and IRQs that occur 309 - * after the handler is deleted are just NOPs. 310 - */ 311 - } 312 - EXPORT_SYMBOL_GPL(synchronize_irq); 313 - 314 305 void enable_irq(unsigned int irq) 315 306 { 316 307 struct msi_desc *msi = irq_get_msi_desc(irq); ··· 317 326 zpci_msi_set_mask_bits(msi, 1, 1); 318 327 } 319 328 EXPORT_SYMBOL_GPL(disable_irq); 320 - 321 - void disable_irq_nosync(unsigned int irq) 322 - { 323 - disable_irq(irq); 324 - } 325 - EXPORT_SYMBOL_GPL(disable_irq_nosync); 326 - 327 - unsigned long probe_irq_on(void) 328 - { 329 - return 0; 330 - } 331 - EXPORT_SYMBOL_GPL(probe_irq_on); 332 - 333 - int probe_irq_off(unsigned long val) 334 - { 335 - return 0; 336 - } 337 - EXPORT_SYMBOL_GPL(probe_irq_off); 338 - 339 - unsigned int probe_irq_mask(unsigned long val) 340 - { 341 - return val; 342 - } 343 - EXPORT_SYMBOL_GPL(probe_irq_mask); 344 329 345 330 void pcibios_fixup_bus(struct pci_bus *bus) 346 331 {