From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ronald Rojas Subject: Re: New Outreachy Applicant Date: Mon, 3 Oct 2016 01:14:01 -0400 Message-ID: <20161003051400.GA3169@fedora.home> References: <20160914063512.GA15202@fedora> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="17pEHd4RhPHOinZp" Return-path: Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bqvZm-0000X8-HV for xen-devel@lists.xenproject.org; Mon, 03 Oct 2016 05:14:06 +0000 Received: by mail-qt0-f196.google.com with SMTP id 38so4869008qte.2 for ; Sun, 02 Oct 2016 22:14:03 -0700 (PDT) Content-Disposition: inline In-Reply-To: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: George Dunlap Cc: xen-devel List-Id: xen-devel@lists.xenproject.org --17pEHd4RhPHOinZp Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Tue, Sep 20, 2016 at 04:24:47PM +0100, George Dunlap wrote: > Thanks for your interest in the Xen Project! Sorry for the delay in > responding -- somehow your mail either never made it to my personal > inbox or I accidentally deleted it instead of filing it properly. I > saw your question on IRC and now found your mail here on xen-devel. > > First, I want to emphasize that Outreachy internships should be > considered a full-time job. As part of the application process you > will be asked to confirm that you will not be taking any classes, nor > have any other significant commitments (such as another job) during > the period of the internship. I'll confirm now that won't be taking any classes or working during the majority of the program, however the fall semester for my college will end around the 20th of December. > > Now on to the bite-sized task. We've actually found that one of the > difficult parts of getting going with our project is making sure that > you understand how to get your whole system and environment set up. > And another thing we want to see is to what degree you can balance > figuring things out, finding the answers on the web, and asking for > help when you need it. > > So with that in mind, we've started experimenting with tasks which > don't contribute very much to the project directly, but provide a > really solid base of knowledge to do further contributions. > > So here's my challenge for you. > > ------- > OUTCOME > > Write a simple go program that will list the current cpu pools, > similar to the output of "xl cpupool-list". No need to handle extra > arguments or modify libxl.go (beyond what may be needed to compile it). RESULTS: I've managed to get xen running on my local machine. I am running linux natively on ubuntu with xen 4.8-unstable and it is running reasonable well. There are two VM's running on my computer, one is named tutorial-pv-guest that I created by following the xen beginners guide. The other is called ubuntu1 and was created through a custom configuration file that I created. I wasn't having much luck with the outreachy tutorial provided so after some googling the link below really helped me get through the process. http://www.virtuatopia.com/index.php/Building_a_Xen_Guest_Domain_using_Xen-Tools > > Please post a copy of your .go program, along with the results of > output *when more than one VM is running*. The output when I run "sudo go run libxl.go" is pasted below. The output was made when the two VM's mentioned above were running. It prints out the appropiate output for Pool Name, Scheduler, and Domain Count. All the changes in libxl.go are contained within the main() method and the libxl.go file is pasted below as well. CONCERNS/QUESTIONS: I believe I was only able to print out the information for Name, Sched, and Domain count because the other information such as Active and CPU's are not stored within CpupoolInfo. Was there a way I could obtain that information? I don't think the code privided had that functionality. Maybe the next task could be to add that functionality? It also seems that Domain Count is off. The command "xl cpupool-list" lists 3 domains (which are Dom0, tutorial-pv-guest, and ubuntu1) but my program returns 11 domains. Would you like me to look into the issue? I'm using the information called from Ctx.ListCpupool() so I may have to take a closer look at that code. Thank You! Ronald Rojas --17pEHd4RhPHOinZp Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=output Name Sched Domain count Pool-0 credit 11 --17pEHd4RhPHOinZp Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="libxl.go" /* * Copyright (C) 2016 George W. Dunlap, Citrix Systems UK Ltd * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; version 2 of the * License only. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301, USA. */ package main /* #cgo LDFLAGS: -lyajl -lxenlight #include #include */ import "C" import ( "unsafe" "fmt" "time" ) type Context struct { ctx *C.libxl_ctx } var Ctx Context func (Ctx *Context) IsOpen() bool { return Ctx.ctx != nil } func (Ctx *Context) Open() (err error) { if Ctx.ctx != nil { return } ret := C.libxl_ctx_alloc(unsafe.Pointer(&Ctx.ctx), C.LIBXL_VERSION, 0, nil) if ret != 0 { err = fmt.Errorf("Allocating libxl context: %d", ret) } return } func (Ctx *Context) Close() (err error) { ret := C.libxl_ctx_free(unsafe.Pointer(Ctx.ctx)) Ctx.ctx = nil if ret != 0 { err = fmt.Errorf("Freeing libxl context: %d", ret) } return } type Domid uint32 type MemKB uint64 // FIXME: Use the idl to generate types type Dominfo struct { // FIXME: uuid Domid Domid Running bool Blocked bool Paused bool Shutdown bool Dying bool Never_stop bool Shutdown_reason int32 // FIXME shutdown_reason enumeration Outstanding_memkb MemKB Current_memkb MemKB Shared_memkb MemKB Paged_memkb MemKB Max_memkb MemKB Cpu_time time.Duration Vcpu_max_id uint32 Vcpu_online uint32 Cpupool uint32 Domain_type int32 //FIXME libxl_domain_type enumeration } func (Ctx *Context) DomainInfo(Id Domid) (di *Dominfo, err error) { if Ctx.ctx == nil { err = fmt.Errorf("Context not opened") return } var cdi C.libxl_dominfo ret := C.libxl_domain_info(Ctx.ctx, unsafe.Pointer(&cdi), C.uint32_t(Id)) // FIXME: IsDomainNotPresentError if ret != 0 { err = fmt.Errorf("libxl_domain_info failed: %d", ret) return } // FIXME -- use introspection to make this more robust di = &Dominfo{} di.Domid = Domid(cdi.domid) di.Running = bool(cdi.running) di.Blocked = bool(cdi.blocked) di.Paused = bool(cdi.paused) di.Shutdown = bool(cdi.shutdown) di.Dying = bool(cdi.dying) di.Never_stop = bool(cdi.never_stop) di.Shutdown_reason = int32(cdi.shutdown_reason) di.Outstanding_memkb = MemKB(cdi.outstanding_memkb) di.Current_memkb = MemKB(cdi.current_memkb) di.Shared_memkb = MemKB(cdi.shared_memkb) di.Paged_memkb = MemKB(cdi.paged_memkb) di.Max_memkb = MemKB(cdi.max_memkb) di.Cpu_time = time.Duration(cdi.cpu_time) di.Vcpu_max_id = uint32(cdi.vcpu_max_id) di.Vcpu_online = uint32(cdi.vcpu_online) di.Cpupool = uint32(cdi.cpupool) di.Domain_type = int32(cdi.domain_type) return } func (Ctx *Context) DomainUnpause(Id Domid) (err error) { if Ctx.ctx == nil { err = fmt.Errorf("Context not opened") return } ret := C.libxl_domain_unpause(Ctx.ctx, C.uint32_t(Id)) if ret != 0 { err = fmt.Errorf("libxl_domain_unpause failed: %d", ret) } return } // typedef struct { // uint32_t size; /* number of bytes in map */ // uint8_t *map; // } libxl_bitmap; // void libxl_bitmap_init(libxl_bitmap *map); // void libxl_bitmap_dispose(libxl_bitmap *map); // # Consistent with values defined in domctl.h // # Except unknown which we have made up // libxl_scheduler = Enumeration("scheduler", [ // (0, "unknown"), // (4, "sedf"), // (5, "credit"), // (6, "credit2"), // (7, "arinc653"), // (8, "rtds"), // ]) type Scheduler int var ( SchedulerUnknown Scheduler = 0 SchedulerSedf Scheduler = 4 SchedulerCredit Scheduler = 5 SchedulerCredit2 Scheduler = 6 SchedulerArinc653 Scheduler = 7 SchedulerRTDS Scheduler = 8 ) // const char *libxl_scheduler_to_string(libxl_scheduler p); // int libxl_scheduler_from_string(const char *s, libxl_scheduler *e); func (s Scheduler) String() (string) { cs := C.libxl_scheduler_to_string(C.libxl_scheduler(s)) // No need to free const return value return C.GoString(cs) } func SchedulerFromString(name string) (s Scheduler, err error) { cname := C.CString(name) defer C.free(unsafe.Pointer(cname)) var cs C.libxl_scheduler ret := C.libxl_scheduler_from_string(cname, &cs) if ret != 0 { err = fmt.Errorf("libxl_scheduler_from_string failed: %d", ret) return } s = Scheduler(cs) return } // libxl_cpupoolinfo = Struct("cpupoolinfo", [ // ("poolid", uint32), // ("pool_name", string), // ("sched", libxl_scheduler), // ("n_dom", uint32), // ("cpumap", libxl_bitmap) // ], dir=DIR_OUT) type CpupoolInfo struct { PoolId uint32 PoolName string Scheduler Scheduler DomainCount int // Punt on cpumap for now } // libxl_cpupoolinfo * libxl_list_cpupool(libxl_ctx*, int *nb_pool_out); // void libxl_cpupoolinfo_list_free(libxl_cpupoolinfo *list, int nb_pool); func (Ctx *Context) ListCpupool() (list []CpupoolInfo) { var nbPool C.int c_cpupool_list := C.libxl_list_cpupool(Ctx.ctx, &nbPool) defer C.libxl_cpupoolinfo_list_free(c_cpupool_list, nbPool) if int(nbPool) == 0 { return } // Magic cpupoolListSlice := (*[1 << 30]C.libxl_cpupoolinfo)(unsafe.Pointer(c_cpupool_list))[:nbPool:nbPool] for i := range cpupoolListSlice { var info CpupoolInfo info.PoolId = uint32(cpupoolListSlice[i].poolid) info.PoolName = C.GoString(cpupoolListSlice[i].pool_name) info.Scheduler = Scheduler(cpupoolListSlice[i].sched) info.DomainCount = int(cpupoolListSlice[i].n_dom) list = append(list, info) } return } func (Ctx *Context) CpupoolFindByName(name string) (info CpupoolInfo, found bool) { plist := Ctx.ListCpupool() for i := range plist { if plist[i].PoolName == name { found = true info = plist[i] return } } return } func main() { err := Ctx.Open() if err != nil{ fmt.Print(err) return } var list []CpupoolInfo = Ctx.ListCpupool() fmt.Print("Name\t\tSched\t\tDomain count\n") for _, info := range list { fmt.Printf("%s\t\t%s\t\t%b\n", info.PoolName, info.Scheduler, info.DomainCount) } } --17pEHd4RhPHOinZp Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: inline X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KWGVuLWRldmVs IG1haWxpbmcgbGlzdApYZW4tZGV2ZWxAbGlzdHMueGVuLm9yZwpodHRwczovL2xpc3RzLnhlbi5v cmcveGVuLWRldmVsCg== --17pEHd4RhPHOinZp--