mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
tools/xenstored: switch stubdom live update to use file for state
With the introduction of 9pfs for Xenstore-stubdom it is now possible to use a file for saving the state when doing live update. This allows to move some environment specific actions back to the common source file lu.c. Signed-off-by: Juergen Gross <jgross@suse.com> Reviewed-by: Julien Grall <jgrall@amazon.com>
This commit is contained in:
1 parent
c36efb7fce
commit
e4d19a2dad
4 files changed
+75
-140
No files matched your search
+74
-1
@@ -11,6 +11,8 @@
|
||||
#include <stdlib.h>
|
||||
#include <syslog.h>
|
||||
#include <time.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include "talloc.h"
|
||||
#include "core.h"
|
||||
@@ -19,11 +21,18 @@
|
||||
#include "watch.h"
|
||||
|
||||
#ifndef NO_LIVE_UPDATE
|
||||
|
||||
struct lu_dump_state {
|
||||
void *buf;
|
||||
unsigned int size;
|
||||
int fd;
|
||||
char *filename;
|
||||
};
|
||||
|
||||
struct live_update *lu_status;
|
||||
|
||||
static int lu_destroy(void *data)
|
||||
{
|
||||
lu_destroy_arch(data);
|
||||
lu_status = NULL;
|
||||
|
||||
return 0;
|
||||
@@ -70,6 +79,48 @@ bool lu_is_pending(void)
|
||||
return lu_status != NULL;
|
||||
}
|
||||
|
||||
static void lu_get_dump_state(struct lu_dump_state *state)
|
||||
{
|
||||
struct stat statbuf;
|
||||
|
||||
state->size = 0;
|
||||
|
||||
state->filename = talloc_asprintf(NULL, "%s/state_dump",
|
||||
xenstore_rundir());
|
||||
if (!state->filename)
|
||||
barf("Allocation failure");
|
||||
|
||||
state->fd = open(state->filename, O_RDONLY);
|
||||
if (state->fd < 0)
|
||||
return;
|
||||
if (fstat(state->fd, &statbuf) != 0)
|
||||
goto out_close;
|
||||
state->size = statbuf.st_size;
|
||||
|
||||
state->buf = mmap(NULL, state->size, PROT_READ, MAP_PRIVATE,
|
||||
state->fd, 0);
|
||||
if (state->buf == MAP_FAILED) {
|
||||
state->size = 0;
|
||||
goto out_close;
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
out_close:
|
||||
close(state->fd);
|
||||
}
|
||||
|
||||
static void lu_close_dump_state(struct lu_dump_state *state)
|
||||
{
|
||||
assert(state->filename != NULL);
|
||||
|
||||
munmap(state->buf, state->size);
|
||||
close(state->fd);
|
||||
|
||||
unlink(state->filename);
|
||||
talloc_free(state->filename);
|
||||
}
|
||||
|
||||
void lu_read_state(void)
|
||||
{
|
||||
struct lu_dump_state state = {};
|
||||
@@ -197,6 +248,28 @@ static const char *lu_reject_reason(const void *ctx)
|
||||
return ret ? (const char *)ret : "Overlapping transactions";
|
||||
}
|
||||
|
||||
static FILE *lu_dump_open(const void *ctx)
|
||||
{
|
||||
char *filename;
|
||||
int fd;
|
||||
|
||||
filename = talloc_asprintf(ctx, "%s/state_dump",
|
||||
xenstore_rundir());
|
||||
if (!filename)
|
||||
return NULL;
|
||||
|
||||
fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
|
||||
if (fd < 0)
|
||||
return NULL;
|
||||
|
||||
return fdopen(fd, "w");
|
||||
}
|
||||
|
||||
static void lu_dump_close(FILE *fp)
|
||||
{
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
static const char *lu_dump_state(const void *ctx, struct connection *conn)
|
||||
{
|
||||
FILE *fp;
|
||||
|
||||
+1
-18
@@ -18,12 +18,9 @@ struct live_update {
|
||||
unsigned int kernel_size;
|
||||
unsigned int kernel_off;
|
||||
|
||||
void *dump_state;
|
||||
unsigned long dump_size;
|
||||
#else
|
||||
char *filename;
|
||||
#endif
|
||||
|
||||
char *filename;
|
||||
char *cmdline;
|
||||
|
||||
/* Start parameters. */
|
||||
@@ -32,15 +29,6 @@ struct live_update {
|
||||
time_t started_at;
|
||||
};
|
||||
|
||||
struct lu_dump_state {
|
||||
void *buf;
|
||||
unsigned int size;
|
||||
#ifndef __MINIOS__
|
||||
int fd;
|
||||
char *filename;
|
||||
#endif
|
||||
};
|
||||
|
||||
extern struct live_update *lu_status;
|
||||
|
||||
struct connection *lu_get_connection(void);
|
||||
@@ -54,15 +42,10 @@ int do_control_lu(const void *ctx, struct connection *conn, const char **vec,
|
||||
int num);
|
||||
|
||||
/* Live update private interfaces. */
|
||||
void lu_get_dump_state(struct lu_dump_state *state);
|
||||
void lu_close_dump_state(struct lu_dump_state *state);
|
||||
FILE *lu_dump_open(const void *ctx);
|
||||
void lu_dump_close(FILE *fp);
|
||||
char *lu_exec(const void *ctx, int argc, char **argv);
|
||||
const char *lu_arch(const void *ctx, struct connection *conn, const char **vec,
|
||||
int num);
|
||||
const char *lu_begin(struct connection *conn);
|
||||
void lu_destroy_arch(void *data);
|
||||
#else
|
||||
static inline struct connection *lu_get_connection(void)
|
||||
{
|
||||
|
||||
@@ -5,82 +5,14 @@
|
||||
* Copyright (C) 2022 Juergen Gross, SUSE LLC
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <syslog.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/mman.h>
|
||||
#include <xen-tools/xenstore-common.h>
|
||||
|
||||
#include "talloc.h"
|
||||
#include "core.h"
|
||||
#include "lu.h"
|
||||
|
||||
#ifndef NO_LIVE_UPDATE
|
||||
void lu_get_dump_state(struct lu_dump_state *state)
|
||||
{
|
||||
struct stat statbuf;
|
||||
|
||||
state->size = 0;
|
||||
|
||||
state->filename = talloc_asprintf(NULL, "%s/state_dump",
|
||||
xenstore_rundir());
|
||||
if (!state->filename)
|
||||
barf("Allocation failure");
|
||||
|
||||
state->fd = open(state->filename, O_RDONLY);
|
||||
if (state->fd < 0)
|
||||
return;
|
||||
if (fstat(state->fd, &statbuf) != 0)
|
||||
goto out_close;
|
||||
state->size = statbuf.st_size;
|
||||
|
||||
state->buf = mmap(NULL, state->size, PROT_READ, MAP_PRIVATE,
|
||||
state->fd, 0);
|
||||
if (state->buf == MAP_FAILED) {
|
||||
state->size = 0;
|
||||
goto out_close;
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
out_close:
|
||||
close(state->fd);
|
||||
}
|
||||
|
||||
void lu_close_dump_state(struct lu_dump_state *state)
|
||||
{
|
||||
assert(state->filename != NULL);
|
||||
|
||||
munmap(state->buf, state->size);
|
||||
close(state->fd);
|
||||
|
||||
unlink(state->filename);
|
||||
talloc_free(state->filename);
|
||||
}
|
||||
|
||||
FILE *lu_dump_open(const void *ctx)
|
||||
{
|
||||
char *filename;
|
||||
int fd;
|
||||
|
||||
filename = talloc_asprintf(ctx, "%s/state_dump",
|
||||
xenstore_rundir());
|
||||
if (!filename)
|
||||
return NULL;
|
||||
|
||||
fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
|
||||
if (fd < 0)
|
||||
return NULL;
|
||||
|
||||
return fdopen(fd, "w");
|
||||
}
|
||||
|
||||
void lu_dump_close(FILE *fp)
|
||||
{
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
char *lu_exec(const void *ctx, int argc, char **argv)
|
||||
{
|
||||
argv[0] = lu_status->filename;
|
||||
@@ -89,10 +21,6 @@ char *lu_exec(const void *ctx, int argc, char **argv)
|
||||
return "Error activating new binary.";
|
||||
}
|
||||
|
||||
void lu_destroy_arch(void *data)
|
||||
{
|
||||
}
|
||||
|
||||
static const char *lu_binary(const void *ctx, struct connection *conn,
|
||||
const char *filename)
|
||||
{
|
||||
|
||||
@@ -5,67 +5,18 @@
|
||||
* Copyright (C) 2022 Juergen Gross, SUSE LLC
|
||||
*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <syslog.h>
|
||||
#include <sys/mman.h>
|
||||
#include <xenctrl.h>
|
||||
#include <xen-tools/common-macros.h>
|
||||
|
||||
#include "talloc.h"
|
||||
#include "lu.h"
|
||||
|
||||
/* Mini-OS only knows about MAP_ANON. */
|
||||
#ifndef MAP_ANONYMOUS
|
||||
#define MAP_ANONYMOUS MAP_ANON
|
||||
#endif
|
||||
|
||||
#ifndef NO_LIVE_UPDATE
|
||||
void lu_get_dump_state(struct lu_dump_state *state)
|
||||
{
|
||||
}
|
||||
|
||||
void lu_close_dump_state(struct lu_dump_state *state)
|
||||
{
|
||||
}
|
||||
|
||||
FILE *lu_dump_open(const void *ctx)
|
||||
{
|
||||
lu_status->dump_size = ROUNDUP(talloc_total_size(NULL) * 2,
|
||||
XC_PAGE_SHIFT);
|
||||
lu_status->dump_state = mmap(NULL, lu_status->dump_size,
|
||||
PROT_READ | PROT_WRITE,
|
||||
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
||||
if (lu_status->dump_state == MAP_FAILED)
|
||||
return NULL;
|
||||
|
||||
return fmemopen(lu_status->dump_state, lu_status->dump_size, "w");
|
||||
}
|
||||
|
||||
void lu_dump_close(FILE *fp)
|
||||
{
|
||||
size_t size;
|
||||
|
||||
size = ftell(fp);
|
||||
size = ROUNDUP(size, XC_PAGE_SHIFT);
|
||||
munmap(lu_status->dump_state + size, lu_status->dump_size - size);
|
||||
lu_status->dump_size = size;
|
||||
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
char *lu_exec(const void *ctx, int argc, char **argv)
|
||||
{
|
||||
return "NYI";
|
||||
}
|
||||
|
||||
void lu_destroy_arch(void *data)
|
||||
{
|
||||
if (lu_status->dump_state)
|
||||
munmap(lu_status->dump_state, lu_status->dump_size);
|
||||
}
|
||||
|
||||
static const char *lu_binary_alloc(const void *ctx, struct connection *conn,
|
||||
unsigned long size)
|
||||
{
|
||||
|
||||