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:
Juergen Gross authored and Anthony PERARD committed 2026-03-27 12:06:37 +01:00
1 parent af41cad8fc
commit 6f58df9d7d
6 files changed
+233

No files matched your search

+78
View File
@@ -998,6 +998,84 @@ xc.policy = C.libxl_rdm_reserve_policy(x.Policy)
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.
func NewDomainBuildInfo(dtype DomainType) (*DomainBuildInfo, error) {
var (
+9
View File
@@ -543,6 +543,15 @@ Altp2MModeExternal Altp2MMode = 2
Altp2MModeLimited Altp2MMode = 3
)
type XsQuotaItem struct {
Name string
Val uint32
}
type XsQuotaList struct {
Quota []XsQuotaItem
}
type DomainBuildInfo struct {
MaxVcpus int
AvailVcpus Bitmap
+20
View File
@@ -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
/*
* 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;
void libxl_string_list_dispose(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
#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>
/*
+1
View File
@@ -106,6 +106,7 @@ OBJS-y += libxl_pvcalls.o
OBJS-y += libxl_vsnd.o
OBJS-y += libxl_vkb.o
OBJS-y += libxl_virtio.o
OBJS-y += libxl_xsquota.o
OBJS-y += libxl_genid.o
OBJS-y += _libxl_types.o
OBJS-y += libxl_flask.o
+9
View File
@@ -574,6 +574,15 @@ libxl_altp2m_mode = Enumeration("altp2m_mode", [
(3, "limited"),
], 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",[
("max_vcpus", integer),
("avail_vcpus", libxl_bitmap),
+116
View File
@@ -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:
*/
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.