}
/**
- * pcpu_addr_in_first_chunk - address check for first chunk's dynamic region
- * @addr: percpu address of interest
- *
- * The first chunk is considered to be the dynamic region of the first chunk.
- * While the true first chunk is composed of the static, dynamic, and
- * reserved regions, it is the chunk that serves the dynamic region that is
- * circulated in the chunk slots.
- *
- * The reserved chunk has a separate check and the static region addresses
- * should never be passed into the percpu allocator.
- *
- * RETURNS:
- * True if the address is in the dynamic region of the first chunk.
- */
-static bool pcpu_addr_in_first_chunk(void *addr)
-{
- void *start_addr = pcpu_first_chunk->base_addr +
- pcpu_first_chunk->start_offset;
- void *end_addr = pcpu_first_chunk->base_addr +
- pcpu_first_chunk->nr_pages * PAGE_SIZE -
- pcpu_first_chunk->end_offset;
-
- return addr >= start_addr && addr < end_addr;
-}
-
-/**
- * pcpu_addr_in_reserved_chunk - address check for reserved region
- *
- * The reserved region is a part of the first chunk and primarily serves
- * static percpu variables from kernel modules.
+ * pcpu_addr_in_chunk - check if the address is served from this chunk
+ * @chunk: chunk of interest
+ * @addr: percpu address
*
* RETURNS:
- * True if the address is in the reserved region.
+ * True if the address is served from this chunk.
*/
-static bool pcpu_addr_in_reserved_chunk(void *addr)
+static bool pcpu_addr_in_chunk(struct pcpu_chunk *chunk, void *addr)
{
void *start_addr, *end_addr;
- if (!pcpu_reserved_chunk)
+ if (!chunk)
return false;
- start_addr = pcpu_reserved_chunk->base_addr +
- pcpu_reserved_chunk->start_offset;
- end_addr = pcpu_reserved_chunk->base_addr +
- pcpu_reserved_chunk->nr_pages * PAGE_SIZE -
- pcpu_reserved_chunk->end_offset;
+ start_addr = chunk->base_addr + chunk->start_offset;
+ end_addr = chunk->base_addr + chunk->nr_pages * PAGE_SIZE -
+ chunk->end_offset;
return addr >= start_addr && addr < end_addr;
}
static struct pcpu_chunk *pcpu_chunk_addr_search(void *addr)
{
/* is it in the dynamic region (first chunk)? */
- if (pcpu_addr_in_first_chunk(addr))
+ if (pcpu_addr_in_chunk(pcpu_first_chunk, addr))
return pcpu_first_chunk;
/* is it in the reserved region? */
- if (pcpu_addr_in_reserved_chunk(addr))
+ if (pcpu_addr_in_chunk(pcpu_reserved_chunk, addr))
return pcpu_reserved_chunk;
/*