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://git390.marist.edu/pub/scm/linux-2.6

* 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6:
[S390] mm: fix mmu_gather rework
[S390] mm: fix storage key handling

+25 -16
+8 -8
arch/s390/include/asm/pgtable.h
··· 577 577 static inline pgste_t pgste_update_all(pte_t *ptep, pgste_t pgste) 578 578 { 579 579 #ifdef CONFIG_PGSTE 580 - unsigned long pfn, bits; 580 + unsigned long address, bits; 581 581 unsigned char skey; 582 582 583 - pfn = pte_val(*ptep) >> PAGE_SHIFT; 584 - skey = page_get_storage_key(pfn); 583 + address = pte_val(*ptep) & PAGE_MASK; 584 + skey = page_get_storage_key(address); 585 585 bits = skey & (_PAGE_CHANGED | _PAGE_REFERENCED); 586 586 /* Clear page changed & referenced bit in the storage key */ 587 587 if (bits) { 588 588 skey ^= bits; 589 - page_set_storage_key(pfn, skey, 1); 589 + page_set_storage_key(address, skey, 1); 590 590 } 591 591 /* Transfer page changed & referenced bit to guest bits in pgste */ 592 592 pgste_val(pgste) |= bits << 48; /* RCP_GR_BIT & RCP_GC_BIT */ ··· 628 628 static inline void pgste_set_pte(pte_t *ptep, pgste_t pgste) 629 629 { 630 630 #ifdef CONFIG_PGSTE 631 - unsigned long pfn; 631 + unsigned long address; 632 632 unsigned long okey, nkey; 633 633 634 - pfn = pte_val(*ptep) >> PAGE_SHIFT; 635 - okey = nkey = page_get_storage_key(pfn); 634 + address = pte_val(*ptep) & PAGE_MASK; 635 + okey = nkey = page_get_storage_key(address); 636 636 nkey &= ~(_PAGE_ACC_BITS | _PAGE_FP_BIT); 637 637 /* Set page access key and fetch protection bit from pgste */ 638 638 nkey |= (pgste_val(pgste) & (RCP_ACC_BITS | RCP_FP_BIT)) >> 56; 639 639 if (okey != nkey) 640 - page_set_storage_key(pfn, nkey, 1); 640 + page_set_storage_key(address, nkey, 1); 641 641 #endif 642 642 } 643 643
+16 -7
arch/s390/mm/pgtable.c
··· 71 71 72 72 void rcu_table_freelist_finish(void) 73 73 { 74 - struct rcu_table_freelist *batch = __get_cpu_var(rcu_table_freelist); 74 + struct rcu_table_freelist **batchp = &get_cpu_var(rcu_table_freelist); 75 + struct rcu_table_freelist *batch = *batchp; 75 76 76 77 if (!batch) 77 - return; 78 + goto out; 78 79 call_rcu(&batch->rcu, rcu_table_freelist_callback); 79 - __get_cpu_var(rcu_table_freelist) = NULL; 80 + *batchp = NULL; 81 + out: 82 + put_cpu_var(rcu_table_freelist); 80 83 } 81 84 82 85 static void smp_sync(void *arg) ··· 144 141 { 145 142 struct rcu_table_freelist *batch; 146 143 144 + preempt_disable(); 147 145 if (atomic_read(&mm->mm_users) < 2 && 148 146 cpumask_equal(mm_cpumask(mm), cpumask_of(smp_processor_id()))) { 149 147 crst_table_free(mm, table); 150 - return; 148 + goto out; 151 149 } 152 150 batch = rcu_table_freelist_get(mm); 153 151 if (!batch) { 154 152 smp_call_function(smp_sync, NULL, 1); 155 153 crst_table_free(mm, table); 156 - return; 154 + goto out; 157 155 } 158 156 batch->table[--batch->crst_index] = table; 159 157 if (batch->pgt_index >= batch->crst_index) 160 158 rcu_table_freelist_finish(); 159 + out: 160 + preempt_enable(); 161 161 } 162 162 163 163 #ifdef CONFIG_64BIT ··· 329 323 struct page *page; 330 324 unsigned long bits; 331 325 326 + preempt_disable(); 332 327 if (atomic_read(&mm->mm_users) < 2 && 333 328 cpumask_equal(mm_cpumask(mm), cpumask_of(smp_processor_id()))) { 334 329 page_table_free(mm, table); 335 - return; 330 + goto out; 336 331 } 337 332 batch = rcu_table_freelist_get(mm); 338 333 if (!batch) { 339 334 smp_call_function(smp_sync, NULL, 1); 340 335 page_table_free(mm, table); 341 - return; 336 + goto out; 342 337 } 343 338 bits = (mm->context.has_pgste) ? 3UL : 1UL; 344 339 bits <<= (__pa(table) & (PAGE_SIZE - 1)) / 256 / sizeof(unsigned long); ··· 352 345 batch->table[batch->pgt_index++] = table; 353 346 if (batch->pgt_index >= batch->crst_index) 354 347 rcu_table_freelist_finish(); 348 + out: 349 + preempt_enable(); 355 350 } 356 351 357 352 /*
+1 -1
include/linux/page-flags.h
··· 308 308 { 309 309 #ifdef CONFIG_S390 310 310 if (!test_and_set_bit(PG_uptodate, &page->flags)) 311 - page_set_storage_key(page_to_pfn(page), PAGE_DEFAULT_KEY, 0); 311 + page_set_storage_key(page_to_phys(page), PAGE_DEFAULT_KEY, 0); 312 312 #else 313 313 /* 314 314 * Memory barrier must be issued before setting the PG_uptodate bit,