[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH RFC 35/59] libxl: Add ListCpupool
From: George Dunlap <george.dunlap@xxxxxxxxxx> Add libxl bindings for libxl_list_cpupool(). Define the Scheduler type (based on libxl_schedler) with appropriate constants and string functions. Punt on the cpumap part of CpupoolInfo for now. Also create "xltest" command for testing libxl bindings Signed-off-by: George Dunlap <george.dunlap@xxxxxxxxxx> --- libxl.go | 152 +++++++++++++++++++++++++++++++++++++++++++++++++++++ main.go | 5 ++ xenworker_dummy.go | 4 ++ 3 files changed, 161 insertions(+) diff --git a/libxl.go b/libxl.go index 415de7f..5bdabb1 100644 --- a/libxl.go +++ b/libxl.go @@ -2,6 +2,7 @@ package main /* #include <libxl.h> +#include <stdlib.h> */ import "C" @@ -128,3 +129,154 @@ func (Ctx *Context) DomainUnpause(Id Domid) (err error) { } return } + + +// typedef struct { +// uint32_t size; /* number of bytes in map */ +// uint8_t *map; +// } libxl_bitmap; +// void libxl_bitmap_init(libxl_bitmap *map); +// void libxl_bitmap_dispose(libxl_bitmap *map); + +// # Consistent with values defined in domctl.h +// # Except unknown which we have made up +// libxl_scheduler = Enumeration("scheduler", [ +// (0, "unknown"), +// (4, "sedf"), +// (5, "credit"), +// (6, "credit2"), +// (7, "arinc653"), +// (8, "rtds"), +// ]) +type Scheduler int +var ( + SchedulerUnknown Scheduler = 0 + SchedulerSedf Scheduler = 4 + SchedulerCredit Scheduler = 5 + SchedulerCredit2 Scheduler = 6 + SchedulerArinc653 Scheduler = 7 + SchedulerRTDS Scheduler = 8 +) + +// const char *libxl_scheduler_to_string(libxl_scheduler p); +// int libxl_scheduler_from_string(const char *s, libxl_scheduler *e); +func (s Scheduler) String() (string) { + cs := C.libxl_scheduler_to_string(C.libxl_scheduler(s)) + // No need to free const return value + + return C.GoString(cs) +} + +func SchedulerFromString(name string) (s Scheduler, err error) { + cname := C.CString(name) + defer C.free(unsafe.Pointer(cname)) + + var cs C.libxl_scheduler + + ret := C.libxl_scheduler_from_string(cname, &cs) + if ret != 0 { + err = fmt.Errorf("libxl_scheduler_from_string failed: %d", ret) + return + } + + s = Scheduler(cs) + + return +} + +// libxl_cpupoolinfo = Struct("cpupoolinfo", [ +// ("poolid", uint32), +// ("pool_name", string), +// ("sched", libxl_scheduler), +// ("n_dom", uint32), +// ("cpumap", libxl_bitmap) +// ], dir=DIR_OUT) + +type CpupoolInfo struct { + PoolId uint32 + PoolName string + Scheduler Scheduler + DomainCount int + // Punt on cpumap for now +} + +// libxl_cpupoolinfo * libxl_list_cpupool(libxl_ctx*, int *nb_pool_out); +// void libxl_cpupoolinfo_list_free(libxl_cpupoolinfo *list, int nb_pool); +func (Ctx *Context) ListCpupool() (list []CpupoolInfo) { + var nbPool C.int + + c_cpupool_list := C.libxl_list_cpupool(Ctx.ctx, &nbPool) + + defer C.libxl_cpupoolinfo_list_free(c_cpupool_list, nbPool) + + if int(nbPool) == 0 { + return + } + + // Magic + cpupoolListSlice := (*[1 << 30]C.libxl_cpupoolinfo)(unsafe.Pointer(c_cpupool_list))[:nbPool:nbPool] + + for i := range cpupoolListSlice { + var info CpupoolInfo + + info.PoolId = uint32(cpupoolListSlice[i].poolid) + info.PoolName = C.GoString(cpupoolListSlice[i].pool_name) + info.Scheduler = Scheduler(cpupoolListSlice[i].sched) + info.DomainCount = int(cpupoolListSlice[i].n_dom) + + list = append(list, info) + } + + return +} + +func (Ctx *Context) CpupoolFindByName(name string) (info CpupoolInfo, found bool) { + plist := Ctx.ListCpupool() + + for i := range plist { + if plist[i].PoolName == name { + found = true + info = plist[i] + return + } + } + return +} + +func XlTest(Args []string) { + var Ctx Context + + err := Ctx.Open() + if err != nil { + fmt.Printf("Opening context: %v\n", err) + return + } + + pool, found := Ctx.CpupoolFindByName("schedbench") + + if found { + fmt.Printf("%v\n", pool) + + a := int(pool.Scheduler) + b := pool.Scheduler.String() + c, err := SchedulerFromString(b) + + if err != nil { + fmt.Printf("Error: %v\n", err) + } + + fmt.Printf("a: %d b: %s c: %d\n", a, b, int(c)) + } else { + fmt.Printf("schedbench not found") + } + + pool, found = Ctx.CpupoolFindByName("schedbnch") + + if found { + fmt.Printf("%v\n", pool) + } else { + fmt.Printf("schedbnch not found") + } + + Ctx.Close() +} diff --git a/main.go b/main.go index 059a54a..2f68969 100644 --- a/main.go +++ b/main.go @@ -104,6 +104,11 @@ func main() { os.Exit(1) } Args = Args[1:] + + case "xltest": + XlTest(Args) + Args = nil + default: fmt.Println("Unknown argument: ", Args[0]) os.Exit(1) diff --git a/xenworker_dummy.go b/xenworker_dummy.go index 02e90ce..e2dbdae 100644 --- a/xenworker_dummy.go +++ b/xenworker_dummy.go @@ -26,6 +26,10 @@ import ( type XenWorker struct { } +func XlTest(Args []string) { + return +} + func (w *XenWorker) SetId(i WorkerId) { } -- 2.7.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |