* [PATCH] tools: remove unused wrappers for python
@ 2015-10-06 10:46 Juergen Gross
2015-10-06 11:18 ` Wei Liu
0 siblings, 1 reply; 31+ messages in thread
From: Juergen Gross @ 2015-10-06 10:46 UTC (permalink / raw)
To: xen-devel, Ian.Campbell, ian.jackson, stefano.stabellini,
wei.liu2
Cc: Juergen Gross
Remove lots of functions in tools/python/xen/lowlevel/xc/xc.c as they
are not used anywhere in the tree. In fact only one function is still
being used from pygrub, namely "xeninfo". All other users seem to have
gone with nuking xm/xend.
Signed-off-by: Juergen Gross <jgross@suse.com>
---
tools/python/xen/lowlevel/xc/xc.c | 2882 +------------------------------------
1 file changed, 76 insertions(+), 2806 deletions(-)
diff --git a/tools/python/xen/lowlevel/xc/xc.c b/tools/python/xen/lowlevel/xc/xc.c
index 67afed4..c799caf 100644
--- a/tools/python/xen/lowlevel/xc/xc.c
+++ b/tools/python/xen/lowlevel/xc/xc.c
@@ -6,2546 +6,116 @@
#include <Python.h>
#include <xenctrl.h>
-#include <xenguest.h>
-#include <zlib.h>
-#include <fcntl.h>
-#include <netinet/in.h>
-#include <netinet/tcp.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/mman.h>
-#include <netdb.h>
-#include <arpa/inet.h>
-#include "xenctrl.h"
-#include <xen/elfnote.h>
-#include <xen/tmem.h>
-#include "xc_dom.h"
-#include <xen/hvm/hvm_info_table.h>
-#include <xen/hvm/params.h>
-
-#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
-
-/* Needed for Python versions earlier than 2.3. */
-#ifndef PyMODINIT_FUNC
-#define PyMODINIT_FUNC DL_EXPORT(void)
-#endif
-
-#define PKG "xen.lowlevel.xc"
-#define CLS "xc"
-
-#define FLASK_CTX_LEN 1024
-
-static PyObject *xc_error_obj, *zero;
-
-typedef struct {
- PyObject_HEAD;
- xc_interface *xc_handle;
-} XcObject;
-
-
-static PyObject *dom_op(XcObject *self, PyObject *args,
- int (*fn)(xc_interface *, uint32_t));
-
-static PyObject *pyxc_error_to_exception(xc_interface *xch)
-{
- PyObject *pyerr;
- static xc_error err_buf;
- const char *desc;
- const xc_error *err;
-
- if (xch) {
- err = xc_get_last_error(xch);
- } else {
- snprintf(err_buf.message, sizeof(err_buf.message),
- "xc_interface_open failed: %s",
- strerror(errno));
- err_buf.code = XC_INTERNAL_ERROR;
- err = &err_buf;
- }
-
- desc = xc_error_code_to_desc(err->code);
-
- if ( err->code == XC_ERROR_NONE )
- return PyErr_SetFromErrno(xc_error_obj);
-
- if ( err->message[0] != '\0' )
- pyerr = Py_BuildValue("(iss)", err->code, desc, err->message);
- else
- pyerr = Py_BuildValue("(is)", err->code, desc);
-
- if (xch)
- xc_clear_last_error(xch);
-
- if ( pyerr != NULL )
- {
- PyErr_SetObject(xc_error_obj, pyerr);
- Py_DECREF(pyerr);
- }
-
- return NULL;
-}
-
-static PyObject *pyxc_domain_dumpcore(XcObject *self, PyObject *args)
-{
- uint32_t dom;
- char *corefile;
-
- if ( !PyArg_ParseTuple(args, "is", &dom, &corefile) )
- return NULL;
-
- if ( (corefile == NULL) || (corefile[0] == '\0') )
- return NULL;
-
- if ( xc_domain_dumpcore(self->xc_handle, dom, corefile) != 0 )
- return pyxc_error_to_exception(self->xc_handle);
-
- Py_INCREF(zero);
- return zero;
-}
-
-static PyObject *pyxc_domain_create(XcObject *self,
- PyObject *args,
- PyObject *kwds)
-{
- uint32_t dom = 0, ssidref = 0, flags = 0, target = 0;
- int ret, i;
- PyObject *pyhandle = NULL;
- xen_domain_handle_t handle = {
- 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef,
- 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef };
-
- static char *kwd_list[] = { "domid", "ssidref", "handle", "flags", "target", NULL };
-
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "|iiOii", kwd_list,
- &dom, &ssidref, &pyhandle, &flags, &target))
- return NULL;
- if ( pyhandle != NULL )
- {
- if ( !PyList_Check(pyhandle) ||
- (PyList_Size(pyhandle) != sizeof(xen_domain_handle_t)) )
- goto out_exception;
-
- for ( i = 0; i < sizeof(xen_domain_handle_t); i++ )
- {
- PyObject *p = PyList_GetItem(pyhandle, i);
- if ( !PyInt_Check(p) )
- goto out_exception;
- handle[i] = (uint8_t)PyInt_AsLong(p);
- }
- }
-
- if ( (ret = xc_domain_create(self->xc_handle, ssidref,
- handle, flags, &dom)) < 0 )
- return pyxc_error_to_exception(self->xc_handle);
-
- if ( target )
- if ( (ret = xc_domain_set_target(self->xc_handle, dom, target)) < 0 )
- return pyxc_error_to_exception(self->xc_handle);
-
-
- return PyInt_FromLong(dom);
-
-out_exception:
- errno = EINVAL;
- PyErr_SetFromErrno(xc_error_obj);
- return NULL;
-}
-
-static PyObject *pyxc_domain_max_vcpus(XcObject *self, PyObject *args)
-{
- uint32_t dom, max;
-
- if (!PyArg_ParseTuple(args, "ii", &dom, &max))
- return NULL;
-
- if (xc_domain_max_vcpus(self->xc_handle, dom, max) != 0)
- return pyxc_error_to_exception(self->xc_handle);
-
- Py_INCREF(zero);
- return zero;
-}
-
-static PyObject *pyxc_domain_pause(XcObject *self, PyObject *args)
-{
- return dom_op(self, args, xc_domain_pause);
-}
-
-static PyObject *pyxc_domain_unpause(XcObject *self, PyObject *args)
-{
- return dom_op(self, args, xc_domain_unpause);
-}
-
-static PyObject *pyxc_domain_destroy_hook(XcObject *self, PyObject *args)
-{
- Py_INCREF(zero);
- return zero;
-}
-
-static PyObject *pyxc_domain_destroy(XcObject *self, PyObject *args)
-{
- return dom_op(self, args, xc_domain_destroy);
-}
-
-static PyObject *pyxc_domain_shutdown(XcObject *self, PyObject *args)
-{
- uint32_t dom, reason;
-
- if ( !PyArg_ParseTuple(args, "ii", &dom, &reason) )
- return NULL;
-
- if ( xc_domain_shutdown(self->xc_handle, dom, reason) != 0 )
- return pyxc_error_to_exception(self->xc_handle);
-
- Py_INCREF(zero);
- return zero;
-}
-
-static PyObject *pyxc_domain_resume(XcObject *self, PyObject *args)
-{
- uint32_t dom;
- int fast;
-
- if ( !PyArg_ParseTuple(args, "ii", &dom, &fast) )
- return NULL;
-
- if ( xc_domain_resume(self->xc_handle, dom, fast) != 0 )
- return pyxc_error_to_exception(self->xc_handle);
-
- Py_INCREF(zero);
- return zero;
-}
-
-static PyObject *pyxc_vcpu_setaffinity(XcObject *self,
- PyObject *args,
- PyObject *kwds)
-{
- uint32_t dom;
- int vcpu = 0, i;
- xc_cpumap_t cpumap;
- PyObject *cpulist = NULL;
- int nr_cpus;
-
- static char *kwd_list[] = { "domid", "vcpu", "cpumap", NULL };
-
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "i|iO", kwd_list,
- &dom, &vcpu, &cpulist) )
- return NULL;
-
- nr_cpus = xc_get_max_cpus(self->xc_handle);
- if ( nr_cpus < 0 )
- return pyxc_error_to_exception(self->xc_handle);
-
- cpumap = xc_cpumap_alloc(self->xc_handle);
- if(cpumap == NULL)
- return pyxc_error_to_exception(self->xc_handle);
-
- if ( (cpulist != NULL) && PyList_Check(cpulist) )
- {
- for ( i = 0; i < PyList_Size(cpulist); i++ )
- {
- long cpu = PyInt_AsLong(PyList_GetItem(cpulist, i));
- if ( cpu < 0 || cpu >= nr_cpus )
- {
- free(cpumap);
- errno = EINVAL;
- PyErr_SetFromErrno(xc_error_obj);
- return NULL;
- }
- cpumap[cpu / 8] |= 1 << (cpu % 8);
- }
- }
-
- if ( xc_vcpu_setaffinity(self->xc_handle, dom, vcpu, cpumap,
- NULL, XEN_VCPUAFFINITY_HARD) != 0 )
- {
- free(cpumap);
- return pyxc_error_to_exception(self->xc_handle);
- }
- Py_INCREF(zero);
- free(cpumap);
- return zero;
-}
-
-static PyObject *pyxc_domain_sethandle(XcObject *self, PyObject *args)
-{
- int i;
- uint32_t dom;
- PyObject *pyhandle;
- xen_domain_handle_t handle;
-
- if (!PyArg_ParseTuple(args, "iO", &dom, &pyhandle))
- return NULL;
-
- if ( !PyList_Check(pyhandle) ||
- (PyList_Size(pyhandle) != sizeof(xen_domain_handle_t)) )
- {
- goto out_exception;
- }
-
- for ( i = 0; i < sizeof(xen_domain_handle_t); i++ )
- {
- PyObject *p = PyList_GetItem(pyhandle, i);
- if ( !PyInt_Check(p) )
- goto out_exception;
- handle[i] = (uint8_t)PyInt_AsLong(p);
- }
-
- if (xc_domain_sethandle(self->xc_handle, dom, handle) < 0)
- return pyxc_error_to_exception(self->xc_handle);
-
- Py_INCREF(zero);
- return zero;
-
-out_exception:
- PyErr_SetFromErrno(xc_error_obj);
- return NULL;
-}
-
-
-static PyObject *pyxc_domain_getinfo(XcObject *self,
- PyObject *args,
- PyObject *kwds)
-{
- PyObject *list, *info_dict, *pyhandle;
-
- uint32_t first_dom = 0;
- int max_doms = 1024, nr_doms, i, j;
- xc_dominfo_t *info;
-
- static char *kwd_list[] = { "first_dom", "max_doms", NULL };
-
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "|ii", kwd_list,
- &first_dom, &max_doms) )
- return NULL;
-
- info = calloc(max_doms, sizeof(xc_dominfo_t));
- if (info == NULL)
- return PyErr_NoMemory();
-
- nr_doms = xc_domain_getinfo(self->xc_handle, first_dom, max_doms, info);
-
- if (nr_doms < 0)
- {
- free(info);
- return pyxc_error_to_exception(self->xc_handle);
- }
-
- list = PyList_New(nr_doms);
- for ( i = 0 ; i < nr_doms; i++ )
- {
- info_dict = Py_BuildValue(
- "{s:i,s:i,s:i,s:i,s:i,s:i,s:i,s:i,s:i,s:i"
- ",s:L,s:L,s:L,s:i,s:i,s:i}",
- "domid", (int)info[i].domid,
- "online_vcpus", info[i].nr_online_vcpus,
- "max_vcpu_id", info[i].max_vcpu_id,
- "hvm", info[i].hvm,
- "dying", info[i].dying,
- "crashed", info[i].crashed,
- "shutdown", info[i].shutdown,
- "paused", info[i].paused,
- "blocked", info[i].blocked,
- "running", info[i].running,
- "mem_kb", (long long)info[i].nr_pages*(XC_PAGE_SIZE/1024),
- "cpu_time", (long long)info[i].cpu_time,
- "maxmem_kb", (long long)info[i].max_memkb,
- "ssidref", (int)info[i].ssidref,
- "shutdown_reason", info[i].shutdown_reason,
- "cpupool", (int)info[i].cpupool);
- pyhandle = PyList_New(sizeof(xen_domain_handle_t));
- if ( (pyhandle == NULL) || (info_dict == NULL) )
- {
- Py_DECREF(list);
- if ( pyhandle != NULL ) { Py_DECREF(pyhandle); }
- if ( info_dict != NULL ) { Py_DECREF(info_dict); }
- free(info);
- return NULL;
- }
- for ( j = 0; j < sizeof(xen_domain_handle_t); j++ )
- PyList_SetItem(pyhandle, j, PyInt_FromLong(info[i].handle[j]));
- PyDict_SetItemString(info_dict, "handle", pyhandle);
- Py_DECREF(pyhandle);
- PyList_SetItem(list, i, info_dict);
- }
-
- free(info);
-
- return list;
-}
-
-static PyObject *pyxc_vcpu_getinfo(XcObject *self,
- PyObject *args,
- PyObject *kwds)
-{
- PyObject *info_dict, *cpulist;
-
- uint32_t dom, vcpu = 0;
- xc_vcpuinfo_t info;
- int rc, i;
- xc_cpumap_t cpumap;
- int nr_cpus;
-
- static char *kwd_list[] = { "domid", "vcpu", NULL };
-
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "i|i", kwd_list,
- &dom, &vcpu) )
- return NULL;
-
- nr_cpus = xc_get_max_cpus(self->xc_handle);
- if ( nr_cpus < 0 )
- return pyxc_error_to_exception(self->xc_handle);
-
- rc = xc_vcpu_getinfo(self->xc_handle, dom, vcpu, &info);
- if ( rc < 0 )
- return pyxc_error_to_exception(self->xc_handle);
-
- cpumap = xc_cpumap_alloc(self->xc_handle);
- if(cpumap == NULL)
- return pyxc_error_to_exception(self->xc_handle);
-
- rc = xc_vcpu_getaffinity(self->xc_handle, dom, vcpu, cpumap,
- NULL, XEN_VCPUAFFINITY_HARD);
- if ( rc < 0 )
- {
- free(cpumap);
- return pyxc_error_to_exception(self->xc_handle);
- }
-
- info_dict = Py_BuildValue("{s:i,s:i,s:i,s:L,s:i}",
- "online", info.online,
- "blocked", info.blocked,
- "running", info.running,
- "cpu_time", info.cpu_time,
- "cpu", info.cpu);
- cpulist = PyList_New(0);
- for ( i = 0; i < nr_cpus; i++ )
- {
- if (*(cpumap + i / 8) & 1 ) {
- PyObject *pyint = PyInt_FromLong(i);
- PyList_Append(cpulist, pyint);
- Py_DECREF(pyint);
- }
- cpumap[i / 8] >>= 1;
- }
- PyDict_SetItemString(info_dict, "cpumap", cpulist);
- Py_DECREF(cpulist);
- free(cpumap);
- return info_dict;
-}
-
-static PyObject *pyxc_getBitSize(XcObject *self,
- PyObject *args,
- PyObject *kwds)
-{
- PyObject *info_type;
- char *image = NULL, *cmdline = "", *features = NULL;
- int type = 0;
- static char *kwd_list[] = { "image", "cmdline", "features", NULL };
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "sss", kwd_list,
- &image, &cmdline, &features) )
- return NULL;
-
- xc_get_bit_size(self->xc_handle, image, cmdline, features, &type);
- if (type < 0)
- return pyxc_error_to_exception(self->xc_handle);
- info_type = Py_BuildValue("{s:i}",
- "type", type);
- return info_type;
-}
-
-static PyObject *pyxc_linux_build(XcObject *self,
- PyObject *args,
- PyObject *kwds)
-{
- uint32_t domid;
- struct xc_dom_image *dom;
- char *image, *ramdisk = NULL, *cmdline = "", *features = NULL;
- int flags = 0;
- int store_evtchn, console_evtchn;
- int superpages = 0;
- unsigned int mem_mb;
- unsigned long store_mfn = 0;
- unsigned long console_mfn = 0;
- PyObject* elfnote_dict;
- PyObject* elfnote = NULL;
- PyObject* ret;
- int i;
-
- static char *kwd_list[] = { "domid", "store_evtchn", "memsize",
- "console_evtchn", "image",
- /* optional */
- "ramdisk", "cmdline", "flags",
- "features", "superpages", NULL };
-
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iiiis|ssisi", kwd_list,
- &domid, &store_evtchn, &mem_mb,
- &console_evtchn, &image,
- /* optional */
- &ramdisk, &cmdline, &flags,
- &features, &superpages) )
- return NULL;
-
- xc_dom_loginit(self->xc_handle);
- if (!(dom = xc_dom_allocate(self->xc_handle, cmdline, features)))
- return pyxc_error_to_exception(self->xc_handle);
-
- dom->superpages = superpages;
-
- if ( xc_dom_linux_build(self->xc_handle, dom, domid, mem_mb, image,
- ramdisk, flags, store_evtchn, &store_mfn,
- console_evtchn, &console_mfn) != 0 ) {
- goto out;
- }
-
- if ( !(elfnote_dict = PyDict_New()) )
- goto out;
-
- for ( i = 0; i < ARRAY_SIZE(dom->parms.elf_notes); i++ )
- {
- switch ( dom->parms.elf_notes[i].type )
- {
- case XEN_ENT_NONE:
- continue;
- case XEN_ENT_LONG:
- elfnote = Py_BuildValue("k", dom->parms.elf_notes[i].data.num);
- break;
- case XEN_ENT_STR:
- elfnote = Py_BuildValue("s", dom->parms.elf_notes[i].data.str);
- break;
- }
- PyDict_SetItemString(elfnote_dict,
- dom->parms.elf_notes[i].name,
- elfnote);
- Py_DECREF(elfnote);
- }
-
- ret = Py_BuildValue("{s:i,s:i,s:N}",
- "store_mfn", store_mfn,
- "console_mfn", console_mfn,
- "notes", elfnote_dict);
-
- if ( dom->arch_hooks->native_protocol )
- {
- PyObject *native_protocol =
- Py_BuildValue("s", dom->arch_hooks->native_protocol);
- PyDict_SetItemString(ret, "native_protocol", native_protocol);
- Py_DECREF(native_protocol);
- }
-
- xc_dom_release(dom);
-
- return ret;
-
- out:
- xc_dom_release(dom);
- return pyxc_error_to_exception(self->xc_handle);
-}
-
-static PyObject *pyxc_hvm_param_get(XcObject *self,
- PyObject *args,
- PyObject *kwds)
-{
- uint32_t dom;
- int param;
- uint64_t value;
-
- static char *kwd_list[] = { "domid", "param", NULL };
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "ii", kwd_list,
- &dom, ¶m) )
- return NULL;
-
- if ( xc_hvm_param_get(self->xc_handle, dom, param, &value) != 0 )
- return pyxc_error_to_exception(self->xc_handle);
-
- return PyLong_FromUnsignedLongLong(value);
-
-}
-
-static PyObject *pyxc_hvm_param_set(XcObject *self,
- PyObject *args,
- PyObject *kwds)
-{
- uint32_t dom;
- int param;
- uint64_t value;
-
- static char *kwd_list[] = { "domid", "param", "value", NULL };
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iiL", kwd_list,
- &dom, ¶m, &value) )
- return NULL;
-
- if ( xc_hvm_param_set(self->xc_handle, dom, param, value) != 0 )
- return pyxc_error_to_exception(self->xc_handle);
-
- Py_INCREF(zero);
- return zero;
-}
-
-static int token_value(char *token)
-{
- token = strchr(token, 'x') + 1;
- return strtol(token, NULL, 16);
-}
-
-static int next_bdf(char **str, int *seg, int *bus, int *dev, int *func)
-{
- char *token;
-
- if ( !(*str) || !strchr(*str, ',') )
- return 0;
-
- token = *str;
- *seg = token_value(token);
- token = strchr(token, ',') + 1;
- *bus = token_value(token);
- token = strchr(token, ',') + 1;
- *dev = token_value(token);
- token = strchr(token, ',') + 1;
- *func = token_value(token);
- token = strchr(token, ',');
- *str = token ? token + 1 : NULL;
-
- return 1;
-}
-
-static PyObject *pyxc_test_assign_device(XcObject *self,
- PyObject *args,
- PyObject *kwds)
-{
- uint32_t dom;
- char *pci_str;
- int32_t sbdf = 0;
- int seg, bus, dev, func;
-
- static char *kwd_list[] = { "domid", "pci", NULL };
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "is", kwd_list,
- &dom, &pci_str) )
- return NULL;
-
- while ( next_bdf(&pci_str, &seg, &bus, &dev, &func) )
- {
- sbdf = seg << 16;
- sbdf |= (bus & 0xff) << 8;
- sbdf |= (dev & 0x1f) << 3;
- sbdf |= (func & 0x7);
-
- if ( xc_test_assign_device(self->xc_handle, dom, sbdf) != 0 )
- {
- if (errno == ENOSYS)
- sbdf = -1;
- break;
- }
- sbdf = 0;
- }
-
- return Py_BuildValue("i", sbdf);
-}
-
-static PyObject *pyxc_assign_device(XcObject *self,
- PyObject *args,
- PyObject *kwds)
-{
- uint32_t dom;
- char *pci_str;
- int32_t sbdf = 0;
- int seg, bus, dev, func;
-
- static char *kwd_list[] = { "domid", "pci", NULL };
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "is", kwd_list,
- &dom, &pci_str) )
- return NULL;
-
- while ( next_bdf(&pci_str, &seg, &bus, &dev, &func) )
- {
- sbdf = seg << 16;
- sbdf |= (bus & 0xff) << 8;
- sbdf |= (dev & 0x1f) << 3;
- sbdf |= (func & 0x7);
-
- if ( xc_assign_device(self->xc_handle, dom, sbdf, 0) != 0 )
- {
- if (errno == ENOSYS)
- sbdf = -1;
- break;
- }
- sbdf = 0;
- }
-
- return Py_BuildValue("i", sbdf);
-}
-
-static PyObject *pyxc_deassign_device(XcObject *self,
- PyObject *args,
- PyObject *kwds)
-{
- uint32_t dom;
- char *pci_str;
- int32_t sbdf = 0;
- int seg, bus, dev, func;
-
- static char *kwd_list[] = { "domid", "pci", NULL };
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "is", kwd_list,
- &dom, &pci_str) )
- return NULL;
-
- while ( next_bdf(&pci_str, &seg, &bus, &dev, &func) )
- {
- sbdf = seg << 16;
- sbdf |= (bus & 0xff) << 8;
- sbdf |= (dev & 0x1f) << 3;
- sbdf |= (func & 0x7);
-
- if ( xc_deassign_device(self->xc_handle, dom, sbdf) != 0 )
- {
- if (errno == ENOSYS)
- sbdf = -1;
- break;
- }
- sbdf = 0;
- }
-
- return Py_BuildValue("i", sbdf);
-}
-
-static PyObject *pyxc_get_device_group(XcObject *self,
- PyObject *args)
-{
- uint32_t sbdf;
- uint32_t max_sdevs, num_sdevs;
- int domid, seg, bus, dev, func, rc, i;
- PyObject *Pystr;
- char *group_str;
- char dev_str[9];
- uint32_t *sdev_array;
-
- if ( !PyArg_ParseTuple(args, "iiiii", &domid, &seg, &bus, &dev, &func) )
- return NULL;
-
- /* Maximum allowed siblings device number per group */
- max_sdevs = 1024;
-
- sdev_array = calloc(max_sdevs, sizeof(*sdev_array));
- if (sdev_array == NULL)
- return PyErr_NoMemory();
-
- sbdf = seg << 16;
- sbdf |= (bus & 0xff) << 8;
- sbdf |= (dev & 0x1f) << 3;
- sbdf |= (func & 0x7);
-
- rc = xc_get_device_group(self->xc_handle,
- domid, sbdf, max_sdevs, &num_sdevs, sdev_array);
-
- if ( rc < 0 )
- {
- free(sdev_array);
- return pyxc_error_to_exception(self->xc_handle);
- }
-
- if ( !num_sdevs )
- {
- free(sdev_array);
- return Py_BuildValue("s", "");
- }
-
- group_str = calloc(num_sdevs, sizeof(dev_str));
- if (group_str == NULL)
- {
- free(sdev_array);
- return PyErr_NoMemory();
- }
-
- for ( i = 0; i < num_sdevs; i++ )
- {
- bus = (sdev_array[i] >> 16) & 0xff;
- dev = (sdev_array[i] >> 11) & 0x1f;
- func = (sdev_array[i] >> 8) & 0x7;
- snprintf(dev_str, sizeof(dev_str), "%02x:%02x.%x,", bus, dev, func);
- strcat(group_str, dev_str);
- }
-
- Pystr = Py_BuildValue("s", group_str);
-
- free(sdev_array);
- free(group_str);
-
- return Pystr;
-}
-
-#if defined(__i386__) || defined(__x86_64__)
-static void pyxc_dom_extract_cpuid(PyObject *config,
- char **regs)
-{
- const char *regs_extract[4] = { "eax", "ebx", "ecx", "edx" };
- PyObject *obj;
- int i;
-
- memset(regs, 0, 4*sizeof(*regs));
-
- if ( !PyDict_Check(config) )
- return;
-
- for ( i = 0; i < 4; i++ )
- if ( (obj = PyDict_GetItemString(config, regs_extract[i])) != NULL )
- regs[i] = PyString_AS_STRING(obj);
-}
-
-static PyObject *pyxc_create_cpuid_dict(char **regs)
-{
- const char *regs_extract[4] = { "eax", "ebx", "ecx", "edx" };
- PyObject *dict;
- int i;
-
- dict = PyDict_New();
- for ( i = 0; i < 4; i++ )
- {
- if ( regs[i] == NULL )
- continue;
- PyDict_SetItemString(dict, regs_extract[i],
- PyString_FromString(regs[i]));
- free(regs[i]);
- regs[i] = NULL;
- }
- return dict;
-}
-
-static PyObject *pyxc_dom_check_cpuid(XcObject *self,
- PyObject *args)
-{
- PyObject *sub_input, *config;
- unsigned int input[2];
- char *regs[4], *regs_transform[4];
-
- if ( !PyArg_ParseTuple(args, "iOO", &input[0], &sub_input, &config) )
- return NULL;
-
- pyxc_dom_extract_cpuid(config, regs);
-
- input[1] = XEN_CPUID_INPUT_UNUSED;
- if ( PyLong_Check(sub_input) )
- input[1] = PyLong_AsUnsignedLong(sub_input);
-
- if ( xc_cpuid_check(self->xc_handle, input,
- (const char **)regs, regs_transform) )
- return pyxc_error_to_exception(self->xc_handle);
-
- return pyxc_create_cpuid_dict(regs_transform);
-}
-
-static PyObject *pyxc_dom_set_policy_cpuid(XcObject *self,
- PyObject *args)
-{
- int domid;
-
- if ( !PyArg_ParseTuple(args, "i", &domid) )
- return NULL;
-
- if ( xc_cpuid_apply_policy(self->xc_handle, domid) )
- return pyxc_error_to_exception(self->xc_handle);
-
- Py_INCREF(zero);
- return zero;
-}
-
-
-static PyObject *pyxc_dom_set_cpuid(XcObject *self,
- PyObject *args)
-{
- PyObject *sub_input, *config;
- unsigned int domid, input[2];
- char *regs[4], *regs_transform[4];
-
- if ( !PyArg_ParseTuple(args, "IIOO", &domid,
- &input[0], &sub_input, &config) )
- return NULL;
-
- pyxc_dom_extract_cpuid(config, regs);
-
- input[1] = XEN_CPUID_INPUT_UNUSED;
- if ( PyLong_Check(sub_input) )
- input[1] = PyLong_AsUnsignedLong(sub_input);
-
- if ( xc_cpuid_set(self->xc_handle, domid, input, (const char **)regs,
- regs_transform) )
- return pyxc_error_to_exception(self->xc_handle);
-
- return pyxc_create_cpuid_dict(regs_transform);
-}
-
-static PyObject *pyxc_dom_set_machine_address_size(XcObject *self,
- PyObject *args,
- PyObject *kwds)
-{
- uint32_t dom, width;
-
- if (!PyArg_ParseTuple(args, "ii", &dom, &width))
- return NULL;
-
- if (xc_domain_set_machine_address_size(self->xc_handle, dom, width) != 0)
- return pyxc_error_to_exception(self->xc_handle);
-
- Py_INCREF(zero);
- return zero;
-}
-
-static PyObject *pyxc_dom_suppress_spurious_page_faults(XcObject *self,
- PyObject *args,
- PyObject *kwds)
-{
- uint32_t dom;
-
- if (!PyArg_ParseTuple(args, "i", &dom))
- return NULL;
-
- if (xc_domain_suppress_spurious_page_faults(self->xc_handle, dom) != 0)
- return pyxc_error_to_exception(self->xc_handle);
-
- Py_INCREF(zero);
- return zero;
-}
-#endif /* __i386__ || __x86_64__ */
-
-static PyObject *pyxc_hvm_build(XcObject *self,
- PyObject *args,
- PyObject *kwds)
-{
- uint32_t dom;
- struct hvm_info_table *va_hvm;
- uint8_t *va_map, sum;
- int i;
- char *image;
- int memsize, target=-1, vcpus = 1, acpi = 0, apic = 1;
- PyObject *vcpu_avail_handle = NULL;
- uint8_t vcpu_avail[(HVM_MAX_VCPUS + 7)/8];
-
- static char *kwd_list[] = { "domid",
- "memsize", "image", "target", "vcpus",
- "vcpu_avail", "acpi", "apic", NULL };
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iis|iiOii", kwd_list,
- &dom, &memsize, &image, &target, &vcpus,
- &vcpu_avail_handle, &acpi, &apic) )
- return NULL;
-
- memset(vcpu_avail, 0, sizeof(vcpu_avail));
- vcpu_avail[0] = 1;
- if ( vcpu_avail_handle != NULL )
- {
- if ( PyInt_Check(vcpu_avail_handle) )
- {
- unsigned long v = PyInt_AsLong(vcpu_avail_handle);
- for ( i = 0; i < sizeof(long); i++ )
- vcpu_avail[i] = (uint8_t)(v>>(i*8));
- }
- else if ( PyLong_Check(vcpu_avail_handle) )
- {
- if ( _PyLong_AsByteArray((PyLongObject *)vcpu_avail_handle,
- (unsigned char *)vcpu_avail,
- sizeof(vcpu_avail), 1, 0) )
- return NULL;
- }
- else
- {
- errno = EINVAL;
- PyErr_SetFromErrno(xc_error_obj);
- return NULL;
- }
- }
-
- if ( target == -1 )
- target = memsize;
-
- if ( xc_hvm_build_target_mem(self->xc_handle, dom, memsize,
- target, image) != 0 )
- return pyxc_error_to_exception(self->xc_handle);
-
- /* Fix up the HVM info table. */
- va_map = xc_map_foreign_range(self->xc_handle, dom, XC_PAGE_SIZE,
- PROT_READ | PROT_WRITE,
- HVM_INFO_PFN);
- if ( va_map == NULL )
- return PyErr_SetFromErrno(xc_error_obj);
- va_hvm = (struct hvm_info_table *)(va_map + HVM_INFO_OFFSET);
- va_hvm->apic_mode = apic;
- va_hvm->nr_vcpus = vcpus;
- memcpy(va_hvm->vcpu_online, vcpu_avail, sizeof(vcpu_avail));
- for ( i = 0, sum = 0; i < va_hvm->length; i++ )
- sum += ((uint8_t *)va_hvm)[i];
- va_hvm->checksum -= sum;
- munmap(va_map, XC_PAGE_SIZE);
-
- return Py_BuildValue("{}");
-}
-
-static PyObject *pyxc_gnttab_hvm_seed(XcObject *self,
- PyObject *args,
- PyObject *kwds)
-{
- uint32_t dom, console_domid, xenstore_domid;
- unsigned long xenstore_gmfn = 0;
- unsigned long console_gmfn = 0;
- static char *kwd_list[] = { "domid",
- "console_gmfn", "xenstore_gmfn",
- "console_domid", "xenstore_domid", NULL };
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iiiii", kwd_list,
- &dom,
- &console_gmfn, &xenstore_gmfn,
- &console_domid, &xenstore_domid) )
- return NULL;
-
- if ( xc_dom_gnttab_hvm_seed(self->xc_handle, dom,
- console_gmfn, xenstore_gmfn,
- console_domid, xenstore_domid) != 0 )
- return pyxc_error_to_exception(self->xc_handle);
-
- return Py_None;
-}
-
-static PyObject *pyxc_evtchn_alloc_unbound(XcObject *self,
- PyObject *args,
- PyObject *kwds)
-{
- uint32_t dom, remote_dom;
- int port;
-
- static char *kwd_list[] = { "domid", "remote_dom", NULL };
-
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "ii", kwd_list,
- &dom, &remote_dom) )
- return NULL;
-
- if ( (port = xc_evtchn_alloc_unbound(self->xc_handle, dom, remote_dom)) < 0 )
- return pyxc_error_to_exception(self->xc_handle);
-
- return PyInt_FromLong(port);
-}
-
-static PyObject *pyxc_evtchn_reset(XcObject *self,
- PyObject *args,
- PyObject *kwds)
-{
- uint32_t dom;
-
- static char *kwd_list[] = { "dom", NULL };
-
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "i", kwd_list, &dom) )
- return NULL;
-
- if ( xc_evtchn_reset(self->xc_handle, dom) < 0 )
- return pyxc_error_to_exception(self->xc_handle);
-
- Py_INCREF(zero);
- return zero;
-}
-
-static PyObject *pyxc_physdev_map_pirq(PyObject *self,
- PyObject *args,
- PyObject *kwds)
-{
- XcObject *xc = (XcObject *)self;
- uint32_t dom;
- int index, pirq, ret;
-
- static char *kwd_list[] = {"domid", "index", "pirq", NULL};
-
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iii", kwd_list,
- &dom, &index, &pirq) )
- return NULL;
- ret = xc_physdev_map_pirq(xc->xc_handle, dom, index, &pirq);
- if ( ret != 0 )
- return pyxc_error_to_exception(xc->xc_handle);
- return PyLong_FromUnsignedLong(pirq);
-}
-
-static PyObject *pyxc_physdev_pci_access_modify(XcObject *self,
- PyObject *args,
- PyObject *kwds)
-{
- uint32_t dom;
- int bus, dev, func, enable, ret;
-
- static char *kwd_list[] = { "domid", "bus", "dev", "func", "enable", NULL };
-
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iiiii", kwd_list,
- &dom, &bus, &dev, &func, &enable) )
- return NULL;
-
- ret = xc_physdev_pci_access_modify(
- self->xc_handle, dom, bus, dev, func, enable);
- if ( ret != 0 )
- return pyxc_error_to_exception(self->xc_handle);
-
- Py_INCREF(zero);
- return zero;
-}
-
-static PyObject *pyxc_readconsolering(XcObject *self,
- PyObject *args,
- PyObject *kwds)
-{
- unsigned int clear = 0, index = 0, incremental = 0;
- unsigned int count = 16384 + 1, size = count;
- char *str, *ptr;
- PyObject *obj;
- int ret;
-
- static char *kwd_list[] = { "clear", "index", "incremental", NULL };
-
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "|iii", kwd_list,
- &clear, &index, &incremental) ||
- !(str = malloc(size)) )
- return NULL;
-
- ret = xc_readconsolering(self->xc_handle, str, &count, clear,
- incremental, &index);
- if ( ret < 0 ) {
- free(str);
- return pyxc_error_to_exception(self->xc_handle);
- }
-
- while ( !incremental && count == size && ret >= 0 )
- {
- size += count - 1;
- if ( size < count )
- break;
-
- ptr = realloc(str, size);
- if ( !ptr )
- break;
-
- str = ptr + count;
- count = size - count;
- ret = xc_readconsolering(self->xc_handle, str, &count, clear,
- 1, &index);
- count += str - ptr;
- str = ptr;
- }
-
- obj = PyString_FromStringAndSize(str, count);
- free(str);
- return obj;
-}
-
-
-static unsigned long pages_to_kib(unsigned long pages)
-{
- return pages * (XC_PAGE_SIZE / 1024);
-}
-
-
-static PyObject *pyxc_pages_to_kib(XcObject *self, PyObject *args)
-{
- unsigned long pages;
-
- if (!PyArg_ParseTuple(args, "l", &pages))
- return NULL;
-
- return PyLong_FromUnsignedLong(pages_to_kib(pages));
-}
-
-static PyObject *pyxc_physinfo(XcObject *self)
-{
- xc_physinfo_t pinfo;
- char cpu_cap[128], virt_caps[128], *p;
- int i;
- const char *virtcap_names[] = { "hvm", "hvm_directio" };
-
- if ( xc_physinfo(self->xc_handle, &pinfo) != 0 )
- return pyxc_error_to_exception(self->xc_handle);
-
- p = cpu_cap;
- *p = '\0';
- for ( i = 0; i < sizeof(pinfo.hw_cap)/4; i++ )
- p += sprintf(p, "%08x:", pinfo.hw_cap[i]);
- *(p-1) = 0;
-
- p = virt_caps;
- *p = '\0';
- for ( i = 0; i < 2; i++ )
- if ( (pinfo.capabilities >> i) & 1 )
- p += sprintf(p, "%s ", virtcap_names[i]);
- if ( p != virt_caps )
- *(p-1) = '\0';
-
- return Py_BuildValue("{s:i,s:i,s:i,s:i,s:l,s:l,s:l,s:i,s:s,s:s}",
- "nr_nodes", pinfo.nr_nodes,
- "threads_per_core", pinfo.threads_per_core,
- "cores_per_socket", pinfo.cores_per_socket,
- "nr_cpus", pinfo.nr_cpus,
- "total_memory", pages_to_kib(pinfo.total_pages),
- "free_memory", pages_to_kib(pinfo.free_pages),
- "scrub_memory", pages_to_kib(pinfo.scrub_pages),
- "cpu_khz", pinfo.cpu_khz,
- "hw_caps", cpu_cap,
- "virt_caps", virt_caps);
-}
-
-static PyObject *pyxc_getcpuinfo(XcObject *self, PyObject *args, PyObject *kwds)
-{
- xc_cpuinfo_t *cpuinfo, *cpuinfo_ptr;
- PyObject *cpuinfo_list_obj, *cpuinfo_obj;
- int max_cpus, nr_cpus, ret, i;
- static char *kwd_list[] = { "max_cpus", NULL };
- static char kwd_type[] = "i";
-
- if(!PyArg_ParseTupleAndKeywords(args, kwds, kwd_type, kwd_list, &max_cpus))
- return NULL;
-
- cpuinfo = malloc(sizeof(xc_cpuinfo_t) * max_cpus);
- if (!cpuinfo)
- return NULL;
-
- ret = xc_getcpuinfo(self->xc_handle, max_cpus, cpuinfo, &nr_cpus);
- if (ret != 0) {
- free(cpuinfo);
- return pyxc_error_to_exception(self->xc_handle);
- }
-
- cpuinfo_list_obj = PyList_New(0);
- cpuinfo_ptr = cpuinfo;
- for (i = 0; i < nr_cpus; i++) {
- cpuinfo_obj = Py_BuildValue("{s:k}", "idletime", cpuinfo_ptr->idletime);
- PyList_Append(cpuinfo_list_obj, cpuinfo_obj);
- Py_DECREF(cpuinfo_obj);
- cpuinfo_ptr++;
- }
-
- free(cpuinfo);
-
- return cpuinfo_list_obj;
-}
-
-static PyObject *pyxc_topologyinfo(XcObject *self)
-{
- xc_cputopo_t *cputopo = NULL;
- unsigned i, num_cpus = 0;
- PyObject *ret_obj = NULL;
- PyObject *cpu_to_core_obj, *cpu_to_socket_obj, *cpu_to_node_obj;
-
- if ( xc_cputopoinfo(self->xc_handle, &num_cpus, NULL) != 0 )
- goto out;
-
- cputopo = calloc(num_cpus, sizeof(*cputopo));
- if ( cputopo == NULL )
- goto out;
-
- if ( xc_cputopoinfo(self->xc_handle, &num_cpus, cputopo) != 0 )
- goto out;
-
- /* Construct cpu-to-* lists. */
- cpu_to_core_obj = PyList_New(0);
- cpu_to_socket_obj = PyList_New(0);
- cpu_to_node_obj = PyList_New(0);
- for ( i = 0; i < num_cpus; i++ )
- {
- if ( cputopo[i].core == XEN_INVALID_CORE_ID )
- {
- PyList_Append(cpu_to_core_obj, Py_None);
- }
- else
- {
- PyObject *pyint = PyInt_FromLong(cputopo[i].core);
- PyList_Append(cpu_to_core_obj, pyint);
- Py_DECREF(pyint);
- }
-
- if ( cputopo[i].socket == XEN_INVALID_SOCKET_ID )
- {
- PyList_Append(cpu_to_socket_obj, Py_None);
- }
- else
- {
- PyObject *pyint = PyInt_FromLong(cputopo[i].socket);
- PyList_Append(cpu_to_socket_obj, pyint);
- Py_DECREF(pyint);
- }
-
- if ( cputopo[i].node == XEN_INVALID_NODE_ID )
- {
- PyList_Append(cpu_to_node_obj, Py_None);
- }
- else
- {
- PyObject *pyint = PyInt_FromLong(cputopo[i].node);
- PyList_Append(cpu_to_node_obj, pyint);
- Py_DECREF(pyint);
- }
- }
-
- ret_obj = Py_BuildValue("{s:i}", "max_cpu_index", num_cpus + 1);
-
- PyDict_SetItemString(ret_obj, "cpu_to_core", cpu_to_core_obj);
- Py_DECREF(cpu_to_core_obj);
-
- PyDict_SetItemString(ret_obj, "cpu_to_socket", cpu_to_socket_obj);
- Py_DECREF(cpu_to_socket_obj);
-
- PyDict_SetItemString(ret_obj, "cpu_to_node", cpu_to_node_obj);
- Py_DECREF(cpu_to_node_obj);
-
-out:
- free(cputopo);
- return ret_obj ? ret_obj : pyxc_error_to_exception(self->xc_handle);
-}
-
-static PyObject *pyxc_numainfo(XcObject *self)
-{
- unsigned i, j, num_nodes = 0;
- uint64_t free_heap;
- PyObject *ret_obj = NULL, *node_to_node_dist_list_obj;
- PyObject *node_to_memsize_obj, *node_to_memfree_obj;
- PyObject *node_to_dma32_mem_obj, *node_to_node_dist_obj;
- xc_meminfo_t *meminfo = NULL;
- uint32_t *distance = NULL;
-
- if ( xc_numainfo(self->xc_handle, &num_nodes, NULL, NULL) != 0 )
- goto out;
-
- meminfo = calloc(num_nodes, sizeof(*meminfo));
- distance = calloc(num_nodes * num_nodes, sizeof(*distance));
- if ( (meminfo == NULL) || (distance == NULL) )
- goto out;
-
- if ( xc_numainfo(self->xc_handle, &num_nodes, meminfo, distance) != 0 )
- goto out;
-
- /* Construct node-to-* lists. */
- node_to_memsize_obj = PyList_New(0);
- node_to_memfree_obj = PyList_New(0);
- node_to_dma32_mem_obj = PyList_New(0);
- node_to_node_dist_list_obj = PyList_New(0);
- for ( i = 0; i < num_nodes; i++ )
- {
- PyObject *pyint;
- unsigned invalid_node;
-
- /* Total Memory */
- pyint = PyInt_FromLong(meminfo[i].memsize >> 20); /* MB */
- PyList_Append(node_to_memsize_obj, pyint);
- Py_DECREF(pyint);
-
- /* Free Memory */
- pyint = PyInt_FromLong(meminfo[i].memfree >> 20); /* MB */
- PyList_Append(node_to_memfree_obj, pyint);
- Py_DECREF(pyint);
-
- /* DMA memory. */
- xc_availheap(self->xc_handle, 0, 32, i, &free_heap);
- pyint = PyInt_FromLong(free_heap >> 20); /* MB */
- PyList_Append(node_to_dma32_mem_obj, pyint);
- Py_DECREF(pyint);
-
- /* Node to Node Distance */
- node_to_node_dist_obj = PyList_New(0);
- invalid_node = (meminfo[i].memsize == XEN_INVALID_MEM_SZ);
- for ( j = 0; j < num_nodes; j++ )
- {
- uint32_t dist = distance[i * num_nodes + j];
- if ( invalid_node || (dist == XEN_INVALID_NODE_DIST) )
- {
- PyList_Append(node_to_node_dist_obj, Py_None);
- }
- else
- {
- pyint = PyInt_FromLong(dist);
- PyList_Append(node_to_node_dist_obj, pyint);
- Py_DECREF(pyint);
- }
- }
- PyList_Append(node_to_node_dist_list_obj, node_to_node_dist_obj);
- Py_DECREF(node_to_node_dist_obj);
- }
-
- ret_obj = Py_BuildValue("{s:i}", "max_node_index", num_nodes + 1);
-
- PyDict_SetItemString(ret_obj, "node_memsize", node_to_memsize_obj);
- Py_DECREF(node_to_memsize_obj);
-
- PyDict_SetItemString(ret_obj, "node_memfree", node_to_memfree_obj);
- Py_DECREF(node_to_memfree_obj);
-
- PyDict_SetItemString(ret_obj, "node_to_dma32_mem", node_to_dma32_mem_obj);
- Py_DECREF(node_to_dma32_mem_obj);
-
- PyDict_SetItemString(ret_obj, "node_to_node_dist",
- node_to_node_dist_list_obj);
- Py_DECREF(node_to_node_dist_list_obj);
-
-out:
- free(meminfo);
- free(distance);
- return ret_obj ? ret_obj : pyxc_error_to_exception(self->xc_handle);
-}
-
-static PyObject *pyxc_xeninfo(XcObject *self)
-{
- xen_extraversion_t xen_extra;
- xen_compile_info_t xen_cc;
- xen_changeset_info_t xen_chgset;
- xen_capabilities_info_t xen_caps;
- xen_platform_parameters_t p_parms;
- xen_commandline_t xen_commandline;
- long xen_version;
- long xen_pagesize;
- char str[128];
-
- xen_version = xc_version(self->xc_handle, XENVER_version, NULL);
-
- if ( xc_version(self->xc_handle, XENVER_extraversion, &xen_extra) != 0 )
- return pyxc_error_to_exception(self->xc_handle);
-
- if ( xc_version(self->xc_handle, XENVER_compile_info, &xen_cc) != 0 )
- return pyxc_error_to_exception(self->xc_handle);
-
- if ( xc_version(self->xc_handle, XENVER_changeset, &xen_chgset) != 0 )
- return pyxc_error_to_exception(self->xc_handle);
-
- if ( xc_version(self->xc_handle, XENVER_capabilities, &xen_caps) != 0 )
- return pyxc_error_to_exception(self->xc_handle);
-
- if ( xc_version(self->xc_handle, XENVER_platform_parameters, &p_parms) != 0 )
- return pyxc_error_to_exception(self->xc_handle);
-
- if ( xc_version(self->xc_handle, XENVER_commandline, &xen_commandline) != 0 )
- return pyxc_error_to_exception(self->xc_handle);
-
- snprintf(str, sizeof(str), "virt_start=0x%"PRI_xen_ulong, p_parms.virt_start);
-
- xen_pagesize = xc_version(self->xc_handle, XENVER_pagesize, NULL);
- if (xen_pagesize < 0 )
- return pyxc_error_to_exception(self->xc_handle);
-
- return Py_BuildValue("{s:i,s:i,s:s,s:s,s:i,s:s,s:s,s:s,s:s,s:s,s:s,s:s}",
- "xen_major", xen_version >> 16,
- "xen_minor", (xen_version & 0xffff),
- "xen_extra", xen_extra,
- "xen_caps", xen_caps,
- "xen_pagesize", xen_pagesize,
- "platform_params", str,
- "xen_changeset", xen_chgset,
- "xen_commandline", xen_commandline,
- "cc_compiler", xen_cc.compiler,
- "cc_compile_by", xen_cc.compile_by,
- "cc_compile_domain", xen_cc.compile_domain,
- "cc_compile_date", xen_cc.compile_date);
-}
-
-static PyObject *pyxc_shadow_control(PyObject *self,
- PyObject *args,
- PyObject *kwds)
-{
- XcObject *xc = (XcObject *)self;
-
- uint32_t dom;
- int op=0;
-
- static char *kwd_list[] = { "dom", "op", NULL };
-
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "i|i", kwd_list,
- &dom, &op) )
- return NULL;
-
- if ( xc_shadow_control(xc->xc_handle, dom, op, NULL, 0, NULL, 0, NULL)
- < 0 )
- return pyxc_error_to_exception(xc->xc_handle);
-
- Py_INCREF(zero);
- return zero;
-}
-
-static PyObject *pyxc_shadow_mem_control(PyObject *self,
- PyObject *args,
- PyObject *kwds)
-{
- XcObject *xc = (XcObject *)self;
- int op;
- uint32_t dom;
- int mbarg = -1;
- unsigned long mb;
-
- static char *kwd_list[] = { "dom", "mb", NULL };
-
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "i|i", kwd_list,
- &dom, &mbarg) )
- return NULL;
-
- if ( mbarg < 0 )
- op = XEN_DOMCTL_SHADOW_OP_GET_ALLOCATION;
- else
- {
- mb = mbarg;
- op = XEN_DOMCTL_SHADOW_OP_SET_ALLOCATION;
- }
- if ( xc_shadow_control(xc->xc_handle, dom, op, NULL, 0, &mb, 0, NULL) < 0 )
- return pyxc_error_to_exception(xc->xc_handle);
-
- mbarg = mb;
- return Py_BuildValue("i", mbarg);
-}
-
-static PyObject *pyxc_sched_id_get(XcObject *self) {
-
- int sched_id;
- if (xc_sched_id(self->xc_handle, &sched_id) != 0)
- return PyErr_SetFromErrno(xc_error_obj);
-
- return Py_BuildValue("i", sched_id);
-}
-
-static PyObject *pyxc_sched_credit_domain_set(XcObject *self,
- PyObject *args,
- PyObject *kwds)
-{
- uint32_t domid;
- uint16_t weight;
- uint16_t cap;
- static char *kwd_list[] = { "domid", "weight", "cap", NULL };
- static char kwd_type[] = "I|HH";
- struct xen_domctl_sched_credit sdom;
-
- weight = 0;
- cap = (uint16_t)~0U;
- if( !PyArg_ParseTupleAndKeywords(args, kwds, kwd_type, kwd_list,
- &domid, &weight, &cap) )
- return NULL;
-
- sdom.weight = weight;
- sdom.cap = cap;
-
- if ( xc_sched_credit_domain_set(self->xc_handle, domid, &sdom) != 0 )
- return pyxc_error_to_exception(self->xc_handle);
-
- Py_INCREF(zero);
- return zero;
-}
-
-static PyObject *pyxc_sched_credit_domain_get(XcObject *self, PyObject *args)
-{
- uint32_t domid;
- struct xen_domctl_sched_credit sdom;
-
- if( !PyArg_ParseTuple(args, "I", &domid) )
- return NULL;
-
- if ( xc_sched_credit_domain_get(self->xc_handle, domid, &sdom) != 0 )
- return pyxc_error_to_exception(self->xc_handle);
-
- return Py_BuildValue("{s:H,s:H}",
- "weight", sdom.weight,
- "cap", sdom.cap);
-}
-
-static PyObject *pyxc_sched_credit2_domain_set(XcObject *self,
- PyObject *args,
- PyObject *kwds)
-{
- uint32_t domid;
- uint16_t weight;
- static char *kwd_list[] = { "domid", "weight", NULL };
- static char kwd_type[] = "I|H";
- struct xen_domctl_sched_credit2 sdom;
-
- weight = 0;
- if( !PyArg_ParseTupleAndKeywords(args, kwds, kwd_type, kwd_list,
- &domid, &weight) )
- return NULL;
-
- sdom.weight = weight;
-
- if ( xc_sched_credit2_domain_set(self->xc_handle, domid, &sdom) != 0 )
- return pyxc_error_to_exception(self->xc_handle);
-
- Py_INCREF(zero);
- return zero;
-}
-
-static PyObject *pyxc_sched_credit2_domain_get(XcObject *self, PyObject *args)
-{
- uint32_t domid;
- struct xen_domctl_sched_credit2 sdom;
-
- if( !PyArg_ParseTuple(args, "I", &domid) )
- return NULL;
-
- if ( xc_sched_credit2_domain_get(self->xc_handle, domid, &sdom) != 0 )
- return pyxc_error_to_exception(self->xc_handle);
-
- return Py_BuildValue("{s:H}",
- "weight", sdom.weight);
-}
-
-static PyObject *pyxc_domain_setmaxmem(XcObject *self, PyObject *args)
-{
- uint32_t dom;
- unsigned int maxmem_kb;
-
- if (!PyArg_ParseTuple(args, "ii", &dom, &maxmem_kb))
- return NULL;
-
- if (xc_domain_setmaxmem(self->xc_handle, dom, maxmem_kb) != 0)
- return pyxc_error_to_exception(self->xc_handle);
-
- Py_INCREF(zero);
- return zero;
-}
-
-static PyObject *pyxc_domain_set_target_mem(XcObject *self, PyObject *args)
-{
- uint32_t dom;
- unsigned int mem_kb, mem_pages;
-
- if (!PyArg_ParseTuple(args, "ii", &dom, &mem_kb))
- return NULL;
-
- mem_pages = mem_kb / 4;
-
- if (xc_domain_set_pod_target(self->xc_handle, dom, mem_pages,
- NULL, NULL, NULL) != 0)
- return pyxc_error_to_exception(self->xc_handle);
-
- Py_INCREF(zero);
- return zero;
-}
-
-static PyObject *pyxc_domain_set_memmap_limit(XcObject *self, PyObject *args)
-{
- uint32_t dom;
- unsigned int maplimit_kb;
-
- if ( !PyArg_ParseTuple(args, "ii", &dom, &maplimit_kb) )
- return NULL;
-
- if ( xc_domain_set_memmap_limit(self->xc_handle, dom, maplimit_kb) != 0 )
- return pyxc_error_to_exception(self->xc_handle);
-
- Py_INCREF(zero);
- return zero;
-}
-
-static PyObject *pyxc_domain_ioport_permission(XcObject *self,
- PyObject *args,
- PyObject *kwds)
-{
- uint32_t dom;
- int first_port, nr_ports, allow_access, ret;
-
- static char *kwd_list[] = { "domid", "first_port", "nr_ports", "allow_access", NULL };
-
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iiii", kwd_list,
- &dom, &first_port, &nr_ports, &allow_access) )
- return NULL;
-
- ret = xc_domain_ioport_permission(
- self->xc_handle, dom, first_port, nr_ports, allow_access);
- if ( ret != 0 )
- return pyxc_error_to_exception(self->xc_handle);
-
- Py_INCREF(zero);
- return zero;
-}
-
-static PyObject *pyxc_domain_irq_permission(PyObject *self,
- PyObject *args,
- PyObject *kwds)
-{
- XcObject *xc = (XcObject *)self;
- uint32_t dom;
- int pirq, allow_access, ret;
-
- static char *kwd_list[] = { "domid", "pirq", "allow_access", NULL };
-
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iii", kwd_list,
- &dom, &pirq, &allow_access) )
- return NULL;
-
- ret = xc_domain_irq_permission(
- xc->xc_handle, dom, pirq, allow_access);
- if ( ret != 0 )
- return pyxc_error_to_exception(xc->xc_handle);
-
- Py_INCREF(zero);
- return zero;
-}
-
-static PyObject *pyxc_domain_iomem_permission(PyObject *self,
- PyObject *args,
- PyObject *kwds)
-{
- XcObject *xc = (XcObject *)self;
- uint32_t dom;
- unsigned long first_pfn, nr_pfns, allow_access, ret;
-
- static char *kwd_list[] = { "domid", "first_pfn", "nr_pfns", "allow_access", NULL };
-
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "illi", kwd_list,
- &dom, &first_pfn, &nr_pfns, &allow_access) )
- return NULL;
-
- ret = xc_domain_iomem_permission(
- xc->xc_handle, dom, first_pfn, nr_pfns, allow_access);
- if ( ret != 0 )
- return pyxc_error_to_exception(xc->xc_handle);
-
- Py_INCREF(zero);
- return zero;
-}
-
-static PyObject *pyxc_domain_set_time_offset(XcObject *self, PyObject *args)
-{
- uint32_t dom;
- int32_t offset;
-
- if (!PyArg_ParseTuple(args, "ii", &dom, &offset))
- return NULL;
-
- if (xc_domain_set_time_offset(self->xc_handle, dom, offset) != 0)
- return pyxc_error_to_exception(self->xc_handle);
-
- Py_INCREF(zero);
- return zero;
-}
-
-static PyObject *pyxc_domain_set_tsc_info(XcObject *self, PyObject *args)
-{
- uint32_t dom, tsc_mode;
-
- if (!PyArg_ParseTuple(args, "ii", &dom, &tsc_mode))
- return NULL;
-
- if (xc_domain_set_tsc_info(self->xc_handle, dom, tsc_mode, 0, 0, 0) != 0)
- return pyxc_error_to_exception(self->xc_handle);
-
- Py_INCREF(zero);
- return zero;
-}
-
-static PyObject *pyxc_domain_disable_migrate(XcObject *self, PyObject *args)
-{
- uint32_t dom;
-
- if (!PyArg_ParseTuple(args, "i", &dom))
- return NULL;
-
- if (xc_domain_disable_migrate(self->xc_handle, dom) != 0)
- return pyxc_error_to_exception(self->xc_handle);
-
- Py_INCREF(zero);
- return zero;
-}
-
-static PyObject *pyxc_domain_send_trigger(XcObject *self,
- PyObject *args,
- PyObject *kwds)
-{
- uint32_t dom;
- int trigger, vcpu = 0;
-
- static char *kwd_list[] = { "domid", "trigger", "vcpu", NULL };
-
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "ii|i", kwd_list,
- &dom, &trigger, &vcpu) )
- return NULL;
-
- if (xc_domain_send_trigger(self->xc_handle, dom, trigger, vcpu) != 0)
- return pyxc_error_to_exception(self->xc_handle);
-
- Py_INCREF(zero);
- return zero;
-}
-
-static PyObject *pyxc_send_debug_keys(XcObject *self,
- PyObject *args,
- PyObject *kwds)
-{
- char *keys;
-
- static char *kwd_list[] = { "keys", NULL };
-
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "s", kwd_list, &keys) )
- return NULL;
-
- if ( xc_send_debug_keys(self->xc_handle, keys) != 0 )
- return pyxc_error_to_exception(self->xc_handle);
-
- Py_INCREF(zero);
- return zero;
-}
-
-static PyObject *dom_op(XcObject *self, PyObject *args,
- int (*fn)(xc_interface*, uint32_t))
-{
- uint32_t dom;
-
- if (!PyArg_ParseTuple(args, "i", &dom))
- return NULL;
-
- if (fn(self->xc_handle, dom) != 0)
- return pyxc_error_to_exception(self->xc_handle);
-
- Py_INCREF(zero);
- return zero;
-}
-
-static PyObject *pyxc_tmem_control(XcObject *self,
- PyObject *args,
- PyObject *kwds)
-{
- int32_t pool_id;
- uint32_t subop;
- uint32_t cli_id;
- uint32_t arg1;
- uint32_t arg2;
- char *buf;
- char _buffer[32768], *buffer = _buffer;
- int rc;
-
- static char *kwd_list[] = { "pool_id", "subop", "cli_id", "arg1", "arg2", "buf", NULL };
-
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iiiiiis", kwd_list,
- &pool_id, &subop, &cli_id, &arg1, &arg2, &buf) )
- return NULL;
-
- if ( (subop == XEN_SYSCTL_TMEM_OP_LIST) && (arg1 > 32768) )
- arg1 = 32768;
-
- if ( (rc = xc_tmem_control(self->xc_handle, pool_id, subop, cli_id, arg1, arg2, buffer)) < 0 )
- return Py_BuildValue("i", rc);
-
- switch (subop) {
- case XEN_SYSCTL_TMEM_OP_LIST:
- return Py_BuildValue("s", buffer);
- case XEN_SYSCTL_TMEM_OP_FLUSH:
- return Py_BuildValue("i", rc);
- case XEN_SYSCTL_TMEM_OP_QUERY_FREEABLE_MB:
- return Py_BuildValue("i", rc);
- case XEN_SYSCTL_TMEM_OP_THAW:
- case XEN_SYSCTL_TMEM_OP_FREEZE:
- case XEN_SYSCTL_TMEM_OP_DESTROY:
- case XEN_SYSCTL_TMEM_OP_SET_WEIGHT:
- case XEN_SYSCTL_TMEM_OP_SET_CAP:
- case XEN_SYSCTL_TMEM_OP_SET_COMPRESS:
- default:
- break;
- }
-
- Py_INCREF(zero);
- return zero;
-}
-
-static PyObject *pyxc_tmem_shared_auth(XcObject *self,
- PyObject *args,
- PyObject *kwds)
-{
- uint32_t cli_id;
- uint32_t arg1;
- char *uuid_str;
- int rc;
-
- static char *kwd_list[] = { "cli_id", "uuid_str", "arg1", NULL };
-
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "isi", kwd_list,
- &cli_id, &uuid_str, &arg1) )
- return NULL;
-
- if ( (rc = xc_tmem_auth(self->xc_handle, cli_id, uuid_str, arg1)) < 0 )
- return Py_BuildValue("i", rc);
-
- Py_INCREF(zero);
- return zero;
-}
-
-static PyObject *pyxc_dom_set_memshr(XcObject *self, PyObject *args)
-{
- uint32_t dom;
- int enable;
-
- if (!PyArg_ParseTuple(args, "ii", &dom, &enable))
- return NULL;
-
- if (xc_memshr_control(self->xc_handle, dom, enable) != 0)
- return pyxc_error_to_exception(self->xc_handle);
-
- Py_INCREF(zero);
- return zero;
-}
-
-static PyObject *cpumap_to_cpulist(XcObject *self, xc_cpumap_t cpumap)
-{
- PyObject *cpulist = NULL;
- int i;
- int nr_cpus;
-
- nr_cpus = xc_get_max_cpus(self->xc_handle);
- if ( nr_cpus < 0 )
- return pyxc_error_to_exception(self->xc_handle);
-
- cpulist = PyList_New(0);
- for ( i = 0; i < nr_cpus; i++ )
- {
- if ( *cpumap & (1 << (i % 8)) )
- {
- PyObject* pyint = PyInt_FromLong(i);
-
- PyList_Append(cpulist, pyint);
- Py_DECREF(pyint);
- }
- if ( (i % 8) == 7 )
- cpumap++;
- }
- return cpulist;
-}
-
-static PyObject *pyxc_cpupool_create(XcObject *self,
- PyObject *args,
- PyObject *kwds)
-{
- uint32_t cpupool = 0, sched = XEN_SCHEDULER_CREDIT;
-
- static char *kwd_list[] = { "pool", "sched", NULL };
-
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "|ii", kwd_list, &cpupool,
- &sched))
- return NULL;
-
- if ( xc_cpupool_create(self->xc_handle, &cpupool, sched) < 0 )
- return pyxc_error_to_exception(self->xc_handle);
-
- return PyInt_FromLong(cpupool);
-}
-
-static PyObject *pyxc_cpupool_destroy(XcObject *self,
- PyObject *args)
-{
- uint32_t cpupool;
-
- if (!PyArg_ParseTuple(args, "i", &cpupool))
- return NULL;
-
- if (xc_cpupool_destroy(self->xc_handle, cpupool) != 0)
- return pyxc_error_to_exception(self->xc_handle);
-
- Py_INCREF(zero);
- return zero;
-}
-
-static PyObject *pyxc_cpupool_getinfo(XcObject *self)
-{
- PyObject *list, *info_dict;
-
- uint32_t pool;
- xc_cpupoolinfo_t *info;
-
- list = PyList_New(0);
- for (pool = 0;;)
- {
- info = xc_cpupool_getinfo(self->xc_handle, pool);
- if (info == NULL)
- break;
- info_dict = Py_BuildValue(
- "{s:i,s:i,s:i,s:N}",
- "cpupool", (int)info->cpupool_id,
- "sched", info->sched_id,
- "n_dom", info->n_dom,
- "cpulist", cpumap_to_cpulist(self, info->cpumap));
- pool = info->cpupool_id + 1;
- xc_cpupool_infofree(self->xc_handle, info);
-
- if ( info_dict == NULL )
- {
- Py_DECREF(list);
- return NULL;
- }
-
- PyList_Append(list, info_dict);
- Py_DECREF(info_dict);
- }
-
- return list;
-}
-
-static PyObject *pyxc_cpupool_addcpu(XcObject *self,
- PyObject *args,
- PyObject *kwds)
-{
- uint32_t cpupool;
- int cpu = -1;
-
- static char *kwd_list[] = { "cpupool", "cpu", NULL };
-
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "i|i", kwd_list,
- &cpupool, &cpu) )
- return NULL;
-
- if (xc_cpupool_addcpu(self->xc_handle, cpupool, cpu) != 0)
- return pyxc_error_to_exception(self->xc_handle);
-
- Py_INCREF(zero);
- return zero;
-}
-
-static PyObject *pyxc_cpupool_removecpu(XcObject *self,
- PyObject *args,
- PyObject *kwds)
-{
- uint32_t cpupool;
- int cpu = -1;
-
- static char *kwd_list[] = { "cpupool", "cpu", NULL };
-
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "i|i", kwd_list,
- &cpupool, &cpu) )
- return NULL;
-
- if (xc_cpupool_removecpu(self->xc_handle, cpupool, cpu) != 0)
- return pyxc_error_to_exception(self->xc_handle);
-
- Py_INCREF(zero);
- return zero;
-}
-
-static PyObject *pyxc_cpupool_movedomain(XcObject *self,
- PyObject *args,
- PyObject *kwds)
-{
- uint32_t cpupool, domid;
-
- static char *kwd_list[] = { "cpupool", "domid", NULL };
-
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "ii", kwd_list,
- &cpupool, &domid) )
- return NULL;
-
- if (xc_cpupool_movedomain(self->xc_handle, cpupool, domid) != 0)
- return pyxc_error_to_exception(self->xc_handle);
-
- Py_INCREF(zero);
- return zero;
-}
-
-static PyObject *pyxc_cpupool_freeinfo(XcObject *self)
-{
- xc_cpumap_t cpumap;
- PyObject *info = NULL;
-
- cpumap = xc_cpupool_freeinfo(self->xc_handle);
- if (!cpumap)
- return pyxc_error_to_exception(self->xc_handle);
-
- info = cpumap_to_cpulist(self, cpumap);
-
- free(cpumap);
-
- return info;
-}
-
-static PyObject *pyflask_context_to_sid(PyObject *self, PyObject *args,
- PyObject *kwds)
-{
- xc_interface *xc_handle;
- char *ctx;
- uint32_t sid;
- int ret;
-
- static char *kwd_list[] = { "context", NULL };
-
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "s", kwd_list,
- &ctx) )
- return NULL;
-
- xc_handle = xc_interface_open(0,0,0);
- if (!xc_handle) {
- return PyErr_SetFromErrno(xc_error_obj);
- }
-
- ret = xc_flask_context_to_sid(xc_handle, ctx, strlen(ctx), &sid);
-
- xc_interface_close(xc_handle);
+/* Needed for Python versions earlier than 2.3. */
+#ifndef PyMODINIT_FUNC
+#define PyMODINIT_FUNC DL_EXPORT(void)
+#endif
- if ( ret != 0 ) {
- errno = -ret;
- return PyErr_SetFromErrno(xc_error_obj);
- }
+#define PKG "xen.lowlevel.xc"
+#define CLS "xc"
- return PyInt_FromLong(sid);
-}
+static PyObject *xc_error_obj, *zero;
-static PyObject *pyflask_sid_to_context(PyObject *self, PyObject *args,
- PyObject *kwds)
-{
+typedef struct {
+ PyObject_HEAD;
xc_interface *xc_handle;
- uint32_t sid;
- char ctx[FLASK_CTX_LEN];
- uint32_t ctx_len = FLASK_CTX_LEN;
- int ret;
-
- static char *kwd_list[] = { "sid", NULL };
-
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "i", kwd_list,
- &sid) )
- return NULL;
-
- xc_handle = xc_interface_open(0,0,0);
- if (!xc_handle) {
- return PyErr_SetFromErrno(xc_error_obj);
- }
-
- ret = xc_flask_sid_to_context(xc_handle, sid, ctx, ctx_len);
-
- xc_interface_close(xc_handle);
-
- if ( ret != 0 ) {
- errno = -ret;
- return PyErr_SetFromErrno(xc_error_obj);
- }
+} XcObject;
- return Py_BuildValue("s", ctx, ctx_len);
-}
-static PyObject *pyflask_load(PyObject *self, PyObject *args, PyObject *kwds)
+static PyObject *pyxc_error_to_exception(xc_interface *xch)
{
- xc_interface *xc_handle;
- char *policy;
- uint32_t len;
- int ret;
-
- static char *kwd_list[] = { "policy", NULL };
-
- if( !PyArg_ParseTupleAndKeywords(args, kwds, "s#", kwd_list, &policy, &len) )
- return NULL;
+ PyObject *pyerr;
+ static xc_error err_buf;
+ const char *desc;
+ const xc_error *err;
- xc_handle = xc_interface_open(0,0,0);
- if (!xc_handle) {
- return PyErr_SetFromErrno(xc_error_obj);
+ if (xch) {
+ err = xc_get_last_error(xch);
+ } else {
+ snprintf(err_buf.message, sizeof(err_buf.message),
+ "xc_interface_open failed: %s",
+ strerror(errno));
+ err_buf.code = XC_INTERNAL_ERROR;
+ err = &err_buf;
}
- ret = xc_flask_load(xc_handle, policy, len);
-
- xc_interface_close(xc_handle);
+ desc = xc_error_code_to_desc(err->code);
- if ( ret != 0 ) {
- errno = -ret;
+ if ( err->code == XC_ERROR_NONE )
return PyErr_SetFromErrno(xc_error_obj);
- }
- return Py_BuildValue("i", ret);
-}
+ if ( err->message[0] != '\0' )
+ pyerr = Py_BuildValue("(iss)", err->code, desc, err->message);
+ else
+ pyerr = Py_BuildValue("(is)", err->code, desc);
-static PyObject *pyflask_getenforce(PyObject *self)
-{
- xc_interface *xc_handle;
- int ret;
+ if (xch)
+ xc_clear_last_error(xch);
- xc_handle = xc_interface_open(0,0,0);
- if (!xc_handle) {
- return PyErr_SetFromErrno(xc_error_obj);
- }
-
- ret = xc_flask_getenforce(xc_handle);
-
- xc_interface_close(xc_handle);
-
- if ( ret < 0 ) {
- errno = -ret;
- return PyErr_SetFromErrno(xc_error_obj);
+ if ( pyerr != NULL )
+ {
+ PyErr_SetObject(xc_error_obj, pyerr);
+ Py_DECREF(pyerr);
}
- return Py_BuildValue("i", ret);
+ return NULL;
}
-static PyObject *pyflask_setenforce(PyObject *self, PyObject *args,
- PyObject *kwds)
+static PyObject *pyxc_xeninfo(XcObject *self)
{
- xc_interface *xc_handle;
- int mode;
- int ret;
+ xen_extraversion_t xen_extra;
+ xen_compile_info_t xen_cc;
+ xen_changeset_info_t xen_chgset;
+ xen_capabilities_info_t xen_caps;
+ xen_platform_parameters_t p_parms;
+ xen_commandline_t xen_commandline;
+ long xen_version;
+ long xen_pagesize;
+ char str[128];
- static char *kwd_list[] = { "mode", NULL };
+ xen_version = xc_version(self->xc_handle, XENVER_version, NULL);
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "i", kwd_list,
- &mode) )
- return NULL;
+ if ( xc_version(self->xc_handle, XENVER_extraversion, &xen_extra) != 0 )
+ return pyxc_error_to_exception(self->xc_handle);
- xc_handle = xc_interface_open(0,0,0);
- if (!xc_handle) {
- return PyErr_SetFromErrno(xc_error_obj);
- }
-
- ret = xc_flask_setenforce(xc_handle, mode);
-
- xc_interface_close(xc_handle);
-
- if ( ret != 0 ) {
- errno = -ret;
- return PyErr_SetFromErrno(xc_error_obj);
- }
+ if ( xc_version(self->xc_handle, XENVER_compile_info, &xen_cc) != 0 )
+ return pyxc_error_to_exception(self->xc_handle);
- return Py_BuildValue("i", ret);
-}
+ if ( xc_version(self->xc_handle, XENVER_changeset, &xen_chgset) != 0 )
+ return pyxc_error_to_exception(self->xc_handle);
-static PyObject *pyflask_access(PyObject *self, PyObject *args,
- PyObject *kwds)
-{
- xc_interface *xc_handle;
- char *tcon, *scon;
- uint16_t tclass;
- uint32_t req, allowed, decided, auditallow, auditdeny, seqno;
- int ret;
+ if ( xc_version(self->xc_handle, XENVER_capabilities, &xen_caps) != 0 )
+ return pyxc_error_to_exception(self->xc_handle);
- static char *kwd_list[] = { "src_context", "tar_context",
- "tar_class", "req_permissions",
- "decided", "auditallow","auditdeny",
- "seqno", NULL };
+ if ( xc_version(self->xc_handle, XENVER_platform_parameters, &p_parms) != 0 )
+ return pyxc_error_to_exception(self->xc_handle);
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "ssil|llll", kwd_list,
- &scon, &tcon, &tclass, &req, &decided,
- &auditallow, &auditdeny, &seqno) )
- return NULL;
+ if ( xc_version(self->xc_handle, XENVER_commandline, &xen_commandline) != 0 )
+ return pyxc_error_to_exception(self->xc_handle);
- xc_handle = xc_interface_open(0,0,0);
- if (!xc_handle) {
- return PyErr_SetFromErrno(xc_error_obj);
- }
-
- ret = xc_flask_access(xc_handle, scon, tcon, tclass, req, &allowed, &decided,
- &auditallow, &auditdeny, &seqno);
-
- xc_interface_close(xc_handle);
+ snprintf(str, sizeof(str), "virt_start=0x%"PRI_xen_ulong, p_parms.virt_start);
- if ( ret != 0 ) {
- errno = -ret;
- return PyErr_SetFromErrno(xc_error_obj);
- }
+ xen_pagesize = xc_version(self->xc_handle, XENVER_pagesize, NULL);
+ if (xen_pagesize < 0 )
+ return pyxc_error_to_exception(self->xc_handle);
- return Py_BuildValue("i",ret);
+ return Py_BuildValue("{s:i,s:i,s:s,s:s,s:i,s:s,s:s,s:s,s:s,s:s,s:s,s:s}",
+ "xen_major", xen_version >> 16,
+ "xen_minor", (xen_version & 0xffff),
+ "xen_extra", xen_extra,
+ "xen_caps", xen_caps,
+ "xen_pagesize", xen_pagesize,
+ "platform_params", str,
+ "xen_changeset", xen_chgset,
+ "xen_commandline", xen_commandline,
+ "cc_compiler", xen_cc.compiler,
+ "cc_compile_by", xen_cc.compile_by,
+ "cc_compile_domain", xen_cc.compile_domain,
+ "cc_compile_date", xen_cc.compile_date);
}
static PyMethodDef pyxc_methods[] = {
- { "domain_create",
- (PyCFunction)pyxc_domain_create,
- METH_VARARGS | METH_KEYWORDS, "\n"
- "Create a new domain.\n"
- " dom [int, 0]: Domain identifier to use (allocated if zero).\n"
- "Returns: [int] new domain identifier; -1 on error.\n" },
-
- { "domain_max_vcpus",
- (PyCFunction)pyxc_domain_max_vcpus,
- METH_VARARGS, "\n"
- "Set the maximum number of VCPUs a domain may create.\n"
- " dom [int, 0]: Domain identifier to use.\n"
- " max [int, 0]: New maximum number of VCPUs in domain.\n"
- "Returns: [int] 0 on success; -1 on error.\n" },
-
- { "domain_dumpcore",
- (PyCFunction)pyxc_domain_dumpcore,
- METH_VARARGS, "\n"
- "Dump core of a domain.\n"
- " dom [int]: Identifier of domain to dump core of.\n"
- " corefile [string]: Name of corefile to be created.\n\n"
- "Returns: [int] 0 on success; -1 on error.\n" },
-
- { "domain_pause",
- (PyCFunction)pyxc_domain_pause,
- METH_VARARGS, "\n"
- "Temporarily pause execution of a domain.\n"
- " dom [int]: Identifier of domain to be paused.\n\n"
- "Returns: [int] 0 on success; -1 on error.\n" },
-
- { "domain_unpause",
- (PyCFunction)pyxc_domain_unpause,
- METH_VARARGS, "\n"
- "(Re)start execution of a domain.\n"
- " dom [int]: Identifier of domain to be unpaused.\n\n"
- "Returns: [int] 0 on success; -1 on error.\n" },
-
- { "domain_destroy",
- (PyCFunction)pyxc_domain_destroy,
- METH_VARARGS, "\n"
- "Destroy a domain.\n"
- " dom [int]: Identifier of domain to be destroyed.\n\n"
- "Returns: [int] 0 on success; -1 on error.\n" },
-
- { "domain_destroy_hook",
- (PyCFunction)pyxc_domain_destroy_hook,
- METH_VARARGS, "\n"
- "Add a hook for arch stuff before destroy a domain.\n"
- " dom [int]: Identifier of domain to be destroyed.\n\n"
- "Returns: [int] 0 on success; -1 on error.\n" },
-
- { "domain_resume",
- (PyCFunction)pyxc_domain_resume,
- METH_VARARGS, "\n"
- "Resume execution of a suspended domain.\n"
- " dom [int]: Identifier of domain to be resumed.\n"
- " fast [int]: Use cooperative resume.\n\n"
- "Returns: [int] 0 on success; -1 on error.\n" },
-
- { "domain_shutdown",
- (PyCFunction)pyxc_domain_shutdown,
- METH_VARARGS, "\n"
- "Shutdown a domain.\n"
- " dom [int, 0]: Domain identifier to use.\n"
- " reason [int, 0]: Reason for shutdown.\n"
- "Returns: [int] 0 on success; -1 on error.\n" },
-
- { "vcpu_setaffinity",
- (PyCFunction)pyxc_vcpu_setaffinity,
- METH_VARARGS | METH_KEYWORDS, "\n"
- "Pin a VCPU to a specified set CPUs.\n"
- " dom [int]: Identifier of domain to which VCPU belongs.\n"
- " vcpu [int, 0]: VCPU being pinned.\n"
- " cpumap [list, []]: list of usable CPUs.\n\n"
- "Returns: [int] 0 on success; -1 on error.\n" },
-
- { "domain_sethandle",
- (PyCFunction)pyxc_domain_sethandle,
- METH_VARARGS, "\n"
- "Set domain's opaque handle.\n"
- " dom [int]: Identifier of domain.\n"
- " handle [list of 16 ints]: New opaque handle.\n"
- "Returns: [int] 0 on success; -1 on error.\n" },
-
- { "domain_getinfo",
- (PyCFunction)pyxc_domain_getinfo,
- METH_VARARGS | METH_KEYWORDS, "\n"
- "Get information regarding a set of domains, in increasing id order.\n"
- " first_dom [int, 0]: First domain to retrieve info about.\n"
- " max_doms [int, 1024]: Maximum number of domains to retrieve info"
- " about.\n\n"
- "Returns: [list of dicts] if list length is less than 'max_doms'\n"
- " parameter then there was an error, or the end of the\n"
- " domain-id space was reached.\n"
- " dom [int]: Identifier of domain to which this info pertains\n"
- " cpu [int]: CPU to which this domain is bound\n"
- " vcpus [int]: Number of Virtual CPUS in this domain\n"
- " dying [int]: Bool - is the domain dying?\n"
- " crashed [int]: Bool - has the domain crashed?\n"
- " shutdown [int]: Bool - has the domain shut itself down?\n"
- " paused [int]: Bool - is the domain paused by control software?\n"
- " blocked [int]: Bool - is the domain blocked waiting for an event?\n"
- " running [int]: Bool - is the domain currently running?\n"
- " mem_kb [int]: Memory reservation, in kilobytes\n"
- " maxmem_kb [int]: Maximum memory limit, in kilobytes\n"
- " cpu_time [long]: CPU time consumed, in nanoseconds\n"
- " shutdown_reason [int]: Numeric code from guest OS, explaining "
- "reason why it shut itself down.\n"
- " cpupool [int] Id of cpupool domain is bound to.\n" },
-
- { "vcpu_getinfo",
- (PyCFunction)pyxc_vcpu_getinfo,
- METH_VARARGS | METH_KEYWORDS, "\n"
- "Get information regarding a VCPU.\n"
- " dom [int]: Domain to retrieve info about.\n"
- " vcpu [int, 0]: VCPU to retrieve info about.\n\n"
- "Returns: [dict]\n"
- " online [int]: Bool - Is this VCPU currently online?\n"
- " blocked [int]: Bool - Is this VCPU blocked waiting for an event?\n"
- " running [int]: Bool - Is this VCPU currently running on a CPU?\n"
- " cpu_time [long]: CPU time consumed, in nanoseconds\n"
- " cpumap [int]: Bitmap of CPUs this VCPU can run on\n"
- " cpu [int]: CPU that this VCPU is currently bound to\n" },
-
- { "linux_build",
- (PyCFunction)pyxc_linux_build,
- METH_VARARGS | METH_KEYWORDS, "\n"
- "Build a new Linux guest OS.\n"
- " dom [int]: Identifier of domain to build into.\n"
- " image [str]: Name of kernel image file. May be gzipped.\n"
- " ramdisk [str, n/a]: Name of ramdisk file, if any.\n"
- " cmdline [str, n/a]: Kernel parameters, if any.\n\n"
- " vcpus [int, 1]: Number of Virtual CPUS in domain.\n\n"
- "Returns: [int] 0 on success; -1 on error.\n" },
-
- {"getBitSize",
- (PyCFunction)pyxc_getBitSize,
- METH_VARARGS | METH_KEYWORDS, "\n"
- "Get the bitsize of a guest OS.\n"
- " image [str]: Name of kernel image file. May be gzipped.\n"
- " cmdline [str, n/a]: Kernel parameters, if any.\n\n"},
-
- { "hvm_build",
- (PyCFunction)pyxc_hvm_build,
- METH_VARARGS | METH_KEYWORDS, "\n"
- "Build a new HVM guest OS.\n"
- " dom [int]: Identifier of domain to build into.\n"
- " image [str]: Name of HVM loader image file.\n"
- " vcpus [int, 1]: Number of Virtual CPUS in domain.\n\n"
- " vcpu_avail [long, 1]: Which Virtual CPUS available.\n\n"
- "Returns: [int] 0 on success; -1 on error.\n" },
-
- { "gnttab_hvm_seed",
- (PyCFunction)pyxc_gnttab_hvm_seed,
- METH_KEYWORDS, "\n"
- "Initialise HVM guest grant table.\n"
- " dom [int]: Identifier of domain to build into.\n"
- " console_gmfn [int]: \n"
- " xenstore_gmfn [int]: \n"
- " console_domid [int]: \n"
- " xenstore_domid [int]: \n"
- "Returns: None on sucess. Raises exception on error.\n" },
-
- { "hvm_get_param",
- (PyCFunction)pyxc_hvm_param_get,
- METH_VARARGS | METH_KEYWORDS, "\n"
- "get a parameter of HVM guest OS.\n"
- " dom [int]: Identifier of domain to build into.\n"
- " param [int]: No. of HVM param.\n"
- "Returns: [long] value of the param.\n" },
-
- { "hvm_set_param",
- (PyCFunction)pyxc_hvm_param_set,
- METH_VARARGS | METH_KEYWORDS, "\n"
- "set a parameter of HVM guest OS.\n"
- " dom [int]: Identifier of domain to build into.\n"
- " param [int]: No. of HVM param.\n"
- " value [long]: Value of param.\n"
- "Returns: [int] 0 on success.\n" },
-
- { "get_device_group",
- (PyCFunction)pyxc_get_device_group,
- METH_VARARGS, "\n"
- "get sibling devices infomation.\n"
- " dom [int]: Domain to assign device to.\n"
- " seg [int]: PCI segment.\n"
- " bus [int]: PCI bus.\n"
- " dev [int]: PCI dev.\n"
- " func [int]: PCI func.\n"
- "Returns: [string]: Sibling devices \n" },
-
- { "test_assign_device",
- (PyCFunction)pyxc_test_assign_device,
- METH_VARARGS | METH_KEYWORDS, "\n"
- "test device assignment with VT-d.\n"
- " dom [int]: Identifier of domain to build into.\n"
- " pci_str [str]: PCI devices.\n"
- "Returns: [int] 0 on success, or device bdf that can't be assigned.\n" },
-
- { "assign_device",
- (PyCFunction)pyxc_assign_device,
- METH_VARARGS | METH_KEYWORDS, "\n"
- "Assign device to IOMMU domain.\n"
- " dom [int]: Domain to assign device to.\n"
- " pci_str [str]: PCI devices.\n"
- "Returns: [int] 0 on success, or device bdf that can't be assigned.\n" },
-
- { "deassign_device",
- (PyCFunction)pyxc_deassign_device,
- METH_VARARGS | METH_KEYWORDS, "\n"
- "Deassign device from IOMMU domain.\n"
- " dom [int]: Domain to deassign device from.\n"
- " pci_str [str]: PCI devices.\n"
- "Returns: [int] 0 on success, or device bdf that can't be deassigned.\n" },
-
- { "sched_id_get",
- (PyCFunction)pyxc_sched_id_get,
- METH_NOARGS, "\n"
- "Get the current scheduler type in use.\n"
- "Returns: [int] sched_id.\n" },
-
- { "sched_credit_domain_set",
- (PyCFunction)pyxc_sched_credit_domain_set,
- METH_KEYWORDS, "\n"
- "Set the scheduling parameters for a domain when running with the\n"
- "SMP credit scheduler.\n"
- " domid [int]: domain id to set\n"
- " weight [short]: domain's scheduling weight\n"
- "Returns: [int] 0 on success; -1 on error.\n" },
-
- { "sched_credit_domain_get",
- (PyCFunction)pyxc_sched_credit_domain_get,
- METH_VARARGS, "\n"
- "Get the scheduling parameters for a domain when running with the\n"
- "SMP credit scheduler.\n"
- " domid [int]: domain id to get\n"
- "Returns: [dict]\n"
- " weight [short]: domain's scheduling weight\n"},
-
- { "sched_credit2_domain_set",
- (PyCFunction)pyxc_sched_credit2_domain_set,
- METH_KEYWORDS, "\n"
- "Set the scheduling parameters for a domain when running with the\n"
- "SMP credit2 scheduler.\n"
- " domid [int]: domain id to set\n"
- " weight [short]: domain's scheduling weight\n"
- "Returns: [int] 0 on success; -1 on error.\n" },
-
- { "sched_credit2_domain_get",
- (PyCFunction)pyxc_sched_credit2_domain_get,
- METH_VARARGS, "\n"
- "Get the scheduling parameters for a domain when running with the\n"
- "SMP credit2 scheduler.\n"
- " domid [int]: domain id to get\n"
- "Returns: [dict]\n"
- " weight [short]: domain's scheduling weight\n"},
-
- { "evtchn_alloc_unbound",
- (PyCFunction)pyxc_evtchn_alloc_unbound,
- METH_VARARGS | METH_KEYWORDS, "\n"
- "Allocate an unbound port that will await a remote connection.\n"
- " dom [int]: Domain whose port space to allocate from.\n"
- " remote_dom [int]: Remote domain to accept connections from.\n\n"
- "Returns: [int] Unbound event-channel port.\n" },
-
- { "evtchn_reset",
- (PyCFunction)pyxc_evtchn_reset,
- METH_VARARGS | METH_KEYWORDS, "\n"
- "Reset all connections.\n"
- " dom [int]: Domain to reset.\n" },
-
- { "physdev_map_pirq",
- (PyCFunction)pyxc_physdev_map_pirq,
- METH_VARARGS | METH_KEYWORDS, "\n"
- "map physical irq to guest pirq.\n"
- " dom [int]: Identifier of domain to map for.\n"
- " index [int]: physical irq.\n"
- " pirq [int]: guest pirq.\n"
- "Returns: [long] value of the param.\n" },
-
- { "physdev_pci_access_modify",
- (PyCFunction)pyxc_physdev_pci_access_modify,
- METH_VARARGS | METH_KEYWORDS, "\n"
- "Allow a domain access to a PCI device\n"
- " dom [int]: Identifier of domain to be allowed access.\n"
- " bus [int]: PCI bus\n"
- " dev [int]: PCI slot\n"
- " func [int]: PCI function\n"
- " enable [int]: Non-zero means enable access; else disable access\n\n"
- "Returns: [int] 0 on success; -1 on error.\n" },
-
- { "readconsolering",
- (PyCFunction)pyxc_readconsolering,
- METH_VARARGS | METH_KEYWORDS, "\n"
- "Read Xen's console ring.\n"
- " clear [int, 0]: Bool - clear the ring after reading from it?\n\n"
- "Returns: [str] string is empty on failure.\n" },
-
- { "physinfo",
- (PyCFunction)pyxc_physinfo,
- METH_NOARGS, "\n"
- "Get information about the physical host machine\n"
- "Returns [dict]: information about the hardware"
- " [None]: on failure.\n" },
-
- { "getcpuinfo",
- (PyCFunction)pyxc_getcpuinfo,
- METH_VARARGS | METH_KEYWORDS, "\n"
- "Get information about physical CPUs\n"
- "Returns [list]: information about physical CPUs"
- " [None]: on failure.\n" },
-
- { "topologyinfo",
- (PyCFunction)pyxc_topologyinfo,
- METH_NOARGS, "\n"
- "Get information about the cpu topology on the host machine\n"
- "Returns [dict]: information about the cpu topology on host"
- " [None]: on failure.\n" },
-
- { "numainfo",
- (PyCFunction)pyxc_numainfo,
- METH_NOARGS, "\n"
- "Get NUMA information on the host machine\n"
- "Returns [dict]: NUMA information on host"
- " [None]: on failure.\n" },
-
{ "xeninfo",
(PyCFunction)pyxc_xeninfo,
METH_NOARGS, "\n"
@@ -2553,301 +123,6 @@ static PyMethodDef pyxc_methods[] = {
"Returns [dict]: information about Xen"
" [None]: on failure.\n" },
- { "shadow_control",
- (PyCFunction)pyxc_shadow_control,
- METH_VARARGS | METH_KEYWORDS, "\n"
- "Set parameter for shadow pagetable interface\n"
- " dom [int]: Identifier of domain.\n"
- " op [int, 0]: operation\n\n"
- "Returns: [int] 0 on success; -1 on error.\n" },
-
- { "shadow_mem_control",
- (PyCFunction)pyxc_shadow_mem_control,
- METH_VARARGS | METH_KEYWORDS, "\n"
- "Set or read shadow pagetable memory use\n"
- " dom [int]: Identifier of domain.\n"
- " mb [int, -1]: MB of shadow memory this domain should have.\n\n"
- "Returns: [int] MB of shadow memory in use by this domain.\n" },
-
- { "domain_setmaxmem",
- (PyCFunction)pyxc_domain_setmaxmem,
- METH_VARARGS, "\n"
- "Set a domain's memory limit\n"
- " dom [int]: Identifier of domain.\n"
- " maxmem_kb [int]: .\n"
- "Returns: [int] 0 on success; -1 on error.\n" },
-
- { "domain_set_target_mem",
- (PyCFunction)pyxc_domain_set_target_mem,
- METH_VARARGS, "\n"
- "Set a domain's memory target\n"
- " dom [int]: Identifier of domain.\n"
- " mem_kb [int]: .\n"
- "Returns: [int] 0 on success; -1 on error.\n" },
-
- { "domain_set_memmap_limit",
- (PyCFunction)pyxc_domain_set_memmap_limit,
- METH_VARARGS, "\n"
- "Set a domain's physical memory mappping limit\n"
- " dom [int]: Identifier of domain.\n"
- " map_limitkb [int]: .\n"
- "Returns: [int] 0 on success; -1 on error.\n" },
-
- { "domain_ioport_permission",
- (PyCFunction)pyxc_domain_ioport_permission,
- METH_VARARGS | METH_KEYWORDS, "\n"
- "Allow a domain access to a range of IO ports\n"
- " dom [int]: Identifier of domain to be allowed access.\n"
- " first_port [int]: First IO port\n"
- " nr_ports [int]: Number of IO ports\n"
- " allow_access [int]: Non-zero means enable access; else disable access\n\n"
- "Returns: [int] 0 on success; -1 on error.\n" },
-
- { "domain_irq_permission",
- (PyCFunction)pyxc_domain_irq_permission,
- METH_VARARGS | METH_KEYWORDS, "\n"
- "Allow a domain access to a physical IRQ\n"
- " dom [int]: Identifier of domain to be allowed access.\n"
- " pirq [int]: The Physical IRQ\n"
- " allow_access [int]: Non-zero means enable access; else disable access\n\n"
- "Returns: [int] 0 on success; -1 on error.\n" },
-
- { "domain_iomem_permission",
- (PyCFunction)pyxc_domain_iomem_permission,
- METH_VARARGS | METH_KEYWORDS, "\n"
- "Allow a domain access to a range of IO memory pages\n"
- " dom [int]: Identifier of domain to be allowed access.\n"
- " first_pfn [long]: First page of I/O Memory\n"
- " nr_pfns [long]: Number of pages of I/O Memory (>0)\n"
- " allow_access [int]: Non-zero means enable access; else disable access\n\n"
- "Returns: [int] 0 on success; -1 on error.\n" },
-
- { "pages_to_kib",
- (PyCFunction)pyxc_pages_to_kib,
- METH_VARARGS, "\n"
- "Returns: [int]: The size in KiB of memory spanning the given number "
- "of pages.\n" },
-
- { "domain_set_time_offset",
- (PyCFunction)pyxc_domain_set_time_offset,
- METH_VARARGS, "\n"
- "Set a domain's time offset to Dom0's localtime\n"
- " dom [int]: Domain whose time offset is being set.\n"
- " offset [int]: Time offset from UTC in seconds.\n"
- "Returns: [int] 0 on success; -1 on error.\n" },
-
- { "domain_set_tsc_info",
- (PyCFunction)pyxc_domain_set_tsc_info,
- METH_VARARGS, "\n"
- "Set a domain's TSC mode\n"
- " dom [int]: Domain whose TSC mode is being set.\n"
- " tsc_mode [int]: 0=default (monotonic, but native where possible)\n"
- " 1=always emulate 2=never emulate 3=pvrdtscp\n"
- "Returns: [int] 0 on success; -1 on error.\n" },
-
- { "domain_disable_migrate",
- (PyCFunction)pyxc_domain_disable_migrate,
- METH_VARARGS, "\n"
- "Marks domain as non-migratable AND non-restoreable\n"
- " dom [int]: Domain whose TSC mode is being set.\n"
- "Returns: [int] 0 on success; -1 on error.\n" },
-
- { "domain_send_trigger",
- (PyCFunction)pyxc_domain_send_trigger,
- METH_VARARGS | METH_KEYWORDS, "\n"
- "Send trigger to a domain.\n"
- " dom [int]: Identifier of domain to be sent trigger.\n"
- " trigger [int]: Trigger type number.\n"
- " vcpu [int]: VCPU to be sent trigger.\n"
- "Returns: [int] 0 on success; -1 on error.\n" },
-
- { "send_debug_keys",
- (PyCFunction)pyxc_send_debug_keys,
- METH_VARARGS | METH_KEYWORDS, "\n"
- "Inject debug keys into Xen.\n"
- " keys [str]: String of keys to inject.\n" },
-
-#if defined(__i386__) || defined(__x86_64__)
- { "domain_check_cpuid",
- (PyCFunction)pyxc_dom_check_cpuid,
- METH_VARARGS, "\n"
- "Apply checks to host CPUID.\n"
- " input [long]: Input for cpuid instruction (eax)\n"
- " sub_input [long]: Second input (optional, may be None) for cpuid "
- " instruction (ecx)\n"
- " config [dict]: Dictionary of register\n"
- " config [dict]: Dictionary of register, use for checking\n\n"
- "Returns: [int] 0 on success; exception on error.\n" },
-
- { "domain_set_cpuid",
- (PyCFunction)pyxc_dom_set_cpuid,
- METH_VARARGS, "\n"
- "Set cpuid response for an input and a domain.\n"
- " dom [int]: Identifier of domain.\n"
- " input [long]: Input for cpuid instruction (eax)\n"
- " sub_input [long]: Second input (optional, may be None) for cpuid "
- " instruction (ecx)\n"
- " config [dict]: Dictionary of register\n\n"
- "Returns: [int] 0 on success; exception on error.\n" },
-
- { "domain_set_policy_cpuid",
- (PyCFunction)pyxc_dom_set_policy_cpuid,
- METH_VARARGS, "\n"
- "Set the default cpuid policy for a domain.\n"
- " dom [int]: Identifier of domain.\n\n"
- "Returns: [int] 0 on success; exception on error.\n" },
-
- { "domain_set_machine_address_size",
- (PyCFunction)pyxc_dom_set_machine_address_size,
- METH_VARARGS, "\n"
- "Set maximum machine address size for this domain.\n"
- " dom [int]: Identifier of domain.\n"
- " width [int]: Maximum machine address width.\n" },
-
- { "domain_suppress_spurious_page_faults",
- (PyCFunction)pyxc_dom_suppress_spurious_page_faults,
- METH_VARARGS, "\n"
- "Do not propagate spurious page faults to this guest.\n"
- " dom [int]: Identifier of domain.\n" },
-#endif
-
- { "tmem_control",
- (PyCFunction)pyxc_tmem_control,
- METH_VARARGS | METH_KEYWORDS, "\n"
- "Do various control on a tmem pool.\n"
- " pool_id [int]: Identifier of the tmem pool (-1 == all).\n"
- " subop [int]: Supplementary Operation.\n"
- " cli_id [int]: Client identifier (-1 == all).\n"
- " arg1 [int]: Argument.\n"
- " arg2 [int]: Argument.\n"
- " buf [str]: Buffer.\n\n"
- "Returns: [int] 0 or [str] tmem info on success; exception on error.\n" },
-
- { "tmem_shared_auth",
- (PyCFunction)pyxc_tmem_shared_auth,
- METH_VARARGS | METH_KEYWORDS, "\n"
- "De/authenticate a shared tmem pool.\n"
- " cli_id [int]: Client identifier (-1 == all).\n"
- " uuid_str [str]: uuid.\n"
- " auth [int]: 0|1 .\n"
- "Returns: [int] 0 on success; exception on error.\n" },
-
- { "dom_set_memshr",
- (PyCFunction)pyxc_dom_set_memshr,
- METH_VARARGS, "\n"
- "Enable/disable memory sharing for the domain.\n"
- " dom [int]: Domain identifier.\n"
- " enable [int,0|1]: Disable or enable?\n"
- "Returns: [int] 0 on success; -1 on error.\n" },
-
- { "cpupool_create",
- (PyCFunction)pyxc_cpupool_create,
- METH_VARARGS | METH_KEYWORDS, "\n"
- "Create new cpupool.\n"
- " pool [int, 0]: cpupool identifier to use (allocated if zero).\n"
- " sched [int]: scheduler to use (credit if unspecified).\n\n"
- "Returns: [int] new cpupool identifier; -1 on error.\n" },
-
- { "cpupool_destroy",
- (PyCFunction)pyxc_cpupool_destroy,
- METH_VARARGS, "\n"
- "Destroy a cpupool.\n"
- " pool [int]: Identifier of cpupool to be destroyed.\n\n"
- "Returns: [int] 0 on success; -1 on error.\n" },
-
- { "cpupool_getinfo",
- (PyCFunction)pyxc_cpupool_getinfo,
- METH_NOARGS, "\n"
- "Get information regarding a set of cpupools, in increasing id order.\n"
- "Returns: [list of dicts]\n"
- " pool [int]: Identifier of cpupool to which this info pertains\n"
- " sched [int]: Scheduler used for this cpupool\n"
- " n_dom [int]: Number of Domains in this cpupool\n"
- " cpulist [list]: List of CPUs this cpupool is using\n" },
-
- { "cpupool_addcpu",
- (PyCFunction)pyxc_cpupool_addcpu,
- METH_VARARGS | METH_KEYWORDS, "\n"
- "Add a cpu to a cpupool.\n"
- " pool [int]: Identifier of cpupool.\n"
- " cpu [int, -1]: Cpu to add (lowest free if -1)\n\n"
- "Returns: [int] 0 on success; -1 on error.\n" },
-
- { "cpupool_removecpu",
- (PyCFunction)pyxc_cpupool_removecpu,
- METH_VARARGS | METH_KEYWORDS, "\n"
- "Remove a cpu from a cpupool.\n"
- " pool [int]: Identifier of cpupool.\n"
- " cpu [int, -1]: Cpu to remove (highest used if -1)\n\n"
- "Returns: [int] 0 on success; -1 on error.\n" },
-
- { "cpupool_movedomain",
- (PyCFunction)pyxc_cpupool_movedomain,
- METH_VARARGS | METH_KEYWORDS, "\n"
- "Move a domain to another cpupool.\n"
- " pool [int]: Identifier of cpupool to move domain to.\n"
- " dom [int]: Domain to move\n\n"
- "Returns: [int] 0 on success; -1 on error.\n" },
-
- { "cpupool_freeinfo",
- (PyCFunction)pyxc_cpupool_freeinfo,
- METH_NOARGS, "\n"
- "Get info about cpus not in any cpupool.\n"
- "Returns: [list]: List of CPUs\n" },
-
- { "flask_context_to_sid",
- (PyCFunction)pyflask_context_to_sid,
- METH_KEYWORDS, "\n"
- "Convert a context string to a dynamic SID.\n"
- " context [str]: String specifying context to be converted\n"
- "Returns: [int]: Numeric SID on success; -1 on error.\n" },
-
- { "flask_sid_to_context",
- (PyCFunction)pyflask_sid_to_context,
- METH_KEYWORDS, "\n"
- "Convert a dynamic SID to context string.\n"
- " context [int]: SID to be converted\n"
- "Returns: [str]: Numeric SID on success; -1 on error.\n" },
-
- { "flask_load",
- (PyCFunction)pyflask_load,
- METH_KEYWORDS, "\n"
- "Loads a policy into the hypervisor.\n"
- " policy [str]: policy to be load\n"
- "Returns: [int]: 0 on success; -1 on failure.\n" },
-
- { "flask_getenforce",
- (PyCFunction)pyflask_getenforce,
- METH_NOARGS, "\n"
- "Returns the current mode of the Flask XSM module.\n"
- "Returns: [int]: 0 for permissive; 1 for enforcing; -1 on failure.\n" },
-
- { "flask_setenforce",
- (PyCFunction)pyflask_setenforce,
- METH_KEYWORDS, "\n"
- "Modifies the current mode for the Flask XSM module.\n"
- " mode [int]: mode to change to\n"
- "Returns: [int]: 0 on success; -1 on failure.\n" },
-
- { "flask_access",
- (PyCFunction)pyflask_access,
- METH_KEYWORDS, "\n"
- "Returns whether a source context has access to target context based on \
- class and permissions requested.\n"
- " scon [str]: source context\n"
- " tcon [str]: target context\n"
- " tclass [int]: target security class\n"
- " req [int] requested permissions\n"
- " allowed [int] permissions allow for the target class between the source \
- and target context\n"
- " decided [int] the permissions that were returned in the allowed \
- parameter\n"
- " auditallow [int] permissions set to audit on allow\n"
- " auditdeny [int] permissions set to audit on deny\n"
- " seqno [int] not used\n"
- "Returns: [int]: 0 on all permission granted; -1 if any permissions are \
- denied\n" },
-
{ NULL, NULL, 0, NULL }
};
@@ -2958,11 +233,6 @@ PyMODINIT_FUNC initxc(void)
Py_INCREF(xc_error_obj);
PyModule_AddObject(m, "Error", xc_error_obj);
-
- /* Expose some libxc constants to Python */
- PyModule_AddIntConstant(m, "XEN_SCHEDULER_CREDIT", XEN_SCHEDULER_CREDIT);
- PyModule_AddIntConstant(m, "XEN_SCHEDULER_CREDIT2", XEN_SCHEDULER_CREDIT2);
-
}
--
2.1.4
^ permalink raw reply related [flat|nested] 31+ messages in thread
* Re: [PATCH] tools: remove unused wrappers for python
2015-10-06 10:46 [PATCH] tools: remove unused wrappers for python Juergen Gross
@ 2015-10-06 11:18 ` Wei Liu
2015-10-06 11:33 ` Juergen Gross
2015-10-07 2:58 ` Marek Marczykowski-Górecki
0 siblings, 2 replies; 31+ messages in thread
From: Wei Liu @ 2015-10-06 11:18 UTC (permalink / raw)
To: Juergen Gross
Cc: wei.liu2, Ian.Campbell, stefano.stabellini, Andrew Cooper,
ian.jackson, xen-devel, zhigang.x.wang
On Tue, Oct 06, 2015 at 12:46:08PM +0200, Juergen Gross wrote:
> Remove lots of functions in tools/python/xen/lowlevel/xc/xc.c as they
> are not used anywhere in the tree. In fact only one function is still
> being used from pygrub, namely "xeninfo". All other users seem to have
> gone with nuking xm/xend.
>
> Signed-off-by: Juergen Gross <jgross@suse.com>
Andrew said the python module is useful for debugging purpose. There are
out-of-tree users as well.
I'm not too fussed about either keeping these functions or removing
them. But I would like to leave some time for other people to object.
Do these dead functions affect the work you are doing?
Wei.
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH] tools: remove unused wrappers for python
2015-10-06 11:18 ` Wei Liu
@ 2015-10-06 11:33 ` Juergen Gross
2015-10-06 11:39 ` Wei Liu
2015-10-07 2:58 ` Marek Marczykowski-Górecki
1 sibling, 1 reply; 31+ messages in thread
From: Juergen Gross @ 2015-10-06 11:33 UTC (permalink / raw)
To: Wei Liu
Cc: Ian.Campbell, stefano.stabellini, Andrew Cooper, ian.jackson,
xen-devel, zhigang.x.wang
On 10/06/2015 01:18 PM, Wei Liu wrote:
> On Tue, Oct 06, 2015 at 12:46:08PM +0200, Juergen Gross wrote:
>> Remove lots of functions in tools/python/xen/lowlevel/xc/xc.c as they
>> are not used anywhere in the tree. In fact only one function is still
>> being used from pygrub, namely "xeninfo". All other users seem to have
>> gone with nuking xm/xend.
>>
>> Signed-off-by: Juergen Gross <jgross@suse.com>
>
> Andrew said the python module is useful for debugging purpose. There are
> out-of-tree users as well.
>
> I'm not too fussed about either keeping these functions or removing
> them. But I would like to leave some time for other people to object.
>
> Do these dead functions affect the work you are doing?
I stumbled over them when looking to make some domain builder data
private to the domain type (here: superpages).
In general I don't like those wrappers very much, as they are not very
maintainable. It's rather easy to miss incrementing a python reference
or to mess up the parameter types and names when calling
PyArg_ParseTupleAndKeywords() (you have to match the kwd_list, the
types of the parameters and the parameters themselves by hand).
BTW: I've been told it's possible to use any shared library from Python,
so there should be no need for a wrapper like this just for debugging
purposes.
Juergen
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH] tools: remove unused wrappers for python
2015-10-06 11:33 ` Juergen Gross
@ 2015-10-06 11:39 ` Wei Liu
2015-10-06 13:40 ` Ian Campbell
0 siblings, 1 reply; 31+ messages in thread
From: Wei Liu @ 2015-10-06 11:39 UTC (permalink / raw)
To: Juergen Gross
Cc: Wei Liu, Ian.Campbell, stefano.stabellini, Andrew Cooper,
ian.jackson, xen-devel, zhigang.x.wang
On Tue, Oct 06, 2015 at 01:33:54PM +0200, Juergen Gross wrote:
> On 10/06/2015 01:18 PM, Wei Liu wrote:
> >On Tue, Oct 06, 2015 at 12:46:08PM +0200, Juergen Gross wrote:
> >>Remove lots of functions in tools/python/xen/lowlevel/xc/xc.c as they
> >>are not used anywhere in the tree. In fact only one function is still
> >>being used from pygrub, namely "xeninfo". All other users seem to have
> >>gone with nuking xm/xend.
> >>
> >>Signed-off-by: Juergen Gross <jgross@suse.com>
> >
> >Andrew said the python module is useful for debugging purpose. There are
> >out-of-tree users as well.
> >
> >I'm not too fussed about either keeping these functions or removing
> >them. But I would like to leave some time for other people to object.
> >
> >Do these dead functions affect the work you are doing?
>
> I stumbled over them when looking to make some domain builder data
> private to the domain type (here: superpages).
>
Right. Then I'm keen on removing them.
> In general I don't like those wrappers very much, as they are not very
> maintainable. It's rather easy to miss incrementing a python reference
> or to mess up the parameter types and names when calling
> PyArg_ParseTupleAndKeywords() (you have to match the kwd_list, the
> types of the parameters and the parameters themselves by hand).
>
> BTW: I've been told it's possible to use any shared library from Python,
> so there should be no need for a wrapper like this just for debugging
> purposes.
>
Good to know. Learn something new everyday!
And for the record, if my google-fu doesn't fail me, it's possible to
load shared library into python interpreter using "dl" module in 2.7 and
"ctypes" module in 3.x.
Wei.
>
> Juergen
>
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH] tools: remove unused wrappers for python
2015-10-06 11:39 ` Wei Liu
@ 2015-10-06 13:40 ` Ian Campbell
2015-10-06 14:51 ` Juergen Gross
0 siblings, 1 reply; 31+ messages in thread
From: Ian Campbell @ 2015-10-06 13:40 UTC (permalink / raw)
To: Wei Liu, Juergen Gross
Cc: stefano.stabellini, Andrew Cooper, ian.jackson, xen-devel,
zhigang.x.wang
On Tue, 2015-10-06 at 12:39 +0100, Wei Liu wrote:
> And for the record, if my google-fu doesn't fail me, it's possible to
> load shared library into python interpreter using "dl" module in 2.7 and
> "ctypes" module in 3.x.
Possible, but not especially convenient since you need to convert the C
prototype manually, plus the result is not necessarily very "pythonic".
I could totally see why people would prefer these bindings (or an argument
for us providing a ctypes based wrapper).
Ian.
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH] tools: remove unused wrappers for python
2015-10-06 13:40 ` Ian Campbell
@ 2015-10-06 14:51 ` Juergen Gross
2015-10-06 15:11 ` Ian Campbell
2015-10-06 15:24 ` Zhigang Wang
0 siblings, 2 replies; 31+ messages in thread
From: Juergen Gross @ 2015-10-06 14:51 UTC (permalink / raw)
To: Ian Campbell, Wei Liu
Cc: Andrew Cooper, xen-devel, ian.jackson, zhigang.x.wang,
stefano.stabellini
On 10/06/2015 03:40 PM, Ian Campbell wrote:
> On Tue, 2015-10-06 at 12:39 +0100, Wei Liu wrote:
>
>> And for the record, if my google-fu doesn't fail me, it's possible to
>> load shared library into python interpreter using "dl" module in 2.7 and
>> "ctypes" module in 3.x.
>
> Possible, but not especially convenient since you need to convert the C
> prototype manually, plus the result is not necessarily very "pythonic".
>
> I could totally see why people would prefer these bindings (or an argument
> for us providing a ctypes based wrapper).
How often is such a debugging interface being used? Please consider
the amount of code (my patch removed nearly 3000 lines of code!) and
the availability of the xl wrapper.
Juergen
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH] tools: remove unused wrappers for python
2015-10-06 14:51 ` Juergen Gross
@ 2015-10-06 15:11 ` Ian Campbell
2015-10-06 15:21 ` Juergen Gross
2015-10-06 15:24 ` Zhigang Wang
1 sibling, 1 reply; 31+ messages in thread
From: Ian Campbell @ 2015-10-06 15:11 UTC (permalink / raw)
To: Juergen Gross, Wei Liu
Cc: Andrew Cooper, xen-devel, ian.jackson, zhigang.x.wang,
stefano.stabellini
On Tue, 2015-10-06 at 16:51 +0200, Juergen Gross wrote:
> On 10/06/2015 03:40 PM, Ian Campbell wrote:
> > On Tue, 2015-10-06 at 12:39 +0100, Wei Liu wrote:
> >
> > > And for the record, if my google-fu doesn't fail me, it's possible to
> > > load shared library into python interpreter using "dl" module in 2.7
> > > and
> > > "ctypes" module in 3.x.
> >
> > Possible, but not especially convenient since you need to convert the C
> > prototype manually, plus the result is not necessarily very "pythonic".
> >
> > I could totally see why people would prefer these bindings (or an
> > argument
> > for us providing a ctypes based wrapper).
>
> How often is such a debugging interface being used? Please consider
> the amount of code (my patch removed nearly 3000 lines of code!) and
> the availability of the xl wrapper.
My understanding was that this was used by the "xen-bugtool" stuff in
XenServer, so for actual functionality (gathering debug info) and not
debugging (I supposed that the reference to being used for debugging was
due to the name of the tool).
Ian.
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH] tools: remove unused wrappers for python
2015-10-06 15:11 ` Ian Campbell
@ 2015-10-06 15:21 ` Juergen Gross
2015-10-06 15:26 ` Ian Campbell
0 siblings, 1 reply; 31+ messages in thread
From: Juergen Gross @ 2015-10-06 15:21 UTC (permalink / raw)
To: Ian Campbell, Wei Liu
Cc: Andrew Cooper, xen-devel, ian.jackson, zhigang.x.wang,
stefano.stabellini
On 10/06/2015 05:11 PM, Ian Campbell wrote:
> On Tue, 2015-10-06 at 16:51 +0200, Juergen Gross wrote:
>> On 10/06/2015 03:40 PM, Ian Campbell wrote:
>>> On Tue, 2015-10-06 at 12:39 +0100, Wei Liu wrote:
>>>
>>>> And for the record, if my google-fu doesn't fail me, it's possible to
>>>> load shared library into python interpreter using "dl" module in 2.7
>>>> and
>>>> "ctypes" module in 3.x.
>>>
>>> Possible, but not especially convenient since you need to convert the C
>>> prototype manually, plus the result is not necessarily very "pythonic".
>>>
>>> I could totally see why people would prefer these bindings (or an
>>> argument
>>> for us providing a ctypes based wrapper).
>>
>> How often is such a debugging interface being used? Please consider
>> the amount of code (my patch removed nearly 3000 lines of code!) and
>> the availability of the xl wrapper.
>
> My understanding was that this was used by the "xen-bugtool" stuff in
> XenServer, so for actual functionality (gathering debug info) and not
> debugging (I supposed that the reference to being used for debugging was
> due to the name of the tool).
And this functionality isn't available via the xl bindings?
I always thought that a use case like this was one of the motivations
to introduce libxl.
Juergen
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH] tools: remove unused wrappers for python
2015-10-06 14:51 ` Juergen Gross
2015-10-06 15:11 ` Ian Campbell
@ 2015-10-06 15:24 ` Zhigang Wang
2015-10-08 14:38 ` Ian Campbell
1 sibling, 1 reply; 31+ messages in thread
From: Zhigang Wang @ 2015-10-06 15:24 UTC (permalink / raw)
To: Juergen Gross, Ian Campbell, Wei Liu
Cc: Andrew Cooper, xen-devel, ian.jackson, stefano.stabellini
On 10/06/2015 10:51 AM, Juergen Gross wrote:
> On 10/06/2015 03:40 PM, Ian Campbell wrote:
>> On Tue, 2015-10-06 at 12:39 +0100, Wei Liu wrote:
>>
>>> And for the record, if my google-fu doesn't fail me, it's possible to
>>> load shared library into python interpreter using "dl" module in 2.7 and
>>> "ctypes" module in 3.x.
>>
>> Possible, but not especially convenient since you need to convert the C
>> prototype manually, plus the result is not necessarily very "pythonic".
>>
>> I could totally see why people would prefer these bindings (or an argument
>> for us providing a ctypes based wrapper).
>
> How often is such a debugging interface being used? Please consider
> the amount of code (my patch removed nearly 3000 lines of code!) and
> the availability of the xl wrapper.
We use these extentions along with xend XMLRPC API/xm. Even when move to
xl, this will give us a choice to reserve some logic.
Thanks,
Zhigang
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH] tools: remove unused wrappers for python
2015-10-06 15:21 ` Juergen Gross
@ 2015-10-06 15:26 ` Ian Campbell
2015-10-06 15:30 ` Zhigang Wang
2015-10-06 15:38 ` Andrew Cooper
0 siblings, 2 replies; 31+ messages in thread
From: Ian Campbell @ 2015-10-06 15:26 UTC (permalink / raw)
To: Juergen Gross, Wei Liu
Cc: Andrew Cooper, xen-devel, ian.jackson, zhigang.x.wang,
stefano.stabellini
On Tue, 2015-10-06 at 17:21 +0200, Juergen Gross wrote:
> On 10/06/2015 05:11 PM, Ian Campbell wrote:
> > On Tue, 2015-10-06 at 16:51 +0200, Juergen Gross wrote:
> > > On 10/06/2015 03:40 PM, Ian Campbell wrote:
> > > > On Tue, 2015-10-06 at 12:39 +0100, Wei Liu wrote:
> > > >
> > > > > And for the record, if my google-fu doesn't fail me, it's
> > > > > possible to
> > > > > load shared library into python interpreter using "dl" module in
> > > > > 2.7
> > > > > and
> > > > > "ctypes" module in 3.x.
> > > >
> > > > Possible, but not especially convenient since you need to convert
> > > > the C
> > > > prototype manually, plus the result is not necessarily very
> > > > "pythonic".
> > > >
> > > > I could totally see why people would prefer these bindings (or an
> > > > argument
> > > > for us providing a ctypes based wrapper).
> > >
> > > How often is such a debugging interface being used? Please consider
> > > the amount of code (my patch removed nearly 3000 lines of code!) and
> > > the availability of the xl wrapper.
> >
> > My understanding was that this was used by the "xen-bugtool" stuff in
> > XenServer, so for actual functionality (gathering debug info) and not
> > debugging (I supposed that the reference to being used for debugging was
> > due to the name of the tool).
>
> And this functionality isn't available via the xl bindings?
I don't know, we'll have to wait for those who are using it to chime in.
Ian.
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH] tools: remove unused wrappers for python
2015-10-06 15:26 ` Ian Campbell
@ 2015-10-06 15:30 ` Zhigang Wang
2015-10-06 15:45 ` Ian Campbell
2015-10-06 15:38 ` Andrew Cooper
1 sibling, 1 reply; 31+ messages in thread
From: Zhigang Wang @ 2015-10-06 15:30 UTC (permalink / raw)
To: Ian Campbell
Cc: Juergen Gross, Wei Liu, stefano.stabellini, Andrew Cooper,
ian.jackson, xen-devel
On 10/06/2015 11:26 AM, Ian Campbell wrote:
> On Tue, 2015-10-06 at 17:21 +0200, Juergen Gross wrote:
>> On 10/06/2015 05:11 PM, Ian Campbell wrote:
>>> On Tue, 2015-10-06 at 16:51 +0200, Juergen Gross wrote:
>>>> On 10/06/2015 03:40 PM, Ian Campbell wrote:
>>>>> On Tue, 2015-10-06 at 12:39 +0100, Wei Liu wrote:
>>>>>
>>>>>> And for the record, if my google-fu doesn't fail me, it's
>>>>>> possible to
>>>>>> load shared library into python interpreter using "dl" module in
>>>>>> 2.7
>>>>>> and
>>>>>> "ctypes" module in 3.x.
>>>>>
>>>>> Possible, but not especially convenient since you need to convert
>>>>> the C
>>>>> prototype manually, plus the result is not necessarily very
>>>>> "pythonic".
>>>>>
>>>>> I could totally see why people would prefer these bindings (or an
>>>>> argument
>>>>> for us providing a ctypes based wrapper).
>>>>
>>>> How often is such a debugging interface being used? Please consider
>>>> the amount of code (my patch removed nearly 3000 lines of code!) and
>>>> the availability of the xl wrapper.
>>>
>>> My understanding was that this was used by the "xen-bugtool" stuff in
>>> XenServer, so for actual functionality (gathering debug info) and not
>>> debugging (I supposed that the reference to being used for debugging was
>>> due to the name of the tool).
>>
>> And this functionality isn't available via the xl bindings?
>
> I don't know, we'll have to wait for those who are using it to chime in.
>
> Ian.
IanC: I remember you said xl bindings has some design issue and should not
be used. Is it still the case today?
Zhigang
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH] tools: remove unused wrappers for python
2015-10-06 15:26 ` Ian Campbell
2015-10-06 15:30 ` Zhigang Wang
@ 2015-10-06 15:38 ` Andrew Cooper
2015-10-06 16:31 ` Wei Liu
1 sibling, 1 reply; 31+ messages in thread
From: Andrew Cooper @ 2015-10-06 15:38 UTC (permalink / raw)
To: Ian Campbell, Juergen Gross, Wei Liu
Cc: zhigang.x.wang, xen-devel, ian.jackson, stefano.stabellini
On 06/10/15 16:26, Ian Campbell wrote:
> On Tue, 2015-10-06 at 17:21 +0200, Juergen Gross wrote:
>> On 10/06/2015 05:11 PM, Ian Campbell wrote:
>>> On Tue, 2015-10-06 at 16:51 +0200, Juergen Gross wrote:
>>>> On 10/06/2015 03:40 PM, Ian Campbell wrote:
>>>>> On Tue, 2015-10-06 at 12:39 +0100, Wei Liu wrote:
>>>>>
>>>>>> And for the record, if my google-fu doesn't fail me, it's
>>>>>> possible to
>>>>>> load shared library into python interpreter using "dl" module in
>>>>>> 2.7
>>>>>> and
>>>>>> "ctypes" module in 3.x.
>>>>> Possible, but not especially convenient since you need to convert
>>>>> the C
>>>>> prototype manually, plus the result is not necessarily very
>>>>> "pythonic".
>>>>>
>>>>> I could totally see why people would prefer these bindings (or an
>>>>> argument
>>>>> for us providing a ctypes based wrapper).
>>>> How often is such a debugging interface being used? Please consider
>>>> the amount of code (my patch removed nearly 3000 lines of code!) and
>>>> the availability of the xl wrapper.
>>> My understanding was that this was used by the "xen-bugtool" stuff in
>>> XenServer, so for actual functionality (gathering debug info) and not
>>> debugging (I supposed that the reference to being used for debugging was
>>> due to the name of the tool).
>> And this functionality isn't available via the xl bindings?
> I don't know, we'll have to wait for those who are using it to chime in.
The python xl bindings? They don't even compile.
They really should be deleted - anyone wishing to resurrect them can
find them in source history.
~Andrew
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH] tools: remove unused wrappers for python
2015-10-06 15:30 ` Zhigang Wang
@ 2015-10-06 15:45 ` Ian Campbell
2015-10-06 16:14 ` Juergen Gross
0 siblings, 1 reply; 31+ messages in thread
From: Ian Campbell @ 2015-10-06 15:45 UTC (permalink / raw)
To: Zhigang Wang
Cc: Juergen Gross, Wei Liu, stefano.stabellini, Andrew Cooper,
ian.jackson, xen-devel
On Tue, 2015-10-06 at 11:30 -0400, Zhigang Wang wrote:
> On 10/06/2015 11:26 AM, Ian Campbell wrote:
> > On Tue, 2015-10-06 at 17:21 +0200, Juergen Gross wrote:
> > > On 10/06/2015 05:11 PM, Ian Campbell wrote:
> > > > On Tue, 2015-10-06 at 16:51 +0200, Juergen Gross wrote:
> > > > > On 10/06/2015 03:40 PM, Ian Campbell wrote:
> > > > > > On Tue, 2015-10-06 at 12:39 +0100, Wei Liu wrote:
> > > > > >
> > > > > > > And for the record, if my google-fu doesn't fail me, it's
> > > > > > > possible to
> > > > > > > load shared library into python interpreter using "dl" module
> > > > > > > in
> > > > > > > 2.7
> > > > > > > and
> > > > > > > "ctypes" module in 3.x.
> > > > > >
> > > > > > Possible, but not especially convenient since you need to
> > > > > > convert
> > > > > > the C
> > > > > > prototype manually, plus the result is not necessarily very
> > > > > > "pythonic".
> > > > > >
> > > > > > I could totally see why people would prefer these bindings (or
> > > > > > an
> > > > > > argument
> > > > > > for us providing a ctypes based wrapper).
> > > > >
> > > > > How often is such a debugging interface being used? Please
> > > > > consider
> > > > > the amount of code (my patch removed nearly 3000 lines of code!)
> > > > > and
> > > > > the availability of the xl wrapper.
> > > >
> > > > My understanding was that this was used by the "xen-bugtool" stuff
> > > > in
> > > > XenServer, so for actual functionality (gathering debug info) and
> > > > not
> > > > debugging (I supposed that the reference to being used for
> > > > debugging was
> > > > due to the name of the tool).
> > >
> > > And this functionality isn't available via the xl bindings?
> >
> > I don't know, we'll have to wait for those who are using it to chime
> > in.
> >
> > Ian.
>
> IanC: I remember you said xl bindings has some design issue and should
> not be used. Is it still the case today?
Yes.
Sorry, I read Juergen's original "via the xl bindings" as "via libxl", i.e.
by using the library directly and forgot about the need for python bindings
.
Ian.
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH] tools: remove unused wrappers for python
2015-10-06 15:45 ` Ian Campbell
@ 2015-10-06 16:14 ` Juergen Gross
2015-10-06 16:24 ` Ian Campbell
0 siblings, 1 reply; 31+ messages in thread
From: Juergen Gross @ 2015-10-06 16:14 UTC (permalink / raw)
To: Ian Campbell, Zhigang Wang
Cc: Andrew Cooper, xen-devel, Wei Liu, ian.jackson,
stefano.stabellini
On 10/06/2015 05:45 PM, Ian Campbell wrote:
> On Tue, 2015-10-06 at 11:30 -0400, Zhigang Wang wrote:
>> On 10/06/2015 11:26 AM, Ian Campbell wrote:
>>> On Tue, 2015-10-06 at 17:21 +0200, Juergen Gross wrote:
>>>> On 10/06/2015 05:11 PM, Ian Campbell wrote:
>>>>> On Tue, 2015-10-06 at 16:51 +0200, Juergen Gross wrote:
>>>>>> On 10/06/2015 03:40 PM, Ian Campbell wrote:
>>>>>>> On Tue, 2015-10-06 at 12:39 +0100, Wei Liu wrote:
>>>>>>>
>>>>>>>> And for the record, if my google-fu doesn't fail me, it's
>>>>>>>> possible to
>>>>>>>> load shared library into python interpreter using "dl" module
>>>>>>>> in
>>>>>>>> 2.7
>>>>>>>> and
>>>>>>>> "ctypes" module in 3.x.
>>>>>>>
>>>>>>> Possible, but not especially convenient since you need to
>>>>>>> convert
>>>>>>> the C
>>>>>>> prototype manually, plus the result is not necessarily very
>>>>>>> "pythonic".
>>>>>>>
>>>>>>> I could totally see why people would prefer these bindings (or
>>>>>>> an
>>>>>>> argument
>>>>>>> for us providing a ctypes based wrapper).
>>>>>>
>>>>>> How often is such a debugging interface being used? Please
>>>>>> consider
>>>>>> the amount of code (my patch removed nearly 3000 lines of code!)
>>>>>> and
>>>>>> the availability of the xl wrapper.
>>>>>
>>>>> My understanding was that this was used by the "xen-bugtool" stuff
>>>>> in
>>>>> XenServer, so for actual functionality (gathering debug info) and
>>>>> not
>>>>> debugging (I supposed that the reference to being used for
>>>>> debugging was
>>>>> due to the name of the tool).
>>>>
>>>> And this functionality isn't available via the xl bindings?
>>>
>>> I don't know, we'll have to wait for those who are using it to chime
>>> in.
>>>
>>> Ian.
>>
>> IanC: I remember you said xl bindings has some design issue and should
>> not be used. Is it still the case today?
>
> Yes.
>
> Sorry, I read Juergen's original "via the xl bindings" as "via libxl", i.e.
> by using the library directly and forgot about the need for python bindings
Uuh, too bad.
So I should change my patch to remove the xl bindings? ;-)
And what about xc bindings? What do I have to keep? Everything for xm
and xend? Some bindings for your out-of-tree bugtool (can't this be
converted to an in-tree tool written in C dumping out the information
which is then post-processed with python) ?
The original motivation was to get rid of the "superpages" option when
building a pv-domU. If I have to keep xend compatibility I can't
remove it.
Juergen
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH] tools: remove unused wrappers for python
2015-10-06 16:14 ` Juergen Gross
@ 2015-10-06 16:24 ` Ian Campbell
2015-10-08 1:10 ` Konrad Rzeszutek Wilk
0 siblings, 1 reply; 31+ messages in thread
From: Ian Campbell @ 2015-10-06 16:24 UTC (permalink / raw)
To: Juergen Gross, Zhigang Wang
Cc: Andrew Cooper, xen-devel, Wei Liu, ian.jackson,
stefano.stabellini
On Tue, 2015-10-06 at 18:14 +0200, Juergen Gross wrote:
> The original motivation was to get rid of the "superpages" option when
> building a pv-domU.
It's suffered rather from feature creep then, since removing that one
interface seems like much less of a problem[0] than a wholesale skewering
of bindings of entire librarier or even just cherry-picking the things no
one is using and removing those.
It's worth trying to clean up these legacy things occasionally and seeing
who complains, but when someone does complain its usually time to step back
and examine what the actual goal is and what the path to that place is.
Unless you have the stomach for helping manage a transition away from the
parts of these bindings that people are still using then I'd suggest just
leaving it alone and concentrating on the superpages thing and whether that
can be removed or what needs to happen first etc.
Ian.
[0] although we are still waiting for Konrad's reply on that one in the
relevant thread.
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH] tools: remove unused wrappers for python
2015-10-06 15:38 ` Andrew Cooper
@ 2015-10-06 16:31 ` Wei Liu
2015-10-06 16:38 ` Ian Campbell
0 siblings, 1 reply; 31+ messages in thread
From: Wei Liu @ 2015-10-06 16:31 UTC (permalink / raw)
To: Andrew Cooper
Cc: Juergen Gross, Wei Liu, Ian Campbell, stefano.stabellini,
ian.jackson, xen-devel, zhigang.x.wang
On Tue, Oct 06, 2015 at 04:38:08PM +0100, Andrew Cooper wrote:
> On 06/10/15 16:26, Ian Campbell wrote:
> > On Tue, 2015-10-06 at 17:21 +0200, Juergen Gross wrote:
> >> On 10/06/2015 05:11 PM, Ian Campbell wrote:
> >>> On Tue, 2015-10-06 at 16:51 +0200, Juergen Gross wrote:
> >>>> On 10/06/2015 03:40 PM, Ian Campbell wrote:
> >>>>> On Tue, 2015-10-06 at 12:39 +0100, Wei Liu wrote:
> >>>>>
> >>>>>> And for the record, if my google-fu doesn't fail me, it's
> >>>>>> possible to
> >>>>>> load shared library into python interpreter using "dl" module in
> >>>>>> 2.7
> >>>>>> and
> >>>>>> "ctypes" module in 3.x.
> >>>>> Possible, but not especially convenient since you need to convert
> >>>>> the C
> >>>>> prototype manually, plus the result is not necessarily very
> >>>>> "pythonic".
> >>>>>
> >>>>> I could totally see why people would prefer these bindings (or an
> >>>>> argument
> >>>>> for us providing a ctypes based wrapper).
> >>>> How often is such a debugging interface being used? Please consider
> >>>> the amount of code (my patch removed nearly 3000 lines of code!) and
> >>>> the availability of the xl wrapper.
> >>> My understanding was that this was used by the "xen-bugtool" stuff in
> >>> XenServer, so for actual functionality (gathering debug info) and not
> >>> debugging (I supposed that the reference to being used for debugging was
> >>> due to the name of the tool).
> >> And this functionality isn't available via the xl bindings?
> > I don't know, we'll have to wait for those who are using it to chime in.
>
> The python xl bindings? They don't even compile.
Urgh. It does compile for me.
>
> They really should be deleted - anyone wishing to resurrect them can
> find them in source history.
>
But if nobody wants it I don't mind submitting a patch to delete it
altogether.
Wei.
> ~Andrew
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH] tools: remove unused wrappers for python
2015-10-06 16:31 ` Wei Liu
@ 2015-10-06 16:38 ` Ian Campbell
2015-10-06 16:42 ` Wei Liu
0 siblings, 1 reply; 31+ messages in thread
From: Ian Campbell @ 2015-10-06 16:38 UTC (permalink / raw)
To: Wei Liu, Andrew Cooper
Cc: Juergen Gross, zhigang.x.wang, xen-devel, ian.jackson,
stefano.stabellini
On Tue, 2015-10-06 at 17:31 +0100, Wei Liu wrote:
> On Tue, Oct 06, 2015 at 04:38:08PM +0100, Andrew Cooper wrote:
> > On 06/10/15 16:26, Ian Campbell wrote:
> > > On Tue, 2015-10-06 at 17:21 +0200, Juergen Gross wrote:
> > > > On 10/06/2015 05:11 PM, Ian Campbell wrote:
> > > > > On Tue, 2015-10-06 at 16:51 +0200, Juergen Gross wrote:
> > > > > > On 10/06/2015 03:40 PM, Ian Campbell wrote:
> > > > > > > On Tue, 2015-10-06 at 12:39 +0100, Wei Liu wrote:
> > > > > > >
> > > > > > > > And for the record, if my google-fu doesn't fail me, it's
> > > > > > > > possible to
> > > > > > > > load shared library into python interpreter using "dl"
> > > > > > > > module in
> > > > > > > > 2.7
> > > > > > > > and
> > > > > > > > "ctypes" module in 3.x.
> > > > > > > Possible, but not especially convenient since you need to
> > > > > > > convert
> > > > > > > the C
> > > > > > > prototype manually, plus the result is not necessarily very
> > > > > > > "pythonic".
> > > > > > >
> > > > > > > I could totally see why people would prefer these bindings
> > > > > > > (or an
> > > > > > > argument
> > > > > > > for us providing a ctypes based wrapper).
> > > > > > How often is such a debugging interface being used? Please
> > > > > > consider
> > > > > > the amount of code (my patch removed nearly 3000 lines of
> > > > > > code!) and
> > > > > > the availability of the xl wrapper.
> > > > > My understanding was that this was used by the "xen-bugtool"
> > > > > stuff in
> > > > > XenServer, so for actual functionality (gathering debug info) and
> > > > > not
> > > > > debugging (I supposed that the reference to being used for
> > > > > debugging was
> > > > > due to the name of the tool).
> > > > And this functionality isn't available via the xl bindings?
> > > I don't know, we'll have to wait for those who are using it to chime
> > > in.
> >
> > The python xl bindings? They don't even compile.
>
> Urgh. It does compile for me.
Are you talking about tools/python/xen/lowlevel/xl/? Because that seems
unlikely.
In any case they certain don't work, they have a model for updating the C
versions of the data structures in sync with the python code, as opposed to
marshalling in and out around the libxl calls like the other language
bindings do, which is IIRC broken wrt at least nested structures and keyed
unions IIRC (and probably other stuff now).
Ian.
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH] tools: remove unused wrappers for python
2015-10-06 16:38 ` Ian Campbell
@ 2015-10-06 16:42 ` Wei Liu
0 siblings, 0 replies; 31+ messages in thread
From: Wei Liu @ 2015-10-06 16:42 UTC (permalink / raw)
To: Ian Campbell
Cc: Juergen Gross, Wei Liu, stefano.stabellini, Andrew Cooper,
ian.jackson, xen-devel, zhigang.x.wang
On Tue, Oct 06, 2015 at 05:38:42PM +0100, Ian Campbell wrote:
> On Tue, 2015-10-06 at 17:31 +0100, Wei Liu wrote:
> > On Tue, Oct 06, 2015 at 04:38:08PM +0100, Andrew Cooper wrote:
> > > On 06/10/15 16:26, Ian Campbell wrote:
> > > > On Tue, 2015-10-06 at 17:21 +0200, Juergen Gross wrote:
> > > > > On 10/06/2015 05:11 PM, Ian Campbell wrote:
> > > > > > On Tue, 2015-10-06 at 16:51 +0200, Juergen Gross wrote:
> > > > > > > On 10/06/2015 03:40 PM, Ian Campbell wrote:
> > > > > > > > On Tue, 2015-10-06 at 12:39 +0100, Wei Liu wrote:
> > > > > > > >
> > > > > > > > > And for the record, if my google-fu doesn't fail me, it's
> > > > > > > > > possible to
> > > > > > > > > load shared library into python interpreter using "dl"
> > > > > > > > > module in
> > > > > > > > > 2.7
> > > > > > > > > and
> > > > > > > > > "ctypes" module in 3.x.
> > > > > > > > Possible, but not especially convenient since you need to
> > > > > > > > convert
> > > > > > > > the C
> > > > > > > > prototype manually, plus the result is not necessarily very
> > > > > > > > "pythonic".
> > > > > > > >
> > > > > > > > I could totally see why people would prefer these bindings
> > > > > > > > (or an
> > > > > > > > argument
> > > > > > > > for us providing a ctypes based wrapper).
> > > > > > > How often is such a debugging interface being used? Please
> > > > > > > consider
> > > > > > > the amount of code (my patch removed nearly 3000 lines of
> > > > > > > code!) and
> > > > > > > the availability of the xl wrapper.
> > > > > > My understanding was that this was used by the "xen-bugtool"
> > > > > > stuff in
> > > > > > XenServer, so for actual functionality (gathering debug info) and
> > > > > > not
> > > > > > debugging (I supposed that the reference to being used for
> > > > > > debugging was
> > > > > > due to the name of the tool).
> > > > > And this functionality isn't available via the xl bindings?
> > > > I don't know, we'll have to wait for those who are using it to chime
> > > > in.
> > >
> > > The python xl bindings? They don't even compile.
> >
> > Urgh. It does compile for me.
>
> Are you talking about tools/python/xen/lowlevel/xl/? Because that seems
> unlikely.
>
Yes. That one. It successfully built a xl.so, along with xs.so and
xc.so.
weil@zion:/local/scratch/xen.git$ file tools/python/build/lib.linux-x86_64-2.7/xen/lowlevel/xl.so
tools/python/build/lib.linux-x86_64-2.7/xen/lowlevel/xl.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=e164a1e0f97a1c92fa10ef7b4b7b5918abacbec5, not stripped
TBH I have no idea why. I don't particularly care about this thing
either, just want to make sure we're on the same page talking about the
same thing.
> In any case they certain don't work, they have a model for updating the C
> versions of the data structures in sync with the python code, as opposed to
> marshalling in and out around the libxl calls like the other language
> bindings do, which is IIRC broken wrt at least nested structures and keyed
> unions IIRC (and probably other stuff now).
>
OK then. I will just send a patch to delete it.
Wei.
> Ian.
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH] tools: remove unused wrappers for python
2015-10-06 11:18 ` Wei Liu
2015-10-06 11:33 ` Juergen Gross
@ 2015-10-07 2:58 ` Marek Marczykowski-Górecki
1 sibling, 0 replies; 31+ messages in thread
From: Marek Marczykowski-Górecki @ 2015-10-07 2:58 UTC (permalink / raw)
To: Wei Liu
Cc: Juergen Gross, Ian.Campbell, stefano.stabellini, Andrew Cooper,
ian.jackson, xen-devel, zhigang.x.wang
[-- Attachment #1.1: Type: text/plain, Size: 1440 bytes --]
On Tue, Oct 06, 2015 at 12:18:50PM +0100, Wei Liu wrote:
> On Tue, Oct 06, 2015 at 12:46:08PM +0200, Juergen Gross wrote:
> > Remove lots of functions in tools/python/xen/lowlevel/xc/xc.c as they
> > are not used anywhere in the tree. In fact only one function is still
> > being used from pygrub, namely "xeninfo". All other users seem to have
> > gone with nuking xm/xend.
> >
> > Signed-off-by: Juergen Gross <jgross@suse.com>
>
> Andrew said the python module is useful for debugging purpose. There are
> out-of-tree users as well.
>
> I'm not too fussed about either keeping these functions or removing
> them. But I would like to leave some time for other people to object.
In QubesOS we use xc bindings. In the most recent version only for
memory managing (domain_set_target_mem, domain_setmaxmem,
domain_getinfo, physinfo).
https://github.com/QubesOS/qubes-core-admin/blob/master/qmemman/qmemman.py
This is used for real-time memory adjustment based on domain needs
(think: give domain more memory when needed, before it start swapping),
so directly manipulating with xc/xs is preferred over much slower
alternatives like libvirt. Libxl would be probably enough, but libxl
python bindings effectively doesn't exists.
--
Best Regards,
Marek Marczykowski-Górecki
Invisible Things Lab
A: Because it messes up the order in which people normally read text.
Q: Why is top-posting such a bad thing?
[-- Attachment #1.2: Type: application/pgp-signature, Size: 473 bytes --]
[-- Attachment #2: Type: text/plain, Size: 126 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH] tools: remove unused wrappers for python
2015-10-06 16:24 ` Ian Campbell
@ 2015-10-08 1:10 ` Konrad Rzeszutek Wilk
2015-10-08 4:16 ` Juergen Gross
0 siblings, 1 reply; 31+ messages in thread
From: Konrad Rzeszutek Wilk @ 2015-10-08 1:10 UTC (permalink / raw)
To: Ian Campbell
Cc: Juergen Gross, Wei Liu, stefano.stabellini, Andrew Cooper,
ian.jackson, xen-devel, Zhigang Wang
On Tue, Oct 06, 2015 at 05:24:22PM +0100, Ian Campbell wrote:
> On Tue, 2015-10-06 at 18:14 +0200, Juergen Gross wrote:
>
> > The original motivation was to get rid of the "superpages" option when
> > building a pv-domU.
>
> It's suffered rather from feature creep then, since removing that one
> interface seems like much less of a problem[0] than a wholesale skewering
> of bindings of entire librarier or even just cherry-picking the things no
> one is using and removing those.
>
> It's worth trying to clean up these legacy things occasionally and seeing
> who complains, but when someone does complain its usually time to step back
> and examine what the actual goal is and what the path to that place is.
>
> Unless you have the stomach for helping manage a transition away from the
> parts of these bindings that people are still using then I'd suggest just
> leaving it alone and concentrating on the superpages thing and whether that
> can be removed or what needs to happen first etc.
>
> Ian.
>
> [0] although we are still waiting for Konrad's reply on that one in the
> relevant thread.
RIP PV superpages.
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH] tools: remove unused wrappers for python
2015-10-08 1:10 ` Konrad Rzeszutek Wilk
@ 2015-10-08 4:16 ` Juergen Gross
2015-10-08 14:30 ` Ian Campbell
0 siblings, 1 reply; 31+ messages in thread
From: Juergen Gross @ 2015-10-08 4:16 UTC (permalink / raw)
To: Konrad Rzeszutek Wilk, Ian Campbell
Cc: Wei Liu, stefano.stabellini, Andrew Cooper, ian.jackson,
xen-devel, Zhigang Wang
On 10/08/2015 03:10 AM, Konrad Rzeszutek Wilk wrote:
> On Tue, Oct 06, 2015 at 05:24:22PM +0100, Ian Campbell wrote:
>> On Tue, 2015-10-06 at 18:14 +0200, Juergen Gross wrote:
>>
>>> The original motivation was to get rid of the "superpages" option when
>>> building a pv-domU.
>>
>> It's suffered rather from feature creep then, since removing that one
>> interface seems like much less of a problem[0] than a wholesale skewering
>> of bindings of entire librarier or even just cherry-picking the things no
>> one is using and removing those.
>>
>> It's worth trying to clean up these legacy things occasionally and seeing
>> who complains, but when someone does complain its usually time to step back
>> and examine what the actual goal is and what the path to that place is.
>>
>> Unless you have the stomach for helping manage a transition away from the
>> parts of these bindings that people are still using then I'd suggest just
>> leaving it alone and concentrating on the superpages thing and whether that
>> can be removed or what needs to happen first etc.
>>
>> Ian.
>>
>> [0] although we are still waiting for Konrad's reply on that one in the
>> relevant thread.
>
> RIP PV superpages.
Okay, I'll do this as soon as Roger's domain builder patches are
committed.
Juergen
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH] tools: remove unused wrappers for python
2015-10-08 4:16 ` Juergen Gross
@ 2015-10-08 14:30 ` Ian Campbell
0 siblings, 0 replies; 31+ messages in thread
From: Ian Campbell @ 2015-10-08 14:30 UTC (permalink / raw)
To: Juergen Gross, Konrad Rzeszutek Wilk
Cc: Wei Liu, stefano.stabellini, Andrew Cooper, ian.jackson,
xen-devel, Zhigang Wang
On Thu, 2015-10-08 at 06:16 +0200, Juergen Gross wrote:
> [0] although we are still waiting for Konrad's reply on that one in
> > > the
> > > relevant thread.
> >
> > RIP PV superpages.
>
> Okay, I'll do this as soon as Roger's domain builder patches are
> committed.
I think the ones which might conflict with this are now in.
Ian.
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH] tools: remove unused wrappers for python
2015-10-06 15:24 ` Zhigang Wang
@ 2015-10-08 14:38 ` Ian Campbell
2015-10-08 15:09 ` Zhigang Wang
0 siblings, 1 reply; 31+ messages in thread
From: Ian Campbell @ 2015-10-08 14:38 UTC (permalink / raw)
To: Zhigang Wang, Juergen Gross, Wei Liu
Cc: Andrew Cooper, xen-devel, ian.jackson, stefano.stabellini
On Tue, 2015-10-06 at 11:24 -0400, Zhigang Wang wrote:
> We use these extentions along with xend XMLRPC API/xm. Even when move to
> xl, this will give us a choice to reserve some logic.
There are a lot of interfaces here, are you using all of them? If not then
could you enumerate the ones you care about please.
Ian.
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH] tools: remove unused wrappers for python
2015-10-08 14:38 ` Ian Campbell
@ 2015-10-08 15:09 ` Zhigang Wang
2015-10-08 15:27 ` Ian Campbell
0 siblings, 1 reply; 31+ messages in thread
From: Zhigang Wang @ 2015-10-08 15:09 UTC (permalink / raw)
To: Ian Campbell, Juergen Gross, Wei Liu
Cc: Andrew Cooper, xen-devel, ian.jackson, stefano.stabellini
On 10/08/2015 10:38 AM, Ian Campbell wrote:
> On Tue, 2015-10-06 at 11:24 -0400, Zhigang Wang wrote:
>> We use these extentions along with xend XMLRPC API/xm. Even when move to
>> xl, this will give us a choice to reserve some logic.
>
> There are a lot of interfaces here, are you using all of them? If not then
> could you enumerate the ones you care about please.
Currently we are using:
xc.getcpuinfo()
xc.domain_getinfo()
But after switching to xl, we cannot get info from xend any more, then some of
these interfaces may be helpful.
Thanks,
Zhigang
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH] tools: remove unused wrappers for python
2015-10-08 15:09 ` Zhigang Wang
@ 2015-10-08 15:27 ` Ian Campbell
2015-10-08 16:32 ` Zhigang Wang
0 siblings, 1 reply; 31+ messages in thread
From: Ian Campbell @ 2015-10-08 15:27 UTC (permalink / raw)
To: Zhigang Wang, Juergen Gross, Wei Liu
Cc: Andrew Cooper, xen-devel, ian.jackson, stefano.stabellini
On Thu, 2015-10-08 at 11:09 -0400, Zhigang Wang wrote:
> On 10/08/2015 10:38 AM, Ian Campbell wrote:
> > On Tue, 2015-10-06 at 11:24 -0400, Zhigang Wang wrote:
> > > We use these extentions along with xend XMLRPC API/xm. Even when move
> > > to
> > > xl, this will give us a choice to reserve some logic.
> >
> > There are a lot of interfaces here, are you using all of them? If not
> > then
> > could you enumerate the ones you care about please.
>
> Currently we are using:
>
> xc.getcpuinfo()
> xc.domain_getinfo()
Thanks.
> But after switching to xl, we cannot get info from xend any more, then some of
> these interfaces may be helpful.
Do you have any insight into what info you currently get from xend which
you don't think you can get from xl?
It may be that there are gaps in the xl functionality which should be
filled, rather than keeping the Python xc bindings around (equally there
may be things where those bindings are the best solution).
Ian.
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH] tools: remove unused wrappers for python
2015-10-08 15:27 ` Ian Campbell
@ 2015-10-08 16:32 ` Zhigang Wang
2015-10-08 16:58 ` Wei Liu
2015-10-09 4:42 ` Juergen Gross
0 siblings, 2 replies; 31+ messages in thread
From: Zhigang Wang @ 2015-10-08 16:32 UTC (permalink / raw)
To: Ian Campbell
Cc: Juergen Gross, Wei Liu, stefano.stabellini, Andrew Cooper,
ian.jackson, xen-devel
On 10/08/2015 11:27 AM, Ian Campbell wrote:
> On Thu, 2015-10-08 at 11:09 -0400, Zhigang Wang wrote:
>> On 10/08/2015 10:38 AM, Ian Campbell wrote:
>>> On Tue, 2015-10-06 at 11:24 -0400, Zhigang Wang wrote:
>>>> We use these extentions along with xend XMLRPC API/xm. Even when move
>>>> to
>>>> xl, this will give us a choice to reserve some logic.
>>>
>>> There are a lot of interfaces here, are you using all of them? If not
>>> then
>>> could you enumerate the ones you care about please.
>>
>> Currently we are using:
>>
>> xc.getcpuinfo()
>> xc.domain_getinfo()
>
> Thanks.
>
>> But after switching to xl, we cannot get info from xend any more, then some of
>> these interfaces may be helpful.
>
> Do you have any insight into what info you currently get from xend which
> you don't think you can get from xl?
>
> It may be that there are gaps in the xl functionality which should be
> filled, rather than keeping the Python xc bindings around (equally there
> may be things where those bindings are the best solution).
We mainly use these APIs for domain statistics, like:
============================ ===== ==== ===================================
Statistic Type Unit Note
============================ ===== ==== ===================================
cpuMap int VM vcpus to physical cpus map list.
cpuTime float Sec VM accumulated CPU time.
cpuUtil float VM CPU average utilization.
Range: 0.0 - 1.0.
currentMemory long MiB VM current memory.
domainId int VM domain ID.
ephemeralTranscendentMemory long MiB VM Ephemeral tmem.
maxMemory long MiB VM maximum memory.
onlineVcpus int VM online VCPUs.
persistentTranscendentMemory long MiB VM persistent tmem.
targetMemory long MiB VM target memory.
============================ ===== ==== ===================================
I have a POC implementation of these statistics using xl, the only needed APIs are:
xc.getcpuinfo()
xc.domain_getinfo()
xc.tmem_control()
I haven't checked whether xl CLI has alternatives for all of these. These xc APIs
seem fit our need.
Thanks,
Zhigang
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH] tools: remove unused wrappers for python
2015-10-08 16:32 ` Zhigang Wang
@ 2015-10-08 16:58 ` Wei Liu
2015-10-09 4:42 ` Juergen Gross
1 sibling, 0 replies; 31+ messages in thread
From: Wei Liu @ 2015-10-08 16:58 UTC (permalink / raw)
To: Zhigang Wang
Cc: Juergen Gross, Wei Liu, Ian Campbell, stefano.stabellini,
Andrew Cooper, ian.jackson, xen-devel
On Thu, Oct 08, 2015 at 12:32:44PM -0400, Zhigang Wang wrote:
> On 10/08/2015 11:27 AM, Ian Campbell wrote:
> > On Thu, 2015-10-08 at 11:09 -0400, Zhigang Wang wrote:
> >> On 10/08/2015 10:38 AM, Ian Campbell wrote:
> >>> On Tue, 2015-10-06 at 11:24 -0400, Zhigang Wang wrote:
> >>>> We use these extentions along with xend XMLRPC API/xm. Even when move
> >>>> to
> >>>> xl, this will give us a choice to reserve some logic.
> >>>
> >>> There are a lot of interfaces here, are you using all of them? If not
> >>> then
> >>> could you enumerate the ones you care about please.
> >>
> >> Currently we are using:
> >>
> >> xc.getcpuinfo()
> >> xc.domain_getinfo()
> >
> > Thanks.
> >
> >> But after switching to xl, we cannot get info from xend any more, then some of
> >> these interfaces may be helpful.
> >
> > Do you have any insight into what info you currently get from xend which
> > you don't think you can get from xl?
> >
> > It may be that there are gaps in the xl functionality which should be
> > filled, rather than keeping the Python xc bindings around (equally there
> > may be things where those bindings are the best solution).
>
> We mainly use these APIs for domain statistics, like:
>
> ============================ ===== ==== ===================================
> Statistic Type Unit Note
> ============================ ===== ==== ===================================
> cpuMap int VM vcpus to physical cpus map list.
> cpuTime float Sec VM accumulated CPU time.
> cpuUtil float VM CPU average utilization.
> Range: 0.0 - 1.0.
> currentMemory long MiB VM current memory.
> domainId int VM domain ID.
> ephemeralTranscendentMemory long MiB VM Ephemeral tmem.
> maxMemory long MiB VM maximum memory.
> onlineVcpus int VM online VCPUs.
> persistentTranscendentMemory long MiB VM persistent tmem.
> targetMemory long MiB VM target memory.
> ============================ ===== ==== ===================================
>
> I have a POC implementation of these statistics using xl, the only needed APIs are:
>
> xc.getcpuinfo()
> xc.domain_getinfo()
There is no direct mapping in xl for these two functions.
But they can be trivially added if necessary.
> xc.tmem_control()
>
There are a bunch of tmem-* commands.
Wei.
> I haven't checked whether xl CLI has alternatives for all of these. These xc APIs
> seem fit our need.
>
> Thanks,
>
> Zhigang
>
>
>
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH] tools: remove unused wrappers for python
2015-10-08 16:32 ` Zhigang Wang
2015-10-08 16:58 ` Wei Liu
@ 2015-10-09 4:42 ` Juergen Gross
2015-10-09 9:43 ` Ian Campbell
2015-10-09 13:29 ` Andrew Cooper
1 sibling, 2 replies; 31+ messages in thread
From: Juergen Gross @ 2015-10-09 4:42 UTC (permalink / raw)
To: Zhigang Wang, Ian Campbell, Andrew Cooper
Cc: ian.jackson, xen-devel, Wei Liu, stefano.stabellini
On 10/08/2015 06:32 PM, Zhigang Wang wrote:
> On 10/08/2015 11:27 AM, Ian Campbell wrote:
>> On Thu, 2015-10-08 at 11:09 -0400, Zhigang Wang wrote:
>>> On 10/08/2015 10:38 AM, Ian Campbell wrote:
>>>> On Tue, 2015-10-06 at 11:24 -0400, Zhigang Wang wrote:
>>>>> We use these extentions along with xend XMLRPC API/xm. Even when move
>>>>> to
>>>>> xl, this will give us a choice to reserve some logic.
>>>>
>>>> There are a lot of interfaces here, are you using all of them? If not
>>>> then
>>>> could you enumerate the ones you care about please.
>>>
>>> Currently we are using:
>>>
>>> xc.getcpuinfo()
>>> xc.domain_getinfo()
>>
>> Thanks.
>>
>>> But after switching to xl, we cannot get info from xend any more, then some of
>>> these interfaces may be helpful.
>>
>> Do you have any insight into what info you currently get from xend which
>> you don't think you can get from xl?
>>
>> It may be that there are gaps in the xl functionality which should be
>> filled, rather than keeping the Python xc bindings around (equally there
>> may be things where those bindings are the best solution).
>
> We mainly use these APIs for domain statistics, like:
>
> ============================ ===== ==== ===================================
> Statistic Type Unit Note
> ============================ ===== ==== ===================================
> cpuMap int VM vcpus to physical cpus map list.
> cpuTime float Sec VM accumulated CPU time.
> cpuUtil float VM CPU average utilization.
> Range: 0.0 - 1.0.
> currentMemory long MiB VM current memory.
> domainId int VM domain ID.
> ephemeralTranscendentMemory long MiB VM Ephemeral tmem.
> maxMemory long MiB VM maximum memory.
> onlineVcpus int VM online VCPUs.
> persistentTranscendentMemory long MiB VM persistent tmem.
> targetMemory long MiB VM target memory.
> ============================ ===== ==== ===================================
>
> I have a POC implementation of these statistics using xl, the only needed APIs are:
>
> xc.getcpuinfo()
> xc.domain_getinfo()
> xc.tmem_control()
>
> I haven't checked whether xl CLI has alternatives for all of these. These xc APIs
> seem fit our need.
Okay, so there are confirmed users of:
xc.getcpuinfo()
xc.domain_getinfo()
xc.tmem_control()
and no known users of:
xc.domain_create()
xc.domain_max_vcpus()
xc.domain_dumpcore()
xc.domain_pause()
xc.domain_unpause()
xc.domain_destroy()
xc.domain_destroy_hook()
xc.domain_resume()
xc.domain_shutdown()
xc.vcpu_setaffinity()
xc.domain_sethandle()
xc.vcpu_getinfo()
xc.linux_build()
xc.getBitSize()
xc.gnttab_hvm_seed()
xc.hvm_get_param()
xc.hvm_set_param()
xc.get_device_group()
xc.test_assign_device()
xc.assign_device()
xc.deassign_device()
xc.sched_id_get()
xc.sched_credit_domain_set()
xc.sched_credit_domain_get()
xc.sched_credit2_domain_set()
xc.sched_credit2_domain_get()
xc.evtchn_alloc_unbound()
xc.evtchn_reset()
xc.physdev_map_pirq()
xc.physdev_pci_access_modify()
xc.readconsolering()
xc.physinfo()
xc.topologyinfo()
xc.numainfo()
xc.xeninfo()
xc.shadow_control()
xc.shadow_mem_control()
xc.domain_setmaxmem()
xc.domain_set_target_mem()
xc.domain_set_memmap_limit()
xc.domain_ioport_permission()
xc.domain_irq_permission()
xc.domain_iomem_permission()
xc.pages_to_kib()
xc.domain_set_time_offset()
xc.domain_set_tsc_info()
xc.domain_disable_migrate()
xc.domain_send_trigger()
xc.send_debug_keys()
xc.domain_check_cpuid()
xc.domain_set_cpuid()
xc.domain_set_policy_cpuid()
xc.domain_set_machine_address_size()
xc.domain_suppress_spurious_page_faults()
xc.tmem_shared_auth()
xc.dom_set_memshr()
xc.cpupool_create()
xc.cpupool_destroy()
xc.cpupool_getinfo()
xc.cpupool_addcpu()
xc.cpupool_removecpu()
xc.cpupool_movedomain()
xc.cpupool_freeinfo()
xc.flask_context_to_sid()
xc.flask_sid_to_context()
xc.flask_load()
xc.flask_getenforce()
xc.flask_setenforce()
xc.flask_access()
Andrew, which of those does your xen_bugtool use?
Is it okay to remove all of the unused bindings?
Juergen
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH] tools: remove unused wrappers for python
2015-10-09 4:42 ` Juergen Gross
@ 2015-10-09 9:43 ` Ian Campbell
2015-10-09 10:16 ` Juergen Gross
2015-10-09 13:29 ` Andrew Cooper
1 sibling, 1 reply; 31+ messages in thread
From: Ian Campbell @ 2015-10-09 9:43 UTC (permalink / raw)
To: Juergen Gross, Zhigang Wang, Andrew Cooper
Cc: ian.jackson, xen-devel, Wei Liu, stefano.stabellini
On Fri, 2015-10-09 at 06:42 +0200, Juergen Gross wrote:
> Is it okay to remove all of the unused bindings?
Please can you remind me what your motivation is here, just cleaning up
detritus or are some of these bindings actively hindering work you are
doing? Or are they known to be broken?
If it's just tidying up and not getting in your way then I'm not sure this
is worth the effort, but to answer your question above:
IMHO (and other tools maintainers may disagree) ones which are truly to the
best of our knowledge unused, yes. "To the best of our knowledge" probably
involves some due diligence and fair warning first.
It would be best to announce the intention on xen-devel in a mail with a
subject ("Intention to deprectate and remove some Python libxc bindings)
which will garner sufficient attention (i.e. not below a patch posting
thread) and Cc anyone who we think might be using the interfaces (Andy,
Zhigang, the chap from invisible-things who spoke up recently in a similar
thread if not this exact one).
It is probably worth cross posting to xen-users to get input from there.
Ian.
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH] tools: remove unused wrappers for python
2015-10-09 9:43 ` Ian Campbell
@ 2015-10-09 10:16 ` Juergen Gross
0 siblings, 0 replies; 31+ messages in thread
From: Juergen Gross @ 2015-10-09 10:16 UTC (permalink / raw)
To: Ian Campbell, Zhigang Wang, Andrew Cooper
Cc: ian.jackson, xen-devel, Wei Liu, stefano.stabellini
On 10/09/2015 11:43 AM, Ian Campbell wrote:
> On Fri, 2015-10-09 at 06:42 +0200, Juergen Gross wrote:
>
>> Is it okay to remove all of the unused bindings?
>
> Please can you remind me what your motivation is here, just cleaning up
> detritus or are some of these bindings actively hindering work you are
> doing? Or are they known to be broken?
With the "superpages" feature removal patch I sent yesterday they are
no longer hindering me.
OTOH with xend as the only in-tree user being removed some cleaning up
seems to be appropriate IMHO.
> If it's just tidying up and not getting in your way then I'm not sure this
> is worth the effort, but to answer your question above:
>
> IMHO (and other tools maintainers may disagree) ones which are truly to the
> best of our knowledge unused, yes. "To the best of our knowledge" probably
> involves some due diligence and fair warning first.
I agree.
> It would be best to announce the intention on xen-devel in a mail with a
> subject ("Intention to deprectate and remove some Python libxc bindings)
> which will garner sufficient attention (i.e. not below a patch posting
> thread) and Cc anyone who we think might be using the interfaces (Andy,
> Zhigang, the chap from invisible-things who spoke up recently in a similar
> thread if not this exact one).
>
> It is probably worth cross posting to xen-users to get input from there.
Okay, I'll do that.
Juergen
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH] tools: remove unused wrappers for python
2015-10-09 4:42 ` Juergen Gross
2015-10-09 9:43 ` Ian Campbell
@ 2015-10-09 13:29 ` Andrew Cooper
1 sibling, 0 replies; 31+ messages in thread
From: Andrew Cooper @ 2015-10-09 13:29 UTC (permalink / raw)
To: Juergen Gross, Zhigang Wang, Ian Campbell
Cc: ian.jackson, xen-devel, Wei Liu, stefano.stabellini
On 09/10/15 05:42, Juergen Gross wrote:
>
>
> Andrew, which of those does your xen_bugtool use?
Currently just xc.domain_getinfo()
~Andrew
^ permalink raw reply [flat|nested] 31+ messages in thread
end of thread, other threads:[~2015-10-09 13:29 UTC | newest]
Thread overview: 31+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-10-06 10:46 [PATCH] tools: remove unused wrappers for python Juergen Gross
2015-10-06 11:18 ` Wei Liu
2015-10-06 11:33 ` Juergen Gross
2015-10-06 11:39 ` Wei Liu
2015-10-06 13:40 ` Ian Campbell
2015-10-06 14:51 ` Juergen Gross
2015-10-06 15:11 ` Ian Campbell
2015-10-06 15:21 ` Juergen Gross
2015-10-06 15:26 ` Ian Campbell
2015-10-06 15:30 ` Zhigang Wang
2015-10-06 15:45 ` Ian Campbell
2015-10-06 16:14 ` Juergen Gross
2015-10-06 16:24 ` Ian Campbell
2015-10-08 1:10 ` Konrad Rzeszutek Wilk
2015-10-08 4:16 ` Juergen Gross
2015-10-08 14:30 ` Ian Campbell
2015-10-06 15:38 ` Andrew Cooper
2015-10-06 16:31 ` Wei Liu
2015-10-06 16:38 ` Ian Campbell
2015-10-06 16:42 ` Wei Liu
2015-10-06 15:24 ` Zhigang Wang
2015-10-08 14:38 ` Ian Campbell
2015-10-08 15:09 ` Zhigang Wang
2015-10-08 15:27 ` Ian Campbell
2015-10-08 16:32 ` Zhigang Wang
2015-10-08 16:58 ` Wei Liu
2015-10-09 4:42 ` Juergen Gross
2015-10-09 9:43 ` Ian Campbell
2015-10-09 10:16 ` Juergen Gross
2015-10-09 13:29 ` Andrew Cooper
2015-10-07 2:58 ` Marek Marczykowski-Górecki
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).