|
@@ -723,11 +723,12 @@ int pmd_clear_huge(pmd_t *pmd)
|
|
/**
|
|
/**
|
|
* pud_free_pmd_page - Clear pud entry and free pmd page.
|
|
* pud_free_pmd_page - Clear pud entry and free pmd page.
|
|
* @pud: Pointer to a PUD.
|
|
* @pud: Pointer to a PUD.
|
|
|
|
+ * @addr: Virtual address associated with pud.
|
|
*
|
|
*
|
|
* Context: The pud range has been unmaped and TLB purged.
|
|
* Context: The pud range has been unmaped and TLB purged.
|
|
* Return: 1 if clearing the entry succeeded. 0 otherwise.
|
|
* Return: 1 if clearing the entry succeeded. 0 otherwise.
|
|
*/
|
|
*/
|
|
-int pud_free_pmd_page(pud_t *pud)
|
|
|
|
|
|
+int pud_free_pmd_page(pud_t *pud, unsigned long addr)
|
|
{
|
|
{
|
|
pmd_t *pmd;
|
|
pmd_t *pmd;
|
|
int i;
|
|
int i;
|
|
@@ -738,7 +739,7 @@ int pud_free_pmd_page(pud_t *pud)
|
|
pmd = (pmd_t *)pud_page_vaddr(*pud);
|
|
pmd = (pmd_t *)pud_page_vaddr(*pud);
|
|
|
|
|
|
for (i = 0; i < PTRS_PER_PMD; i++)
|
|
for (i = 0; i < PTRS_PER_PMD; i++)
|
|
- if (!pmd_free_pte_page(&pmd[i]))
|
|
|
|
|
|
+ if (!pmd_free_pte_page(&pmd[i], addr + (i * PMD_SIZE)))
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
pud_clear(pud);
|
|
pud_clear(pud);
|
|
@@ -750,11 +751,12 @@ int pud_free_pmd_page(pud_t *pud)
|
|
/**
|
|
/**
|
|
* pmd_free_pte_page - Clear pmd entry and free pte page.
|
|
* pmd_free_pte_page - Clear pmd entry and free pte page.
|
|
* @pmd: Pointer to a PMD.
|
|
* @pmd: Pointer to a PMD.
|
|
|
|
+ * @addr: Virtual address associated with pmd.
|
|
*
|
|
*
|
|
* Context: The pmd range has been unmaped and TLB purged.
|
|
* Context: The pmd range has been unmaped and TLB purged.
|
|
* Return: 1 if clearing the entry succeeded. 0 otherwise.
|
|
* Return: 1 if clearing the entry succeeded. 0 otherwise.
|
|
*/
|
|
*/
|
|
-int pmd_free_pte_page(pmd_t *pmd)
|
|
|
|
|
|
+int pmd_free_pte_page(pmd_t *pmd, unsigned long addr)
|
|
{
|
|
{
|
|
pte_t *pte;
|
|
pte_t *pte;
|
|
|
|
|
|
@@ -770,7 +772,7 @@ int pmd_free_pte_page(pmd_t *pmd)
|
|
|
|
|
|
#else /* !CONFIG_X86_64 */
|
|
#else /* !CONFIG_X86_64 */
|
|
|
|
|
|
-int pud_free_pmd_page(pud_t *pud)
|
|
|
|
|
|
+int pud_free_pmd_page(pud_t *pud, unsigned long addr)
|
|
{
|
|
{
|
|
return pud_none(*pud);
|
|
return pud_none(*pud);
|
|
}
|
|
}
|
|
@@ -779,7 +781,7 @@ int pud_free_pmd_page(pud_t *pud)
|
|
* Disable free page handling on x86-PAE. This assures that ioremap()
|
|
* Disable free page handling on x86-PAE. This assures that ioremap()
|
|
* does not update sync'd pmd entries. See vmalloc_sync_one().
|
|
* does not update sync'd pmd entries. See vmalloc_sync_one().
|
|
*/
|
|
*/
|
|
-int pmd_free_pte_page(pmd_t *pmd)
|
|
|
|
|
|
+int pmd_free_pte_page(pmd_t *pmd, unsigned long addr)
|
|
{
|
|
{
|
|
return pmd_none(*pmd);
|
|
return pmd_none(*pmd);
|
|
}
|
|
}
|