[PATCH V2 18/68] powerpc/mm: Move hash and no hash code to separate files

Aneesh Kumar K.V aneesh.kumar at linux.vnet.ibm.com
Sun Apr 17 20:20:10 AEST 2016


Balbir Singh <bsingharora at gmail.com> writes:
>> +
.......

>> +/*
>> + * map_kernel_page currently only called by __ioremap
>> + * map_kernel_page adds an entry to the ioremap page table
>> + * and adds an entry to the HPT, possibly bolting it
>> + */
>> +int map_kernel_page(unsigned long ea, unsigned long pa, unsigned long flags)
>> +{
>> +	pgd_t *pgdp;
>> +	pud_t *pudp;
>> +	pmd_t *pmdp;
>> +	pte_t *ptep;
>> +
>> +	if (slab_is_available()) {
>> +		pgdp = pgd_offset_k(ea);
>> +		pudp = pud_alloc(&init_mm, pgdp, ea);
>> +		if (!pudp)
>> +			return -ENOMEM;
>> +		pmdp = pmd_alloc(&init_mm, pudp, ea);
>> +		if (!pmdp)
>> +			return -ENOMEM;
>> +		ptep = pte_alloc_kernel(pmdp, ea);
>> +		if (!ptep)
>> +			return -ENOMEM;
>> +		set_pte_at(&init_mm, ea, ptep, pfn_pte(pa >> PAGE_SHIFT,
>> +							  __pgprot(flags)));
>> +	} else {
>> +		/*
>> +		 * If the mm subsystem is not fully up, we cannot create a
>> +		 * linux page table entry for this mapping.  Simply bolt an
>> +		 * entry in the hardware page table.
>> +		 *
>> +		 */
>> +		if (htab_bolt_mapping(ea, ea + PAGE_SIZE, pa, flags,
>> +				      mmu_io_psize, mmu_kernel_ssize)) {
>> +			printk(KERN_ERR "Failed to do bolted mapping IO "
>> +			       "memory at %016lx !\n", pa);
>> +			return -ENOMEM;
>
> What happens when we do unmap this? I know this code has been around for a while
> so its not new

you mean iounmap ? it do call vunmap, which look for a linux page table
entry. If it is a bolt_mapping entry as above, we will not have a linux
page table entry and that unmap will not relaly remove the mapping. 

>
>> +		}
>> +	}
>> +
>> +	smp_wmb();
>> +	return 0;
>> +}

-aneesh



More information about the Linuxppc-dev mailing list