mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
tools/libxl: add functions for retrieving and setting xenstore quota
Add some functions allowing to retrieve and set Xenstore quota (either global or domain specific). Signed-off-by: Juergen Gross <jgross@suse.com> Acked-by: Nick Rosbrook <enr0n@ubuntu.com> # golang stuff Reviewed-by: Anthony PERARD <anthony.perard@vates.tech>
This commit is contained in:
1 parent
af41cad8fc
commit
6f58df9d7d
6 files changed
+233
No files matched your search
@@ -998,6 +998,84 @@ xc.policy = C.libxl_rdm_reserve_policy(x.Policy)
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewXsQuotaItem returns an instance of XsQuotaItem initialized with defaults.
|
||||||
|
func NewXsQuotaItem() (*XsQuotaItem, error) {
|
||||||
|
var (
|
||||||
|
x XsQuotaItem
|
||||||
|
xc C.libxl_xs_quota_item)
|
||||||
|
|
||||||
|
C.libxl_xs_quota_item_init(&xc)
|
||||||
|
defer C.libxl_xs_quota_item_dispose(&xc)
|
||||||
|
|
||||||
|
if err := x.fromC(&xc); err != nil {
|
||||||
|
return nil, err }
|
||||||
|
|
||||||
|
return &x, nil}
|
||||||
|
|
||||||
|
func (x *XsQuotaItem) fromC(xc *C.libxl_xs_quota_item) error {
|
||||||
|
x.Name = C.GoString(xc.name)
|
||||||
|
x.Val = uint32(xc.val)
|
||||||
|
|
||||||
|
return nil}
|
||||||
|
|
||||||
|
func (x *XsQuotaItem) toC(xc *C.libxl_xs_quota_item) (err error){defer func(){
|
||||||
|
if err != nil{
|
||||||
|
C.libxl_xs_quota_item_dispose(xc)}
|
||||||
|
}()
|
||||||
|
|
||||||
|
if x.Name != "" {
|
||||||
|
xc.name = C.CString(x.Name)}
|
||||||
|
xc.val = C.uint32_t(x.Val)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewXsQuotaList returns an instance of XsQuotaList initialized with defaults.
|
||||||
|
func NewXsQuotaList() (*XsQuotaList, error) {
|
||||||
|
var (
|
||||||
|
x XsQuotaList
|
||||||
|
xc C.libxl_xs_quota_list)
|
||||||
|
|
||||||
|
C.libxl_xs_quota_list_init(&xc)
|
||||||
|
defer C.libxl_xs_quota_list_dispose(&xc)
|
||||||
|
|
||||||
|
if err := x.fromC(&xc); err != nil {
|
||||||
|
return nil, err }
|
||||||
|
|
||||||
|
return &x, nil}
|
||||||
|
|
||||||
|
func (x *XsQuotaList) fromC(xc *C.libxl_xs_quota_list) error {
|
||||||
|
x.Quota = nil
|
||||||
|
if n := int(xc.num_quota); n > 0 {
|
||||||
|
cQuota := (*[1<<28]C.libxl_xs_quota_item)(unsafe.Pointer(xc.quota))[:n:n]
|
||||||
|
x.Quota = make([]XsQuotaItem, n)
|
||||||
|
for i, v := range cQuota {
|
||||||
|
if err := x.Quota[i].fromC(&v); err != nil {
|
||||||
|
return fmt.Errorf("converting field Quota: %v", err) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil}
|
||||||
|
|
||||||
|
func (x *XsQuotaList) toC(xc *C.libxl_xs_quota_list) (err error){defer func(){
|
||||||
|
if err != nil{
|
||||||
|
C.libxl_xs_quota_list_dispose(xc)}
|
||||||
|
}()
|
||||||
|
|
||||||
|
if numQuota := len(x.Quota); numQuota > 0 {
|
||||||
|
xc.quota = (*C.libxl_xs_quota_item)(C.malloc(C.ulong(numQuota)*C.sizeof_libxl_xs_quota_item))
|
||||||
|
xc.num_quota = C.int(numQuota)
|
||||||
|
cQuota := (*[1<<28]C.libxl_xs_quota_item)(unsafe.Pointer(xc.quota))[:numQuota:numQuota]
|
||||||
|
for i,v := range x.Quota {
|
||||||
|
if err := v.toC(&cQuota[i]); err != nil {
|
||||||
|
return fmt.Errorf("converting field Quota: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// NewDomainBuildInfo returns an instance of DomainBuildInfo initialized with defaults.
|
// NewDomainBuildInfo returns an instance of DomainBuildInfo initialized with defaults.
|
||||||
func NewDomainBuildInfo(dtype DomainType) (*DomainBuildInfo, error) {
|
func NewDomainBuildInfo(dtype DomainType) (*DomainBuildInfo, error) {
|
||||||
var (
|
var (
|
||||||
|
|||||||
@@ -543,6 +543,15 @@ Altp2MModeExternal Altp2MMode = 2
|
|||||||
Altp2MModeLimited Altp2MMode = 3
|
Altp2MModeLimited Altp2MMode = 3
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type XsQuotaItem struct {
|
||||||
|
Name string
|
||||||
|
Val uint32
|
||||||
|
}
|
||||||
|
|
||||||
|
type XsQuotaList struct {
|
||||||
|
Quota []XsQuotaItem
|
||||||
|
}
|
||||||
|
|
||||||
type DomainBuildInfo struct {
|
type DomainBuildInfo struct {
|
||||||
MaxVcpus int
|
MaxVcpus int
|
||||||
AvailVcpus Bitmap
|
AvailVcpus Bitmap
|
||||||
|
|||||||
@@ -1537,6 +1537,18 @@ void libxl_mac_copy(libxl_ctx *ctx, libxl_mac *dst, const libxl_mac *src);
|
|||||||
*/
|
*/
|
||||||
#define LIBXL_HAVE_XEN_PLATFORM_PCI_BAR_UC
|
#define LIBXL_HAVE_XEN_PLATFORM_PCI_BAR_UC
|
||||||
|
|
||||||
|
/*
|
||||||
|
* LIBXL_HAVE_XENSTORE_QUOTA
|
||||||
|
*
|
||||||
|
* If this is defined the Xenstore quota related functions
|
||||||
|
* libxl_xs_quota_global_get()
|
||||||
|
* libxl_xs_quota_global_set()
|
||||||
|
* libxl_xs_quota_domain_get()
|
||||||
|
* libxl_xs_quota_domain_set()
|
||||||
|
* are available.
|
||||||
|
*/
|
||||||
|
#define LIBXL_HAVE_XENSTORE_QUOTA
|
||||||
|
|
||||||
typedef char **libxl_string_list;
|
typedef char **libxl_string_list;
|
||||||
void libxl_string_list_dispose(libxl_string_list *sl);
|
void libxl_string_list_dispose(libxl_string_list *sl);
|
||||||
int libxl_string_list_length(const libxl_string_list *sl);
|
int libxl_string_list_length(const libxl_string_list *sl);
|
||||||
@@ -3011,6 +3023,14 @@ static inline int libxl_qemu_monitor_command_0x041200(libxl_ctx *ctx,
|
|||||||
#define libxl_qemu_monitor_command libxl_qemu_monitor_command_0x041200
|
#define libxl_qemu_monitor_command libxl_qemu_monitor_command_0x041200
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Get/set global and per-domain Xenstore quota. */
|
||||||
|
int libxl_xs_quota_global_get(libxl_ctx *ctx, libxl_xs_quota_list *q_out);
|
||||||
|
int libxl_xs_quota_global_set(libxl_ctx *ctx, libxl_xs_quota_list *q);
|
||||||
|
int libxl_xs_quota_domain_get(libxl_ctx *ctx, uint32_t domid,
|
||||||
|
libxl_xs_quota_list *q_out);
|
||||||
|
int libxl_xs_quota_domain_set(libxl_ctx *ctx, uint32_t domid,
|
||||||
|
libxl_xs_quota_list *q);
|
||||||
|
|
||||||
#include <libxl_event.h>
|
#include <libxl_event.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -106,6 +106,7 @@ OBJS-y += libxl_pvcalls.o
|
|||||||
OBJS-y += libxl_vsnd.o
|
OBJS-y += libxl_vsnd.o
|
||||||
OBJS-y += libxl_vkb.o
|
OBJS-y += libxl_vkb.o
|
||||||
OBJS-y += libxl_virtio.o
|
OBJS-y += libxl_virtio.o
|
||||||
|
OBJS-y += libxl_xsquota.o
|
||||||
OBJS-y += libxl_genid.o
|
OBJS-y += libxl_genid.o
|
||||||
OBJS-y += _libxl_types.o
|
OBJS-y += _libxl_types.o
|
||||||
OBJS-y += libxl_flask.o
|
OBJS-y += libxl_flask.o
|
||||||
|
|||||||
@@ -574,6 +574,15 @@ libxl_altp2m_mode = Enumeration("altp2m_mode", [
|
|||||||
(3, "limited"),
|
(3, "limited"),
|
||||||
], init_val = "LIBXL_ALTP2M_MODE_DISABLED")
|
], init_val = "LIBXL_ALTP2M_MODE_DISABLED")
|
||||||
|
|
||||||
|
libxl_xs_quota_item = Struct("xs_quota_item", [
|
||||||
|
("name", string),
|
||||||
|
("val", uint32),
|
||||||
|
])
|
||||||
|
|
||||||
|
libxl_xs_quota_list = Struct("xs_quota_list", [
|
||||||
|
("quota", Array(libxl_xs_quota_item, "num_quota"))
|
||||||
|
])
|
||||||
|
|
||||||
libxl_domain_build_info = Struct("domain_build_info",[
|
libxl_domain_build_info = Struct("domain_build_info",[
|
||||||
("max_vcpus", integer),
|
("max_vcpus", integer),
|
||||||
("avail_vcpus", libxl_bitmap),
|
("avail_vcpus", libxl_bitmap),
|
||||||
|
|||||||
@@ -0,0 +1,116 @@
|
|||||||
|
/* SPDX-License-Identifier: LGPL-2.1-only */
|
||||||
|
|
||||||
|
/* Xenstore quota handling functions. */
|
||||||
|
|
||||||
|
#include "libxl_internal.h"
|
||||||
|
|
||||||
|
static int get_quota(libxl_ctx *ctx, unsigned int domid,
|
||||||
|
libxl_xs_quota_list *q_out,
|
||||||
|
bool (func)(struct xs_handle *h, unsigned int domid,
|
||||||
|
const char *quota, unsigned int *value))
|
||||||
|
{
|
||||||
|
const char **names;
|
||||||
|
unsigned int num, i;
|
||||||
|
bool ok;
|
||||||
|
int rc;
|
||||||
|
GC_INIT(ctx);
|
||||||
|
|
||||||
|
libxl_xs_quota_list_init(q_out);
|
||||||
|
names = xs_get_quota_names(ctx->xsh, &num);
|
||||||
|
if (!names) {
|
||||||
|
/* Xenstore quota support is optional! */
|
||||||
|
if (errno != ENOSYS) {
|
||||||
|
libxl_xs_quota_list_dispose(q_out);
|
||||||
|
rc = ERROR_FAIL;
|
||||||
|
} else {
|
||||||
|
rc = 0;
|
||||||
|
}
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
q_out->num_quota = num;
|
||||||
|
q_out->quota = libxl__calloc(NOGC, num, sizeof(*q_out->quota));
|
||||||
|
for (i = 0; i < num; i++) {
|
||||||
|
q_out->quota[i].name = libxl__strdup(NOGC, names[i]);
|
||||||
|
ok = func(ctx->xsh, domid, q_out->quota[i].name, &q_out->quota[i].val);
|
||||||
|
if (!ok) {
|
||||||
|
libxl_xs_quota_list_dispose(q_out);
|
||||||
|
rc = ERROR_FAIL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = 0;
|
||||||
|
|
||||||
|
out:
|
||||||
|
free(names);
|
||||||
|
|
||||||
|
GC_FREE;
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int set_quota(libxl_ctx *ctx, unsigned int domid, libxl_xs_quota_list *q,
|
||||||
|
bool (func)(struct xs_handle *h, unsigned int domid,
|
||||||
|
const char *quota, unsigned int value))
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
bool ok;
|
||||||
|
int rc;
|
||||||
|
GC_INIT(ctx);
|
||||||
|
|
||||||
|
for (i = 0; i < q->num_quota; i++) {
|
||||||
|
ok = func(ctx->xsh, domid, q->quota[i].name, q->quota[i].val);
|
||||||
|
if (!ok) {
|
||||||
|
rc = ERROR_FAIL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = 0;
|
||||||
|
|
||||||
|
out:
|
||||||
|
GC_FREE;
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool get_global_quota(struct xs_handle *h, unsigned int domid,
|
||||||
|
const char *quota, unsigned int *value)
|
||||||
|
{
|
||||||
|
return xs_get_global_quota(h, quota, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
int libxl_xs_quota_global_get(libxl_ctx *ctx, libxl_xs_quota_list *q_out)
|
||||||
|
{
|
||||||
|
return get_quota(ctx, 0, q_out, get_global_quota);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool set_global_quota(struct xs_handle *h, unsigned int domid,
|
||||||
|
const char *quota, unsigned int value)
|
||||||
|
{
|
||||||
|
return xs_set_global_quota(h, quota, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
int libxl_xs_quota_global_set(libxl_ctx *ctx, libxl_xs_quota_list *q)
|
||||||
|
{
|
||||||
|
return set_quota(ctx, 0, q, set_global_quota);;
|
||||||
|
}
|
||||||
|
|
||||||
|
int libxl_xs_quota_domain_get(libxl_ctx *ctx, uint32_t domid,
|
||||||
|
libxl_xs_quota_list *q_out)
|
||||||
|
{
|
||||||
|
return get_quota(ctx, domid, q_out, xs_get_domain_quota);
|
||||||
|
}
|
||||||
|
|
||||||
|
int libxl_xs_quota_domain_set(libxl_ctx *ctx, uint32_t domid,
|
||||||
|
libxl_xs_quota_list *q)
|
||||||
|
{
|
||||||
|
return set_quota(ctx, domid, q, xs_set_domain_quota);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Local variables:
|
||||||
|
* mode: C
|
||||||
|
* c-basic-offset: 4
|
||||||
|
* indent-tabs-mode: nil
|
||||||
|
* End:
|
||||||
|
*/
|
||||||