Skip to content

Commit

Permalink
tools/xenstore: add current connection to domain_memory_add() parameters
Browse files Browse the repository at this point in the history
In order to enable switching memory accounting to the generic array
based accounting, add the current connection to the parameters of
domain_memory_add().

This requires to add the connection to some other functions, too.

Signed-off-by: Juergen Gross <[email protected]>
Acked-by: Julien Grall <[email protected]>
  • Loading branch information
jgross1 authored and Julien Grall committed Jun 7, 2023
1 parent a4ffaa0 commit d074023
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 23 deletions.
28 changes: 16 additions & 12 deletions tools/xenstore/xenstored_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,8 @@ static void free_buffered_data(struct buffered_data *out,
}
}

domain_memory_add_nochk(conn->id, -out->hdr.msg.len - sizeof(out->hdr));
domain_memory_add_nochk(conn, conn->id,
-out->hdr.msg.len - sizeof(out->hdr));

if (out->hdr.msg.type == XS_WATCH_EVENT) {
req = out->pend.req;
Expand Down Expand Up @@ -631,24 +632,25 @@ int do_tdb_write(struct connection *conn, TDB_DATA *key, TDB_DATA *data,
* nodes to new owners.
*/
if (old_acc.memory)
domain_memory_add_nochk(old_domid,
domain_memory_add_nochk(conn, old_domid,
-old_acc.memory - key->dsize);
ret = domain_memory_add(new_domid, data->dsize + key->dsize,
no_quota_check);
ret = domain_memory_add(conn, new_domid,
data->dsize + key->dsize, no_quota_check);
if (ret) {
/* Error path, so no quota check. */
if (old_acc.memory)
domain_memory_add_nochk(old_domid,
domain_memory_add_nochk(conn, old_domid,
old_acc.memory + key->dsize);
return ret;
}

/* TDB should set errno, but doesn't even set ecode AFAICT. */
if (tdb_store(tdb_ctx, *key, *data, TDB_REPLACE) != 0) {
domain_memory_add_nochk(new_domid, -data->dsize - key->dsize);
domain_memory_add_nochk(conn, new_domid,
-data->dsize - key->dsize);
/* Error path, so no quota check. */
if (old_acc.memory)
domain_memory_add_nochk(old_domid,
domain_memory_add_nochk(conn, old_domid,
old_acc.memory + key->dsize);
errno = EIO;
return errno;
Expand Down Expand Up @@ -683,7 +685,7 @@ int do_tdb_delete(struct connection *conn, TDB_DATA *key,

if (acc->memory) {
domid = get_acc_domid(conn, key, acc->domid);
domain_memory_add_nochk(domid, -acc->memory - key->dsize);
domain_memory_add_nochk(conn, domid, -acc->memory - key->dsize);
}

return 0;
Expand Down Expand Up @@ -1055,11 +1057,13 @@ void send_reply(struct connection *conn, enum xsd_sockmsg_type type,
if (len <= DEFAULT_BUFFER_SIZE) {
bdata->buffer = bdata->default_buffer;
/* Don't check quota, path might be used for returning error. */
domain_memory_add_nochk(conn->id, len + sizeof(bdata->hdr));
domain_memory_add_nochk(conn, conn->id,
len + sizeof(bdata->hdr));
} else {
bdata->buffer = talloc_array(bdata, char, len);
if (!bdata->buffer ||
domain_memory_add_chk(conn->id, len + sizeof(bdata->hdr))) {
domain_memory_add_chk(conn, conn->id,
len + sizeof(bdata->hdr))) {
send_error(conn, ENOMEM);
return;
}
Expand Down Expand Up @@ -1124,7 +1128,7 @@ void send_event(struct buffered_data *req, struct connection *conn,
}
}

if (domain_memory_add_chk(conn->id, len + sizeof(bdata->hdr))) {
if (domain_memory_add_chk(conn, conn->id, len + sizeof(bdata->hdr))) {
talloc_free(bdata);
return;
}
Expand Down Expand Up @@ -3332,7 +3336,7 @@ static void add_buffered_data(struct buffered_data *bdata,
* be smaller. So ignore it. The limit will be applied for any resource
* after the state has been fully restored.
*/
domain_memory_add_nochk(conn->id, len + sizeof(bdata->hdr));
domain_memory_add_nochk(conn, conn->id, len + sizeof(bdata->hdr));
}

void read_state_buffered_data(const void *ctx, struct connection *conn,
Expand Down
3 changes: 2 additions & 1 deletion tools/xenstore/xenstored_domain.c
Original file line number Diff line number Diff line change
Expand Up @@ -1235,7 +1235,8 @@ static bool domain_chk_quota(struct domain *domain, int mem)
return false;
}

int domain_memory_add(unsigned int domid, int mem, bool no_quota_check)
int domain_memory_add(struct connection *conn, unsigned int domid, int mem,
bool no_quota_check)
{
struct domain *domain;

Expand Down
14 changes: 9 additions & 5 deletions tools/xenstore/xenstored_domain.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,25 +81,29 @@ int domain_nbentry_inc(struct connection *conn, unsigned int domid);
int domain_nbentry_dec(struct connection *conn, unsigned int domid);
int domain_nbentry_fix(unsigned int domid, int num, bool update);
unsigned int domain_nbentry(struct connection *conn);
int domain_memory_add(unsigned int domid, int mem, bool no_quota_check);
int domain_memory_add(struct connection *conn, unsigned int domid, int mem,
bool no_quota_check);

/*
* domain_memory_add_chk(): to be used when memory quota should be checked.
* Not to be used when specifying a negative mem value, as lowering the used
* memory should always be allowed.
*/
static inline int domain_memory_add_chk(unsigned int domid, int mem)
static inline int domain_memory_add_chk(struct connection *conn,
unsigned int domid, int mem)
{
return domain_memory_add(domid, mem, false);
return domain_memory_add(conn, domid, mem, false);
}

/*
* domain_memory_add_nochk(): to be used when memory quota should not be
* checked, e.g. when lowering memory usage, or in an error case for undoing
* a previous memory adjustment.
*/
static inline void domain_memory_add_nochk(unsigned int domid, int mem)
static inline void domain_memory_add_nochk(struct connection *conn,
unsigned int domid, int mem)
{
domain_memory_add(domid, mem, true);
domain_memory_add(conn, domid, mem, true);
}
void domain_watch_inc(struct connection *conn);
void domain_watch_dec(struct connection *conn);
Expand Down
11 changes: 6 additions & 5 deletions tools/xenstore/xenstored_watch.c
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ static struct watch *add_watch(struct connection *conn, char *path, char *token,
watch->token = talloc_strdup(watch, token);
if (!watch->node || !watch->token)
goto nomem;
if (domain_memory_add(conn->id, strlen(path) + strlen(token),
if (domain_memory_add(conn, conn->id, strlen(path) + strlen(token),
no_quota_check))
goto nomem;

Expand Down Expand Up @@ -274,8 +274,9 @@ int do_unwatch(const void *ctx, struct connection *conn,
list_for_each_entry(watch, &conn->watches, list) {
if (streq(watch->node, node) && streq(watch->token, vec[1])) {
list_del(&watch->list);
domain_memory_add_nochk(conn->id, -strlen(watch->node) -
strlen(watch->token));
domain_memory_add_nochk(conn, conn->id,
-strlen(watch->node) -
strlen(watch->token));
talloc_free(watch);
domain_watch_dec(conn);
send_ack(conn, XS_UNWATCH);
Expand All @@ -291,8 +292,8 @@ void conn_delete_all_watches(struct connection *conn)

while ((watch = list_top(&conn->watches, struct watch, list))) {
list_del(&watch->list);
domain_memory_add_nochk(conn->id, -strlen(watch->node) -
strlen(watch->token));
domain_memory_add_nochk(conn, conn->id, -strlen(watch->node) -
strlen(watch->token));
talloc_free(watch);
domain_watch_dec(conn);
}
Expand Down

0 comments on commit d074023

Please sign in to comment.