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 <[email protected]>
---
 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


_______________________________________________
kexec mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/kexec

Reply via email to