[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [RFC PATCH v2 2/2] tools/misc: Add xen-vcpus-stats tool
Hello Andrew and thanks for the comments, On Thu, Feb 23, 2023 at 04:01:09PM +0000, Andrew Cooper wrote: > On 07/10/2022 1:39 pm, Matias Ezequiel Vara Larsen wrote: > > A couple of observations, all unrelated to the stats themselves. > > Although overall, I'm not entirely certain that a tool like this is > going to be very helpful after initial development. Something to > consider would be to alter libxenstat to use this new interface? > Yes. We discussed about this in a design sesion at the summit. I could not move forward on that direction yet but it is the right way to go. I use this tool only to play with the interface and I could just remove it from the RFC in next versions. > > diff --git a/tools/misc/Makefile b/tools/misc/Makefile > > index 2b683819d4..837e4b50da 100644 > > --- a/tools/misc/Makefile > > +++ b/tools/misc/Makefile > > @@ -49,6 +49,7 @@ TARGETS_COPY += xenpvnetboot > > > > # Everything which needs to be built > > TARGETS_BUILD := $(filter-out $(TARGETS_COPY),$(TARGETS_ALL)) > > +TARGETS_BUILD += xen-vcpus-stats > > This patch is whitespace corrupted. If at all possible, you need to see > about getting `git send-email` working to send patches with, as it deals > with most of the whitespace problems for you. > > I'm afraid you can't simply copy the patch text into an email and send that. > I am using `git send-email` to send patches. I may have missed some flag. I'll double-check. > > > > # ... including build-only targets > > TARGETS_BUILD-$(CONFIG_X86) += xen-vmtrace > > @@ -135,4 +136,9 @@ xencov: xencov.o > > xen-ucode: xen-ucode.o > > $(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl) $(APPEND_LDFLAGS) > > > > +xen-vcpus-stats.o: CFLAGS += $(CFLAGS_libxenforeginmemory) > > + > > +xen-vcpus-stats: xen-vcpus-stats.o > > + $(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl) > > $(LDLIBS_libxenforeignmemory) $(APPEND_LDFLAGS) > > + > > -include $(DEPS_INCLUDE) > > diff --git a/tools/misc/xen-vcpus-stats.c b/tools/misc/xen-vcpus-stats.c > > new file mode 100644 > > index 0000000000..29d0efb124 > > --- /dev/null > > +++ b/tools/misc/xen-vcpus-stats.c > > @@ -0,0 +1,87 @@ > > +#include <err.h> > > +#include <errno.h> > > +#include <error.h> > > +#include <stdio.h> > > +#include <stdlib.h> > > +#include <string.h> > > +#include <sys/mman.h> > > +#include <signal.h> > > + > > +#include <xenctrl.h> > > +#include <xenforeignmemory.h> > > +#include <xen/vcpu.h> > > + > > +#define rmb() asm volatile("lfence":::"memory") > > This is rmb(), but rmb() isn't what you want. > > You want smp_rmb(), which is > > #define smp_rmb() asm volatile ("" ::: "memory") > > > I'm surprised we haven't got this in a common location, considering how > often it goes wrong. (Doesn't help that there's plenty of buggy > examples to copy, even in xen.git) > Got it. I'll rework on it in the next version. For inspiration, I used the code at arch/x86/kernel/pvclock.c:pvclock_read_wallclock(). > > + > > +static sig_atomic_t interrupted; > > +static void close_handler(int signum) > > +{ > > + interrupted = 1; > > +} > > + > > +int main(int argc, char **argv) > > +{ > > + xenforeignmemory_handle *fh; > > + xenforeignmemory_resource_handle *res; > > + size_t size; > > + int rc, domid, period, vcpu; > > + shared_vcpustatspage_t * info; > > shared_vcpustatspage_t *info; > > no space after the *. > > But you also cannot have a single structure describing that. I'll reply > to the cover letter discussing ABIs. I am reading it and I will comment on this soon. > > > + struct sigaction act; > > + uint32_t version; > > + uint64_t value; > > + > > + if (argc != 4 ) { > > { on a new line. > > > + fprintf(stderr, "Usage: %s <domid> <vcpu> <period>\n", argv[0]); > > + return 1; > > + } > > + > > + domid = atoi(argv[1]); > > + vcpu = atoi(argv[2]); > > + period = atoi(argv[3]); > > + > > + act.sa_handler = close_handler; > > + act.sa_flags = 0; > > + sigemptyset(&act.sa_mask); > > + sigaction(SIGHUP, &act, NULL); > > + sigaction(SIGTERM, &act, NULL); > > + sigaction(SIGINT, &act, NULL); > > + sigaction(SIGALRM, &act, NULL); > > + > > + fh = xenforeignmemory_open(NULL, 0); > > + > > + if ( !fh ) > > + err(1, "xenforeignmemory_open"); > > + > > + rc = xenforeignmemory_resource_size( > > + fh, domid, XENMEM_resource_stats_table, > > + 0, &size); > > + > > + if ( rc ) > > + err(1, "Fail: Get size"); > > + > > + res = xenforeignmemory_map_resource( > > + fh, domid, XENMEM_resource_stats_table, > > + 0, XENMEM_resource_stats_frame_vcpustats, size >> XC_PAGE_SHIFT, > > + (void **)&info, PROT_READ, 0); > > + > > + if ( !res ) > > + err(1, "Fail: Map"); > > + > > + while ( !interrupted ) { > > { on newline again. > > > + sleep(period); > > + do { > > + version = info->vcpu_info[vcpu].version; > > + rmb(); > > + value = info->vcpu_info[vcpu].runstate_running_time; > > + rmb(); > > + } while ((info->vcpu_info[vcpu].version & 1) || > > + (version != info->vcpu_info[vcpu].version)); > > So I think this will function correctly. > > But I do recall seeing a rather nice way of wrapping a sequence lock in > C99. I'll see if I can find it. > > > + printf("running_vcpu_time[%d]: %ld\n", vcpu, value); > > + } > > + > > + rc = xenforeignmemory_unmap_resource(fh, res); > > + if ( rc ) > > + err(1, "Fail: Unmap"); > > Given that you unmap(), you ought to close the fh handle too. > Thanks, I'll fix these issues in the next version. I think Jan's review have already spotted some of them. Matias
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |