441
442
443
444
445 new_pte = pfn_pte(pte_pfn(old_pte), canon_pgprot(new_prot));
446 __set_pmd_pte(kpte, address, new_pte);
447 cpa->flags |= CPA_FLUSHTLB;
448 do_split = 0;
449 }
450
451out_unlock:
452 spin_unlock_irqrestore(&pgd_lock, flags);
453
454 return do_split;
455}
456
457static int split_large_page(pte_t *kpte, unsigned long address)
458{
459 unsigned long flags, pfn, pfninc = 1;
460 unsigned int i, level;
461 pte_t *pbase, *tmp;
462 pgprot_t ref_prot;
463 struct page *base;
464
465 if (!debug_pagealloc)
466 spin_unlock(&cpa_lock);
467 base = alloc_pages(GFP_KERNEL, 0);
468 if (!debug_pagealloc)
469 spin_lock(&cpa_lock);
470 if (!base)
471 return -ENOMEM;
472
473 spin_lock_irqsave(&pgd_lock, flags);
474
475
476
477
478 tmp = lookup_address(address, &level);
479 if (tmp != kpte)
480 goto out_unlock;
481