Messages in this thread | | | Date | Fri, 15 May 2009 08:58:30 +0100 | From | "Jan Beulich" <> | Subject | Re: [PATCH 3/5] x86: fix pageattr handling for remap percpu allocator |
| |
>>> Tejun Heo <tj@kernel.org> 15.05.09 06:28 >>> >@@ -742,6 +744,27 @@ static int cpa_process_alias(struct cpa_data *cpa) > } > #endif > >+ /* >+ * If the PMD page was partially used for per-cpu remapping, >+ * the remapped area needs to be split and modified. Note >+ * that the partial recycling only happens at the tail of a >+ * partially used PMD page, so touching single PMD page is >+ * always enough. >+ */ >+ remapped = pcpu_pmd_remapped((void *)vaddr);
vaddr here is the passed-in address, but in order for the lookup to be positive it needs to be the canonical address (i.e. the one pointing into the 1:1 mapping), i.e. __va(cpa->pfn << PAGE_SHIFT), just like temp_cpa_vaddr gets calculated earlier in the same function.
>+ if (remapped) { >+ int max_pages = PFN_DOWN(PMD_SIZE - (vaddr & ~PMD_MASK)); >+ >+ alias_cpa = *cpa; >+ temp_cpa_vaddr = (unsigned long)remapped; >+ alias_cpa.vaddr = &temp_cpa_vaddr; >+ alias_cpa.numpages = min(alias_cpa.numpages, max_pages); >+ alias_cpa.flags &= ~(CPA_PAGES_ARRAY | CPA_ARRAY); >+ ret = __change_page_attr_set_clr(&alias_cpa, 0); >+ if (ret) >+ return ret; >+ } >+ > return 0; > }
Sorry for not having spotted this yesterday, Jan
| |