From patchwork Wed Apr 5 16:05:47 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: George Dunlap X-Patchwork-Id: 9664623 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 1C99760353 for ; Wed, 5 Apr 2017 16:08:54 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0ECCA25223 for ; Wed, 5 Apr 2017 16:08:54 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 0382127D16; Wed, 5 Apr 2017 16:08:54 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 816C725223 for ; Wed, 5 Apr 2017 16:08:53 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cvnRk-0004N2-VD; Wed, 05 Apr 2017 16:06:12 +0000 Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cvnRj-0004LZ-GF for xen-devel@lists.xenproject.org; Wed, 05 Apr 2017 16:06:11 +0000 Received: from [85.158.137.68] by server-4.bemta-3.messagelabs.com id 30/2F-03705-2F515E85; Wed, 05 Apr 2017 16:06:10 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFmpgkeJIrShJLcpLzFFi42JxWrrBXveT6NM Ig1t/BS2+b5nM5MDocfjDFZYAxijWzLyk/IoE1oyPzV/YC/bpVSxecoulgfGTWhcjB4eEgL/E 7RsmXYycHGwCehLzjn9lAQmLCKhI3N5rABJmFsiR+L7rODtIWFjAU2LRQyUQkwWoYsUfHpAKX gF3iefNT9lAbAkBOYnzx38yg5RwCnhIPJ3BCxIWAirpOPKVHcJWlVj84Cg7RKugxMmZT1ggFk lIHHzxgnkCI+8sJKlZSFILGJlWMWoUpxaVpRbpGhnpJRVlpmeU5CZm5ugaGhjr5aYWFyemp+Y kJhXrJefnbmIEhkw9AwPjDsapJ/wOMUpyMCmJ8ir4PIkQ4kvKT6nMSCzOiC8qzUktPsQow8Gh JMG7SfhphJBgUWp6akVaZg4weGHSEhw8SiK8X0HSvMUFibnFmekQqVOMilLivN9AEgIgiYzSP Lg2WMRcYpSVEuZlZGBgEOIpSC3KzSxBlX/FKM7BqCTMyywCNIUnM68EbvoroMVMQIuf3HkIsr gkESEl1cDI9XXu4Y1VCq9MhP5c+X9pXfWteFNdHrGLi/+V5j3susWR45LQwJfz48dW8Ved9m6 Rx5fZnpy0vF0/RTH1Z2rLgqJdWkufGOYV+M864ciqe6G/nFPIXprv3aqs39dkGtdJu5R+SJEQ Y2B07U749Hib4Kc1ekbZe/UNLGd/ufYrpWnDL02BS2uUWIozEg21mIuKEwGGW6gjkwIAAA== X-Env-Sender: prvs=261486814=George.Dunlap@citrix.com X-Msg-Ref: server-4.tower-31.messagelabs.com!1491408365!36295141!5 X-Originating-IP: [66.165.176.63] X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni42MyA9PiAzMDYwNDg=\n, received_headers: No Received headers X-StarScan-Received: X-StarScan-Version: 9.2.3; banners=-,-,- X-VirusChecked: Checked Received: (qmail 44734 invoked from network); 5 Apr 2017 16:06:10 -0000 Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63) by server-4.tower-31.messagelabs.com with RC4-SHA encrypted SMTP; 5 Apr 2017 16:06:10 -0000 X-IronPort-AV: E=Sophos;i="5.36,279,1486425600"; d="scan'208";a="426347155" From: George Dunlap To: Date: Wed, 5 Apr 2017 17:05:47 +0100 Message-ID: <1491408354-9643-4-git-send-email-george.dunlap@citrix.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1491408354-9643-1-git-send-email-george.dunlap@citrix.com> References: <1491408354-9643-1-git-send-email-george.dunlap@citrix.com> MIME-Version: 1.0 Cc: Ronald Rojas , Wei Liu , Ian Jackson Subject: [Xen-devel] [PATCH v5 03/10] golang/xenlight: Add host-related functionality X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: Ronald Rojas Add calls for the following host-related functionality: - libxl_get_max_cpus - libxl_get_online_cpus - libxl_get_max_nodes - libxl_get_free_memory - libxl_get_physinfo - libxl_get_version_info Include Golang versions of the following structs: - libxl_physinfo as Physinfo - libxl_version_info as VersionInfo - libxl_hwcap as Hwcap Signed-off-by: Ronald Rojas Reviewed-by: George Dunlap --- CC: Ian Jackson CC: Wei Liu Changes since v4: - Moved fix from the next patch --- tools/golang/xenlight/xenlight.go | 200 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 200 insertions(+) diff --git a/tools/golang/xenlight/xenlight.go b/tools/golang/xenlight/xenlight.go index de24ffd..5b500f3 100644 --- a/tools/golang/xenlight/xenlight.go +++ b/tools/golang/xenlight/xenlight.go @@ -118,6 +118,103 @@ type Context struct { logger *C.xentoollog_logger_stdiostream } +type Hwcap []C.uint32_t + +func (chwcap C.libxl_hwcap) CToGo() (ghwcap Hwcap) { + // Alloc a Go slice for the bytes + size := 8 + ghwcap = make([]C.uint32_t, size) + + // Make a slice pointing to the C array + mapslice := (*[1 << 30]C.uint32_t)(unsafe.Pointer(&chwcap[0]))[:size:size] + + // And copy the C array into the Go array + copy(ghwcap, mapslice) + + return +} + +/* + * Types: IDL + * + * FIXME: Generate these automatically from the IDL + */ + +type Physinfo struct { + ThreadsPerCore uint32 + CoresPerSocket uint32 + MaxCpuId uint32 + NrCpus uint32 + CpuKhz uint32 + TotalPages uint64 + FreePages uint64 + ScrubPages uint64 + OutstandingPages uint64 + SharingFreedPages uint64 + SharingUsedFrames uint64 + NrNodes uint32 + HwCap Hwcap + CapHvm bool + CapHvmDirectio bool +} + +func (cphys *C.libxl_physinfo) toGo() (physinfo *Physinfo) { + + physinfo = &Physinfo{} + physinfo.ThreadsPerCore = uint32(cphys.threads_per_core) + physinfo.CoresPerSocket = uint32(cphys.cores_per_socket) + physinfo.MaxCpuId = uint32(cphys.max_cpu_id) + physinfo.NrCpus = uint32(cphys.nr_cpus) + physinfo.CpuKhz = uint32(cphys.cpu_khz) + physinfo.TotalPages = uint64(cphys.total_pages) + physinfo.FreePages = uint64(cphys.free_pages) + physinfo.ScrubPages = uint64(cphys.scrub_pages) + physinfo.ScrubPages = uint64(cphys.scrub_pages) + physinfo.SharingFreedPages = uint64(cphys.sharing_freed_pages) + physinfo.SharingUsedFrames = uint64(cphys.sharing_used_frames) + physinfo.NrNodes = uint32(cphys.nr_nodes) + physinfo.HwCap = cphys.hw_cap.CToGo() + physinfo.CapHvm = bool(cphys.cap_hvm) + physinfo.CapHvmDirectio = bool(cphys.cap_hvm_directio) + + return +} + +type VersionInfo struct { + XenVersionMajor int + XenVersionMinor int + XenVersionExtra string + Compiler string + CompileBy string + CompileDomain string + CompileDate string + Capabilities string + Changeset string + VirtStart uint64 + Pagesize int + Commandline string + BuildId string +} + +func (cinfo *C.libxl_version_info) toGo() (info *VersionInfo) { + info = &VersionInfo{} + info.XenVersionMajor = int(cinfo.xen_version_major) + info.XenVersionMinor = int(cinfo.xen_version_minor) + info.XenVersionExtra = C.GoString(cinfo.xen_version_extra) + info.Compiler = C.GoString(cinfo.compiler) + info.CompileBy = C.GoString(cinfo.compile_by) + info.CompileDomain = C.GoString(cinfo.compile_domain) + info.CompileDate = C.GoString(cinfo.compile_date) + info.Capabilities = C.GoString(cinfo.capabilities) + info.Changeset = C.GoString(cinfo.changeset) + info.VirtStart = uint64(cinfo.virt_start) + info.Pagesize = int(cinfo.pagesize) + info.Commandline = C.GoString(cinfo.commandline) + info.BuildId = C.GoString(cinfo.build_id) + + return +} + /* * Context */ @@ -164,3 +261,106 @@ func (Ctx *Context) CheckOpen() (err error) { } return } + +//int libxl_get_max_cpus(libxl_ctx *ctx); +func (Ctx *Context) GetMaxCpus() (maxCpus int, err error) { + err = Ctx.CheckOpen() + if err != nil { + return + } + + ret := C.libxl_get_max_cpus(Ctx.ctx) + if ret < 0 { + err = Error(-ret) + return + } + maxCpus = int(ret) + return +} + +//int libxl_get_online_cpus(libxl_ctx *ctx); +func (Ctx *Context) GetOnlineCpus() (onCpus int, err error) { + err = Ctx.CheckOpen() + if err != nil { + return + } + + ret := C.libxl_get_online_cpus(Ctx.ctx) + if ret < 0 { + err = Error(-ret) + return + } + onCpus = int(ret) + return +} + +//int libxl_get_max_nodes(libxl_ctx *ctx); +func (Ctx *Context) GetMaxNodes() (maxNodes int, err error) { + err = Ctx.CheckOpen() + if err != nil { + return + } + ret := C.libxl_get_max_nodes(Ctx.ctx) + if ret < 0 { + err = Error(-ret) + return + } + maxNodes = int(ret) + return +} + +//int libxl_get_free_memory(libxl_ctx *ctx, uint64_t *memkb); +func (Ctx *Context) GetFreeMemory() (memkb uint64, err error) { + err = Ctx.CheckOpen() + if err != nil { + return + } + var cmem C.uint64_t + ret := C.libxl_get_free_memory(Ctx.ctx, &cmem) + + if ret < 0 { + err = Error(-ret) + return + } + + memkb = uint64(cmem) + return + +} + +//int libxl_get_physinfo(libxl_ctx *ctx, libxl_physinfo *physinfo) +func (Ctx *Context) GetPhysinfo() (physinfo *Physinfo, err error) { + err = Ctx.CheckOpen() + if err != nil { + return + } + var cphys C.libxl_physinfo + C.libxl_physinfo_init(&cphys) + defer C.libxl_physinfo_dispose(&cphys) + + ret := C.libxl_get_physinfo(Ctx.ctx, &cphys) + + if ret < 0 { + err = Error(ret) + return + } + physinfo = cphys.toGo() + + return +} + +//const libxl_version_info* libxl_get_version_info(libxl_ctx *ctx); +func (Ctx *Context) GetVersionInfo() (info *VersionInfo, err error) { + err = Ctx.CheckOpen() + if err != nil { + return + } + + var cinfo *C.libxl_version_info + + cinfo = C.libxl_get_version_info(Ctx.ctx) + + info = cinfo.toGo() + + return +}