[PATCH v3 5/7] cache: allocate buffers in one big chunk
Petr Tesarik
ptesarik at suse.cz
Fri Mar 6 05:07:11 PST 2015
This allows callers to change the buffer pointer, because it can be
reinitialized to the default value in cache_alloc() before returning
the cache entry.
Signed-off-by: Petr Tesarik <ptesarik at suse.cz>
---
cache.c | 26 +++++++++++++++-----------
1 file changed, 15 insertions(+), 11 deletions(-)
diff --git a/cache.c b/cache.c
index 344b4f6..ccd67ca 100644
--- a/cache.c
+++ b/cache.c
@@ -32,23 +32,23 @@ static int avail = CACHE_SIZE;
static struct cache used, pending;
+static void *cachebuf;
+
int
cache_init(void)
{
- void *bufptr;
int i;
- for (i = 0; i < CACHE_SIZE; ++i) {
- bufptr = malloc(info->page_size);
- if (bufptr == NULL) {
- ERRMSG("Can't allocate memory for cache. %s\n",
- strerror(errno));
- return FALSE;
- }
- entries[i].bufptr = bufptr;
- pool[i] = &entries[i];
+ cachebuf = malloc(info->page_size * CACHE_SIZE);
+ if (cachebuf == NULL) {
+ ERRMSG("Can't allocate memory for cache. %s\n",
+ strerror(errno));
+ return FALSE;
}
+ for (i = 0; i < CACHE_SIZE; ++i)
+ pool[i] = &entries[i];
+
return TRUE;
}
@@ -98,6 +98,7 @@ struct cache_entry *
cache_alloc(unsigned long long paddr)
{
struct cache_entry *entry = NULL;
+ int idx;
if (avail) {
entry = pool[--avail];
@@ -107,8 +108,11 @@ cache_alloc(unsigned long long paddr)
} else
return NULL;
- add_entry(&pending, entry);
+ idx = entry - entries;
entry->paddr = paddr;
+ entry->bufptr = cachebuf + idx * info->page_size;
+ add_entry(&pending, entry);
+
return entry;
}
--
1.8.4.5
More information about the kexec
mailing list