dm: clean up mem.c

- use strncmp() instead of comparing string pointers to make no
  assumptions about the toolchain's literal pool
- re-shuffle the functions so they're consistent with mem.h
- make non-public functions static
- increase code re-use

Tracked-On: #2792
Signed-off-by: Peter Fang <peter.fang@intel.com>
Reviewed-by: Eddie Dong <eddie.dong@intel.com>
Acked-by: Yin Fengwei <fengwei.yin@intel.com>
This commit is contained in:
Peter Fang 2019-03-15 17:19:54 -07:00 committed by wenlingz
parent 890d40226b
commit 82e42cfa2a
3 changed files with 57 additions and 69 deletions

View File

@ -37,12 +37,15 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <assert.h> #include <assert.h>
#include <string.h>
#include <pthread.h> #include <pthread.h>
#include "vmm.h" #include "vmm.h"
#include "mem.h" #include "mem.h"
#include "tree.h" #include "tree.h"
#define MEMNAMESZ (80)
struct mmio_rb_range { struct mmio_rb_range {
RB_ENTRY(mmio_rb_range) mr_link; /* RB tree links */ RB_ENTRY(mmio_rb_range) mr_link; /* RB tree links */
struct mem_range mr_param; struct mem_range mr_param;
@ -51,10 +54,8 @@ struct mmio_rb_range {
bool enabled; bool enabled;
}; };
struct mmio_rb_tree; static RB_HEAD(mmio_rb_tree, mmio_rb_range) mmio_rb_root, mmio_rb_fallback;
RB_PROTOTYPE(mmio_rb_tree, mmio_rb_range, mr_link, mmio_rb_range_compare); RB_PROTOTYPE_STATIC(mmio_rb_tree, mmio_rb_range, mr_link, mmio_rb_range_compare);
RB_HEAD(mmio_rb_tree, mmio_rb_range) mmio_rb_root, mmio_rb_fallback;
/* /*
* Per-VM cache. Since most accesses from a vCPU will be to * Per-VM cache. Since most accesses from a vCPU will be to
@ -128,7 +129,7 @@ mmio_rb_dump(struct mmio_rb_tree *rbt)
} }
#endif #endif
RB_GENERATE(mmio_rb_tree, mmio_rb_range, mr_link, mmio_rb_range_compare); RB_GENERATE_STATIC(mmio_rb_tree, mmio_rb_range, mr_link, mmio_rb_range_compare);
static int static int
mem_read(void *ctx, int vcpu, uint64_t gpa, uint64_t *rval, int size, void *arg) mem_read(void *ctx, int vcpu, uint64_t gpa, uint64_t *rval, int size, void *arg)
@ -196,33 +197,6 @@ emulate_mem(struct vmctx *ctx, struct mmio_request *mmio_req)
return err; return err;
} }
static int
register_mem_int(struct mmio_rb_tree *rbt, struct mem_range *memp)
{
struct mmio_rb_range *entry, *mrp;
int err;
err = 0;
mrp = malloc(sizeof(struct mmio_rb_range));
if (mrp != NULL) {
mrp->mr_param = *memp;
mrp->mr_base = memp->base;
mrp->mr_end = memp->base + memp->size - 1;
mrp->enabled = true;
pthread_rwlock_wrlock(&mmio_rwlock);
if (mmio_rb_lookup(rbt, memp->base, &entry) != 0)
err = mmio_rb_add(rbt, mrp);
pthread_rwlock_unlock(&mmio_rwlock);
if (err)
free(mrp);
} else
err = -1;
return err;
}
int int
disable_mem(struct mem_range *memp) disable_mem(struct mem_range *memp)
{ {
@ -285,6 +259,33 @@ enable_mem(struct mem_range *memp)
return 0; return 0;
} }
static int
register_mem_int(struct mmio_rb_tree *rbt, struct mem_range *memp)
{
struct mmio_rb_range *entry, *mrp;
int err;
err = 0;
mrp = malloc(sizeof(struct mmio_rb_range));
if (mrp != NULL) {
mrp->mr_param = *memp;
mrp->mr_base = memp->base;
mrp->mr_end = memp->base + memp->size - 1;
mrp->enabled = true;
pthread_rwlock_wrlock(&mmio_rwlock);
if (mmio_rb_lookup(rbt, memp->base, &entry) != 0)
err = mmio_rb_add(rbt, mrp);
pthread_rwlock_unlock(&mmio_rwlock);
if (err)
free(mrp);
} else
err = -1;
return err;
}
int int
register_mem(struct mem_range *memp) register_mem(struct mem_range *memp)
{ {
@ -297,25 +298,28 @@ register_mem_fallback(struct mem_range *memp)
return register_mem_int(&mmio_rb_fallback, memp); return register_mem_int(&mmio_rb_fallback, memp);
} }
int static int
unregister_mem_fallback(struct mem_range *memp) unregister_mem_int(struct mmio_rb_tree *rbt, struct mem_range *memp)
{ {
struct mem_range *mr; struct mem_range *mr;
struct mmio_rb_range *entry = NULL; struct mmio_rb_range *entry = NULL;
int err; int err;
pthread_rwlock_wrlock(&mmio_rwlock); pthread_rwlock_wrlock(&mmio_rwlock);
err = mmio_rb_lookup(&mmio_rb_fallback, memp->base, &entry); err = mmio_rb_lookup(rbt, memp->base, &entry);
if (err == 0) { if (err == 0) {
mr = &entry->mr_param; mr = &entry->mr_param;
assert(mr->name == memp->name); if (strncmp(mr->name, memp->name, MEMNAMESZ)) {
assert(mr->base == memp->base && mr->size == memp->size); err = -1;
assert((mr->flags & MEM_F_IMMUTABLE) == 0); } else {
RB_REMOVE(mmio_rb_tree, &mmio_rb_fallback, entry); assert(mr->base == memp->base && mr->size == memp->size);
assert((mr->flags & MEM_F_IMMUTABLE) == 0);
RB_REMOVE(mmio_rb_tree, rbt, entry);
/* flush Per-VM cache */ /* flush Per-VM cache */
if (mmio_hint == entry) if (mmio_hint == entry)
mmio_hint = NULL; mmio_hint = NULL;
}
} }
pthread_rwlock_unlock(&mmio_rwlock); pthread_rwlock_unlock(&mmio_rwlock);
@ -328,29 +332,13 @@ unregister_mem_fallback(struct mem_range *memp)
int int
unregister_mem(struct mem_range *memp) unregister_mem(struct mem_range *memp)
{ {
struct mem_range *mr; return unregister_mem_int(&mmio_rb_root, memp);
struct mmio_rb_range *entry = NULL; }
int err;
pthread_rwlock_wrlock(&mmio_rwlock); int
err = mmio_rb_lookup(&mmio_rb_root, memp->base, &entry); unregister_mem_fallback(struct mem_range *memp)
if (err == 0) { {
mr = &entry->mr_param; return unregister_mem_int(&mmio_rb_fallback, memp);
assert(mr->name == memp->name);
assert(mr->base == memp->base && mr->size == memp->size);
assert((mr->flags & MEM_F_IMMUTABLE) == 0);
RB_REMOVE(mmio_rb_tree, &mmio_rb_root, entry);
/* flush Per-VM cache */
if (mmio_hint == entry)
mmio_hint = NULL;
}
pthread_rwlock_unlock(&mmio_rwlock);
if (entry)
free(entry);
return err;
} }
void void

View File

@ -49,13 +49,13 @@ struct mem_range {
#define MEM_F_RW 0x3 #define MEM_F_RW 0x3
#define MEM_F_IMMUTABLE 0x4 /* mem_range cannot be unregistered */ #define MEM_F_IMMUTABLE 0x4 /* mem_range cannot be unregistered */
void init_mem(void);
int emulate_mem(struct vmctx *ctx, struct mmio_request *mmio_req); int emulate_mem(struct vmctx *ctx, struct mmio_request *mmio_req);
int disable_mem(struct mem_range *memp);
int enable_mem(struct mem_range *memp);
int register_mem(struct mem_range *memp); int register_mem(struct mem_range *memp);
int register_mem_fallback(struct mem_range *memp); int register_mem_fallback(struct mem_range *memp);
int unregister_mem(struct mem_range *memp); int unregister_mem(struct mem_range *memp);
int unregister_mem_fallback(struct mem_range *memp); int unregister_mem_fallback(struct mem_range *memp);
int disable_mem(struct mem_range *memp); void init_mem(void);
int enable_mem(struct mem_range *memp);
#endif /* _MEM_H_ */ #endif /* _MEM_H_ */

View File

@ -385,7 +385,7 @@ struct { \
#define RB_PROTOTYPE(name, type, field, cmp) \ #define RB_PROTOTYPE(name, type, field, cmp) \
RB_PROTOTYPE_INTERNAL(name, type, field, cmp,) RB_PROTOTYPE_INTERNAL(name, type, field, cmp,)
#define RB_PROTOTYPE_STATIC(name, type, field, cmp) \ #define RB_PROTOTYPE_STATIC(name, type, field, cmp) \
RB_PROTOTYPE_INTERNAL(name, type, field, cmp, __unused static) RB_PROTOTYPE_INTERNAL(name, type, field, cmp, static)
#define RB_PROTOTYPE_INTERNAL(name, type, field, cmp, attr) \ #define RB_PROTOTYPE_INTERNAL(name, type, field, cmp, attr) \
RB_PROTOTYPE_INSERT_COLOR(name, type, attr); \ RB_PROTOTYPE_INSERT_COLOR(name, type, attr); \
RB_PROTOTYPE_REMOVE_COLOR(name, type, attr); \ RB_PROTOTYPE_REMOVE_COLOR(name, type, attr); \
@ -422,7 +422,7 @@ struct { \
#define RB_GENERATE(name, type, field, cmp) \ #define RB_GENERATE(name, type, field, cmp) \
RB_GENERATE_INTERNAL(name, type, field, cmp,) RB_GENERATE_INTERNAL(name, type, field, cmp,)
#define RB_GENERATE_STATIC(name, type, field, cmp) \ #define RB_GENERATE_STATIC(name, type, field, cmp) \
RB_GENERATE_INTERNAL(name, type, field, cmp, __unused static) RB_GENERATE_INTERNAL(name, type, field, cmp, __attribute__((unused)) static)
#define RB_GENERATE_INTERNAL(name, type, field, cmp, attr) \ #define RB_GENERATE_INTERNAL(name, type, field, cmp, attr) \
RB_GENERATE_INSERT_COLOR(name, type, field, attr) \ RB_GENERATE_INSERT_COLOR(name, type, field, attr) \
RB_GENERATE_REMOVE_COLOR(name, type, field, attr) \ RB_GENERATE_REMOVE_COLOR(name, type, field, attr) \