|
@@ -197,7 +197,12 @@ static unsigned long pcpu_chunk_addr(struct pcpu_chunk *chunk,
|
|
static bool pcpu_chunk_page_occupied(struct pcpu_chunk *chunk,
|
|
static bool pcpu_chunk_page_occupied(struct pcpu_chunk *chunk,
|
|
int page_idx)
|
|
int page_idx)
|
|
{
|
|
{
|
|
- return *pcpu_chunk_pagep(chunk, 0, page_idx) != NULL;
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Any possible cpu id can be used here, so there's no need to
|
|
|
|
+ * worry about preemption or cpu hotplug.
|
|
|
|
+ */
|
|
|
|
+ return *pcpu_chunk_pagep(chunk, raw_smp_processor_id(),
|
|
|
|
+ page_idx) != NULL;
|
|
}
|
|
}
|
|
|
|
|
|
/* set the pointer to a chunk in a page struct */
|
|
/* set the pointer to a chunk in a page struct */
|
|
@@ -297,6 +302,14 @@ static struct pcpu_chunk *pcpu_chunk_addr_search(void *addr)
|
|
return pcpu_first_chunk;
|
|
return pcpu_first_chunk;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * The address is relative to unit0 which might be unused and
|
|
|
|
+ * thus unmapped. Offset the address to the unit space of the
|
|
|
|
+ * current processor before looking it up in the vmalloc
|
|
|
|
+ * space. Note that any possible cpu id can be used here, so
|
|
|
|
+ * there's no need to worry about preemption or cpu hotplug.
|
|
|
|
+ */
|
|
|
|
+ addr += raw_smp_processor_id() * pcpu_unit_size;
|
|
return pcpu_get_page_chunk(vmalloc_to_page(addr));
|
|
return pcpu_get_page_chunk(vmalloc_to_page(addr));
|
|
}
|
|
}
|
|
|
|
|