#include <ccan/likely/likely.h>
#include <ccan/alignof/alignof.h>
#include <ccan/short_types/short_types.h>
+#include <ccan/compiler/compiler.h>
#include "config.h"
/*
static unsigned int small_page_bits(unsigned long poolsize)
{
- return fls(poolsize / MAX_SMALL_PAGES / 2);
+ return fls(poolsize / MAX_SMALL_PAGES - 1);
}
static struct page_header *from_pgnum(struct header *head,
/* Add the rest of the pages as large pages. */
i = SMALL_PAGES_PER_LARGE_PAGE;
while ((i << sp_bits) + (1 << lp_bits) <= poolsize) {
+ assert(i < MAX_SMALL_PAGES);
ph = from_pgnum(head, i, sp_bits);
ph->elements_used = 0;
add_large_page_to_freelist(head, ph, sp_bits);
for (i = 1; i < SMALL_PAGES_PER_LARGE_PAGE; i++) {
struct page_header *ph = from_pgnum(head, lpage + i, sp_bits);
+ /* Initialize this: huge_alloc reads it. */
+ ph->elements_used = 0;
add_small_page_to_freelist(head, ph, sp_bits);
}
return ret;
}
-void where_is_page(struct header *head, struct page_header *where,
- unsigned int sp_bits)
-{
- struct page_header *pg;
- unsigned long off, bucket,
- num_buckets = max_bucket(sp_bits + BITS_FROM_SMALL_TO_LARGE_PAGE);
-
- for (off = head->small_free_list; off; off = pg->next) {
- pg = from_pgnum(head, off, sp_bits);
- if (pg == where) {
- printf("It's in the small free list\n");
- return;
- }
- }
-
- for (off = head->large_free_list; off; off = pg->next) {
- pg = from_pgnum(head, off, sp_bits);
- if (pg == where) {
- printf("It's in the large free list\n");
- return;
- }
- }
-
- for (bucket = 0; bucket < num_buckets; bucket++) {
- for (off = head->bs[bucket].page_list; off; off = pg->next) {
- pg = from_pgnum(head, off, sp_bits);
- if (pg == where) {
- printf("It's in %lu bucket page list\n", bucket);
- return;
- }
- }
-
- for (off = head->bs[bucket].full_list; off; off = pg->next) {
- pg = from_pgnum(head, off, sp_bits);
- if (pg == where) {
- printf("It's in %lu bucket full list\n", bucket);
- return;
- }
- }
- }
- printf("It's nowhere!\n");
-}
-
static bool huge_allocated(struct header *head, unsigned long offset)
{
unsigned long i;
}
/* They want something really big. Aim for contiguous pages (slow). */
-static void *unlikely_func huge_alloc(void *pool, unsigned long poolsize,
- unsigned long size, unsigned long align)
+static COLD_ATTRIBUTE
+void *huge_alloc(void *pool, unsigned long poolsize,
+ unsigned long size, unsigned long align)
{
struct header *head = pool;
struct huge_alloc *ha;
return (char *)pool + ha->off;
}
-static void unlikely_func huge_free(struct header *head,
- unsigned long poolsize, void *free)
+static COLD_ATTRIBUTE void
+huge_free(struct header *head, unsigned long poolsize, void *free)
{
unsigned long i, off, pgnum, free_off = (char *)free - (char *)head;
unsigned int sp_bits, lp_bits;
alloc_free(head, poolsize, ha);
}
-static unsigned long unlikely_func huge_size(struct header *head, void *p)
+static COLD_ATTRIBUTE unsigned long
+huge_size(struct header *head, void *p)
{
unsigned long i, off = (char *)p - (char *)head;
struct huge_alloc *ha;