[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v2 5/5] golang/xenlight: Add tests host related functionality functions



On 02/03/17 16:07, Ronald Rojas wrote:
> Create tests for the following functions:
> - GetVersionInfo
> - GetPhysinfo
> - GetDominfo
> - GetMaxCpus
> - GetOnlineCpus
> - GetMaxNodes
> - GetFreeMemory
> 
> Signed-off-by: Ronald Rojas <ronladred@xxxxxxxxx>
> Signed-off-by: George Dunlap <george.dunlap@xxxxxxxxxx>
> 
> ---
> 
> - Removed individual Makefiles for each test for a single
> Makefile to test all files at once
> 
> - Changed all tests to xeninfo directory
> 
> - Applied libxl_<type>_{init/dispose} for IDL types in tests
> 
> - Applied formating fixes

Looks a lot better!  Still some more things to improve...

> 
> CC: xen-devel@xxxxxxxxxxxxx
> CC: george.dunlap@xxxxxxxxxx
> CC: ian.jackson@xxxxxxxxxxxxx
> CC: wei.liu2@xxxxxxxxxx
> ---
> ---
>  tools/golang/xenlight/test/xeninfo/Makefile       | 34 
> +++++++++++++++++++++++
>  tools/golang/xenlight/test/xeninfo/dominfo.c      | 31 +++++++++++++++++++++
>  tools/golang/xenlight/test/xeninfo/dominfo.go     | 31 +++++++++++++++++++++
>  tools/golang/xenlight/test/xeninfo/freememory.c   | 24 ++++++++++++++++
>  tools/golang/xenlight/test/xeninfo/freememory.go  | 28 +++++++++++++++++++
>  tools/golang/xenlight/test/xeninfo/maxcpu.c       | 16 +++++++++++
>  tools/golang/xenlight/test/xeninfo/maxcpu.go      | 27 ++++++++++++++++++
>  tools/golang/xenlight/test/xeninfo/maxnodes.c     | 16 +++++++++++
>  tools/golang/xenlight/test/xeninfo/maxnodes.go    | 27 ++++++++++++++++++
>  tools/golang/xenlight/test/xeninfo/onlinecpu.c    | 16 +++++++++++
>  tools/golang/xenlight/test/xeninfo/onlinecpu.go   | 27 ++++++++++++++++++
>  tools/golang/xenlight/test/xeninfo/physinfo.c     | 31 +++++++++++++++++++++
>  tools/golang/xenlight/test/xeninfo/physinfo.go    | 32 +++++++++++++++++++++
>  tools/golang/xenlight/test/xeninfo/print.h        |  3 ++
>  tools/golang/xenlight/test/xeninfo/versioninfo.c  | 20 +++++++++++++
>  tools/golang/xenlight/test/xeninfo/versioninfo.go | 28 +++++++++++++++++++
>  16 files changed, 391 insertions(+)
>  create mode 100644 tools/golang/xenlight/test/xeninfo/Makefile
>  create mode 100644 tools/golang/xenlight/test/xeninfo/dominfo.c
>  create mode 100644 tools/golang/xenlight/test/xeninfo/dominfo.go
>  create mode 100644 tools/golang/xenlight/test/xeninfo/freememory.c
>  create mode 100644 tools/golang/xenlight/test/xeninfo/freememory.go
>  create mode 100644 tools/golang/xenlight/test/xeninfo/maxcpu.c
>  create mode 100644 tools/golang/xenlight/test/xeninfo/maxcpu.go
>  create mode 100644 tools/golang/xenlight/test/xeninfo/maxnodes.c
>  create mode 100644 tools/golang/xenlight/test/xeninfo/maxnodes.go
>  create mode 100644 tools/golang/xenlight/test/xeninfo/onlinecpu.c
>  create mode 100644 tools/golang/xenlight/test/xeninfo/onlinecpu.go
>  create mode 100644 tools/golang/xenlight/test/xeninfo/physinfo.c
>  create mode 100644 tools/golang/xenlight/test/xeninfo/physinfo.go
>  create mode 100644 tools/golang/xenlight/test/xeninfo/print.h
>  create mode 100644 tools/golang/xenlight/test/xeninfo/versioninfo.c
>  create mode 100644 tools/golang/xenlight/test/xeninfo/versioninfo.go
> 
> diff --git a/tools/golang/xenlight/test/xeninfo/Makefile 
> b/tools/golang/xenlight/test/xeninfo/Makefile
> new file mode 100644
> index 0000000..859e4d6
> --- /dev/null
> +++ b/tools/golang/xenlight/test/xeninfo/Makefile
> @@ -0,0 +1,34 @@
> +XEN_ROOT = $(CURDIR)/../../../../..
> +include $(XEN_ROOT)/tools/Rules.mk
> +
> +GO ?= go
> +
> +TESTS = dominfo freememory maxcpu onlinecpu physinfo versioninfo
> +CBINARIES = $(TESTS:%=%-c)
> +GOBINARIES = $(TESTS:%=%-go)
> +
> +all: build
> +
> +test: clean build
> +     for test in $(TESTS) ; do \
> +             ./$$test-c >> c.output ; \
> +             ./$$test-go >> go.output ; \
> +             if cmp -s "c.output" "go.output"; then\
> +                     echo "$$test PASSED";\
> +             else \
> +                     echo "$$test FAILED";\
> +             fi ; \
> +     done
> +
> +build: $(CBINARIES) $(GOBINARIES)
> +
> +%-c: %.c
> +     gcc $(CFLAGS_libxenlight) -o $@ $< $(LDLIBS_libxenlight)

So I think here we need to define CFLAGS and LDLIBS; and we want to add
-Werror, thus:

CFLAGS += -Werror
CFLAGS += $(CFLAGS_libxenlight)

LDLIBS += $(LDLIBS_libxenlight)

And then we want to build things like this:

    $(CC) $(CFLAGS) -o $@ $< $(LDLIBS)

And when you do that, gcc will tell you a long list of improvements in
your C code. :-)  (If you run into any problems with how to fix these,
just give us a shout on the IRC channel.)

> +
> +%-go: %.go
> +     GOPATH=$(XEN_ROOT)/tools/golang $(GO) build -o $@ $<
> +
> +clean:
> +     rm -f *-c
> +     rm -f *-go
> +     rm -f *.output
> diff --git a/tools/golang/xenlight/test/xeninfo/dominfo.c 
> b/tools/golang/xenlight/test/xeninfo/dominfo.c
> new file mode 100644
> index 0000000..85f658d
> --- /dev/null
> +++ b/tools/golang/xenlight/test/xeninfo/dominfo.c
> @@ -0,0 +1,31 @@
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <libxl.h>
> +#include "print.h"
> +
> +int main(){
> +
> +    libxl_ctx *context;
> +    libxl_ctx_alloc(&context,LIBXL_VERSION, 0, NULL);

Hmm, you don't create a logger for this -- so if it manages to run on a
system that's booted with a different version of Xen, the golang version
will print an error, but the C version will crash with a null pointer
deference.

You probably want to make a function (maybe add it to your 'print.h')
that both makes a logger and calls ctx_alloc.

> +    libxl_dominfo info;
> +    libxl_dominfo_init(&info);
> +    int err = libxl_domain_info(context, &info, 0);
> +    if (err != 0)
> +        return err;
> +    
> +     printf("%d\n%d\n", info.domid, info.ssidref);
> +     printf("%s\n%s\n%s\n%s\n%s\n%s\n", bool_to_string(info.running), 
> +                     bool_to_string(info.blocked), 
> bool_to_string(info.paused),
> +                     bool_to_string(info.shutdown), 
> bool_to_string(info.dying), 
> +                     bool_to_string(info.never_stop));
> +     long cpu_time = info.cpu_time / ((long) 1<<35);
> +     printf("%d\n%lu\n%lu\n%lu\n%lu\n%lu\n%lu\n%d\n%d\n%d\n", 
> info.shutdown_reason, 
> +                     info.outstanding_memkb, info.current_memkb, 
> info.shared_memkb, 
> +                     info.paged_memkb, info.max_memkb, cpu_time, 
> info.vcpu_max_id, 
> +                     info.vcpu_online, info.cpupool);
> +     printf("%d\n", info.domain_type);
> +
> +     libxl_dominfo_dispose(&info);
> +     libxl_ctx_free(context);

These seem to have tabs instead of spaces, which is verboten in C code
in the Xen tree.  You might want to ask Wei and/or Anthony how to get
vim to only make spaces.

> +
> +}
> diff --git a/tools/golang/xenlight/test/xeninfo/dominfo.go 
> b/tools/golang/xenlight/test/xeninfo/dominfo.go
> new file mode 100644
> index 0000000..bb9257b
> --- /dev/null
> +++ b/tools/golang/xenlight/test/xeninfo/dominfo.go
> @@ -0,0 +1,31 @@
> +package main
> +
> +import (
> +     "fmt"
> +     "os"
> +     "xenproject.org/xenlight"
> +)
> +
> +func main() {
> +     ctx := xenlight.Ctx
> +     err := ctx.Open()
> +     if err != nil {
> +             os.Exit(-1)
> +     }
> +     defer ctx.Close()
> +     info, err := ctx.DomainInfo(0)
> +     if err != nil {
> +             os.Exit(-1)
> +     }
> +
> +     fmt.Printf("%d\n%d\n", info.Domid, info.Ssidref)
> +     //fmt.Printf("%s\n", info.SsidLabel)

I think I commented on this before -- what's this for?

> +     fmt.Printf("%t\n%t\n%t\n%t\n%t\n%t\n", info.Running,
> +             info.Blocked, info.Paused, info.Shutdown, info.Dying, 
> info.NeverStop)
> +     cpuTime := info.CpuTime / (1 << 35)
> +     fmt.Printf("%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n", 
> info.ShutdownReason, info.OutstandingMemkb,
> +             info.CurrentMemkb, info.SharedMemkb, info.PagedMemkb, 
> info.MaxMemkb, cpuTime,
> +             info.VcpuMaxId, info.VcpuOnline, info.Cpupool)
> +     fmt.Printf("%d\n", info.DomainType)
> +
> +}
> diff --git a/tools/golang/xenlight/test/xeninfo/freememory.c 
> b/tools/golang/xenlight/test/xeninfo/freememory.c
> new file mode 100644
> index 0000000..04ee90d
> --- /dev/null
> +++ b/tools/golang/xenlight/test/xeninfo/freememory.c
> @@ -0,0 +1,24 @@
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <libxl.h>
> +#include "print.h"
> +
> +int main(){
> +
> +    libxl_ctx *context;
> +    libxl_ctx_alloc(&context,LIBXL_VERSION, 0, NULL);
> +
> +    uint64_t free_memory;
> +    int err = libxl_get_free_memory(context, &free_memory);
> +    if (err < 0)
> +    {
> +        printf("%d\n", err);
> +    }
> +    else
> +    {
> +        printf("%lu\n", free_memory);
> +    }
> +    libxl_ctx_free(context);
> +
> +}
> +
> diff --git a/tools/golang/xenlight/test/xeninfo/freememory.go 
> b/tools/golang/xenlight/test/xeninfo/freememory.go
> new file mode 100644
> index 0000000..69a7723
> --- /dev/null
> +++ b/tools/golang/xenlight/test/xeninfo/freememory.go
> @@ -0,0 +1,28 @@
> +package main
> +
> +import (
> +     "fmt"
> +     "os"
> +     "xenproject.org/xenlight"
> +)
> +
> +func main() {
> +     ctx := xenlight.Ctx
> +     err := ctx.Open()
> +     if err != nil {
> +             os.Exit(-1)
> +     }
> +
> +     defer ctx.Close()
> +     if err != nil {
> +             os.Exit(-1)
> +     }

Why are you checking err a second time? :-)

> +
> +     free_memory, err := ctx.GetFreeMemory()
> +     if err != nil {
> +             fmt.Printf("%d\n", err)
> +     } else {
> +             fmt.Printf("%d\n", free_memory)
> +     }
> +
> +}
> diff --git a/tools/golang/xenlight/test/xeninfo/maxcpu.c 
> b/tools/golang/xenlight/test/xeninfo/maxcpu.c
> new file mode 100644
> index 0000000..6ba4a87
> --- /dev/null
> +++ b/tools/golang/xenlight/test/xeninfo/maxcpu.c
> @@ -0,0 +1,16 @@
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <libxl.h>
> +
> +int main(){
> +
> +    libxl_ctx *context;
> +    libxl_ctx_alloc(&context,LIBXL_VERSION, 0, NULL);
> +
> +    int max_cpus = libxl_get_max_cpus(context);
> +    printf("%d\n", max_cpus);
> +
> +    libxl_ctx_free(context);
> +
> +}
> +
> diff --git a/tools/golang/xenlight/test/xeninfo/maxcpu.go 
> b/tools/golang/xenlight/test/xeninfo/maxcpu.go
> new file mode 100644
> index 0000000..f847c0d
> --- /dev/null
> +++ b/tools/golang/xenlight/test/xeninfo/maxcpu.go
> @@ -0,0 +1,27 @@
> +package main
> +
> +import (
> +     "fmt"
> +     "os"
> +     "xenproject.org/xenlight"
> +)
> +
> +func main() {
> +     ctx := xenlight.Ctx
> +     err := ctx.Open()
> +     if err != nil {
> +             os.Exit(-1)
> +     }
> +     defer ctx.Close()
> +     if err != nil {
> +             os.Exit(-1)
> +     }

Redundant error check.

> +
> +     max_cpus, err := ctx.GetMaxCpus()
> +     if err != nil {
> +             fmt.Printf("%d\n", err)
> +     } else {
> +             fmt.Printf("%d\n", max_cpus)
> +     }
> +
> +}
> diff --git a/tools/golang/xenlight/test/xeninfo/maxnodes.c 
> b/tools/golang/xenlight/test/xeninfo/maxnodes.c
> new file mode 100644
> index 0000000..0e79c8d
> --- /dev/null
> +++ b/tools/golang/xenlight/test/xeninfo/maxnodes.c
> @@ -0,0 +1,16 @@
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <libxl.h>
> +
> +int main(){
> +
> +    libxl_ctx *context;
> +    libxl_ctx_alloc(&context,LIBXL_VERSION, 0, NULL);
> +
> +    int max_nodes = libxl_get_max_nodes(context);
> +    printf("%d\n", max_nodes);
> +
> +   libxl_ctx_free(context);

Indentation.

> +
> +}
> +
> diff --git a/tools/golang/xenlight/test/xeninfo/maxnodes.go 
> b/tools/golang/xenlight/test/xeninfo/maxnodes.go
> new file mode 100644
> index 0000000..906e596
> --- /dev/null
> +++ b/tools/golang/xenlight/test/xeninfo/maxnodes.go
> @@ -0,0 +1,27 @@
> +package main
> +
> +import (
> +     "fmt"
> +     "os"
> +     "xenproject.org/xenlight"
> +)
> +
> +func main() {
> +     ctx := xenlight.Ctx
> +     err := ctx.Open()
> +     if err != nil {
> +             os.Exit(-1)
> +     }
> +     defer ctx.Close()
> +     if err != nil {
> +             os.Exit(-1)
> +     }

Redundant error check.

> +
> +     max_nodes, err := ctx.GetMaxNodes()
> +     if err != nil {
> +             fmt.Printf("%d\n", err)
> +     } else {
> +             fmt.Printf("%d\n", max_nodes)
> +     }
> +
> +}
> diff --git a/tools/golang/xenlight/test/xeninfo/onlinecpu.c 
> b/tools/golang/xenlight/test/xeninfo/onlinecpu.c
> new file mode 100644
> index 0000000..8da3414
> --- /dev/null
> +++ b/tools/golang/xenlight/test/xeninfo/onlinecpu.c
> @@ -0,0 +1,16 @@
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <libxl.h>
> +
> +int main(){
> +
> +    libxl_ctx *context;
> +    libxl_ctx_alloc(&context,LIBXL_VERSION, 0, NULL);
> +
> +    int online_cpus = libxl_get_online_cpus(context);
> +    printf("%d\n", online_cpus);
> +
> +    libxl_ctx_free(context);
> +
> +}
> +
> diff --git a/tools/golang/xenlight/test/xeninfo/onlinecpu.go 
> b/tools/golang/xenlight/test/xeninfo/onlinecpu.go
> new file mode 100644
> index 0000000..74323c4
> --- /dev/null
> +++ b/tools/golang/xenlight/test/xeninfo/onlinecpu.go
> @@ -0,0 +1,27 @@
> +package main
> +
> +import (
> +     "fmt"
> +     "os"
> +     "xenproject.org/xenlight"
> +)
> +
> +func main() {
> +     ctx := xenlight.Ctx
> +     err := ctx.Open()
> +     if err != nil {
> +             os.Exit(-1)
> +     }
> +     defer ctx.Close()
> +     if err != nil {
> +             os.Exit(-1)
> +     }

Redundant error check.

> +
> +     online_cpus, err := ctx.GetOnlineCpus()
> +     if err != nil {
> +             fmt.Printf("%d\n", err)
> +     } else {
> +             fmt.Printf("%d\n", online_cpus)
> +     }
> +
> +}
> diff --git a/tools/golang/xenlight/test/xeninfo/physinfo.c 
> b/tools/golang/xenlight/test/xeninfo/physinfo.c
> new file mode 100644
> index 0000000..ba3aa44
> --- /dev/null
> +++ b/tools/golang/xenlight/test/xeninfo/physinfo.c
> @@ -0,0 +1,31 @@
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <libxl.h>
> +#include "print.h"
> +
> +int main(){
> +
> +    libxl_ctx *context;
> +    libxl_ctx_alloc(&context,LIBXL_VERSION, 0, NULL);
> +    libxl_physinfo info;
> +    libxl_physinfo_init(&info);
> +    int err= libxl_get_physinfo(context,&info);
> +    if(err != 0){
> +        return err;
> +    }
> +
> +    printf("%d\n%d\n%d\n%d\n%d\n", info.threads_per_core, 
> info.cores_per_socket, info.max_cpu_id, info.nr_cpus, info.cpu_khz);
> +    printf("%lu\n%lu\n%lu\n%lu\n%lu\n%lu\n", info.total_pages, 
> info.free_pages, info.scrub_pages, info.outstanding_pages, 
> info.sharing_freed_pages, info.sharing_used_frames);
> +    printf("%u\n",info.nr_nodes);
> +    printf("%s\n%s\n", bool_to_string(info.cap_hvm), 
> bool_to_string(info.cap_hvm_directio));
> +
> +    int i;
> +    for(i = 0; i < 8; i++){
> +        printf("%u\n", info.hw_cap[i]);
> +    }
> +
> +    libxl_physinfo_init(&info);
> +    libxl_ctx_free(context);
> +
> +}
> +
> diff --git a/tools/golang/xenlight/test/xeninfo/physinfo.go 
> b/tools/golang/xenlight/test/xeninfo/physinfo.go
> new file mode 100644
> index 0000000..cf7bdd4
> --- /dev/null
> +++ b/tools/golang/xenlight/test/xeninfo/physinfo.go
> @@ -0,0 +1,32 @@
> +package main
> +
> +import (
> +     "fmt"
> +     "os"
> +     "xenproject.org/xenlight"
> +)
> +
> +func main() {
> +     ctx := xenlight.Ctx
> +     err := ctx.Open()
> +     if err != nil {
> +             os.Exit(-1)
> +     }
> +     defer ctx.Close()
> +     info, err := ctx.GetPhysinfo()
> +     if err != nil {
> +             os.Exit(-1)
> +     }
> +
> +     fmt.Printf("%d\n%d\n%d\n%d\n%d\n", info.ThreadsPerCore, 
> info.CoresPerSocket,
> +             info.MaxCpuId, info.NrCpus, info.CpuKhz)
> +     fmt.Printf("%d\n%d\n%d\n%d\n%d\n%d\n", info.TotalPages, info.FreePages,
> +             info.ScrubPages, info.OutstandingPages, info.SharingFreedPages,
> +             info.SharingUsedFrames)
> +     fmt.Printf("%d\n", info.NrNodes)
> +     fmt.Printf("%t\n%t\n", info.CapHvm, info.CapHvmDirectio)
> +
> +     for i := 0; i < 8; i++ {
> +             fmt.Printf("%d\n", info.HwCap[i])
> +     }
> +}
> diff --git a/tools/golang/xenlight/test/xeninfo/print.h 
> b/tools/golang/xenlight/test/xeninfo/print.h
> new file mode 100644
> index 0000000..6aaa29c
> --- /dev/null
> +++ b/tools/golang/xenlight/test/xeninfo/print.h
> @@ -0,0 +1,3 @@
> +char* bool_to_string(a){
> +             return (a? "true" : "false");
> +}

It's not considered good form to define C functions in a .h file; this
should at least be a static inline.

And as gcc will tell you if you add -Werror, you need to give a a type.

Thanks,
 -George


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.