From: "Anthony Harivel" <aharivel@redhat.com>
To: "Daniel P. Berrangé" <berrange@redhat.com>
Cc: <pbonzini@redhat.com>, <mtosatti@redhat.com>,
<qemu-devel@nongnu.org>, <vchundur@redhat.com>
Subject: Re: [PATCH v3 3/3] Add support for RAPL MSRs in KVM/Qemu
Date: Tue, 12 Mar 2024 12:21:14 +0100 [thread overview]
Message-ID: <CZRQCYCXNTF2.1I5CNECSOB6IL@fedora> (raw)
In-Reply-To: <ZbjDtytv-_-Bz4-S@redhat.com>
Hi Daniel, Paolo,
Here my last questions before wrapping up and send v4, or maybe call off
my attempt to add RAPL interface in QEMU.
Daniel P. Berrangé, Jan 30, 2024 at 10:39:
> > + rcu_register_thread();
> > +
> > + /* Get QEMU PID*/
> > + pid = getpid();
> > +
> > + /* Nb of CPUS per packages */
> > + maxcpus = vmsr_get_maxcpus(0);
> > +
> > + /* Nb of Physical Packages on the system */
> > + maxpkgs = vmsr_get_max_physical_package(maxcpus);
>
> This function can fail so this needs to be checked & reported.
>
> > +
> > + /* Those MSR values should not change as well */
> > + vmsr->msr_unit = vmsr_read_msr(MSR_RAPL_POWER_UNIT, 0, pid,
> > + s->msr_energy.socket_path);
> > + vmsr->msr_limit = vmsr_read_msr(MSR_PKG_POWER_LIMIT, 0, pid,
> > + s->msr_energy.socket_path);
> > + vmsr->msr_info = vmsr_read_msr(MSR_PKG_POWER_INFO, 0, pid,
> > + s->msr_energy.socket_path);
>
> This function can fail for a variety of reasons, most especially if someone
> gave an incorrect socket path, or if the daemon is not running. This is not
> getting diagnosed, and even if we try to report it here, we're in a background
> thread at this point.
>
> I think we need to connect and report errors before even starting this
> thread, so that QEMU startup gets aborted upon configuration error.
>
Fair enough. Would it be ok to do the sanity check before
rcu_register_thread() and "return NULL;" in case of error or would you
prefer me to check all of this before even calling the
qemu_thread_create() ?
> > + /* Populate all the thread stats */
> > + for (int i = 0; i < num_threads; i++) {
> > + thd_stat[i].utime = g_new0(unsigned long long, 2);
> > + thd_stat[i].stime = g_new0(unsigned long long, 2);
> > + thd_stat[i].thread_id = thread_ids[i];
> > + vmsr_read_thread_stat(&thd_stat[i], pid, 0);
>
> It is non-obvious that the 3rd parameter here is an index into
> the utime & stime array. This function would be saner to review
> if called as:
>
> vmsr_read_thread_stat(pid,
> thd_stat[i].thread_id,
> &thd_stat[i].utime[0],
> &thd_stat[i].stime[0],
> &thd_stat[i].cpu_id);
>
> so we see what are input parameters and what are output parameters.
>
> Also this method can fail, eg if the thread has exited already,
> so we need to take that into account and stop trying to get info
> for that thread in later code. eg by setting 'thread_id' to 0
> and then skipping any thread_id == 0 later.
>
>
Good point. I'll rework the function and return "thread_id" to 0 in
case of failure in order to test it later on.
> > + thd_stat[i].numa_node_id = numa_node_of_cpu(thd_stat[i].cpu_id);
> > + }
> > +
> > + /* Retrieve all packages power plane energy counter */
> > + for (int i = 0; i <= maxpkgs; i++) {
> > + for (int j = 0; j < num_threads; j++) {
> > + /*
> > + * Use the first thread we found that ran on the CPU
> > + * of the package to read the packages energy counter
> > + */
> > + if (thd_stat[j].numa_node_id == i) {
>
> 'i' is a CPU ID value, while 'numa_node_id' is a NUMA node ID value.
> I don't think it is semantically valid to compare them for equality.
>
> I'm not sure the NUMA node is even relevant, since IIUC from the docs
> earlier, the power values are scoped per package, which would mean per
> CPU socket.
>
'i' here is the package number on the host.
I'm using functions of libnuma to populate the maxpkgs of the host.
I tested this on different Intel CPU with multiple packages and this
has always returned the good number of packages. A false positive ?
So here I'm checking if the thread has run on the package number 'i'.
I populate 'numa_node_id' with numa_node_of_cpu().
I did not wanted to reinvent the wheel and the only lib that was talking
about "node" was libnuma.
Maybe I'm wrong assuming that a "node" (defined as an area where all
memory has the same speed as seen from a particular CPU) could lead me
to the packages number ?
And this is what I see you wrote below:
"A numa node isn't a package AFAICT."
Regards,
Anthony
next prev parent reply other threads:[~2024-03-12 11:21 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-25 7:22 [PATCH v3 0/3] Add support for the RAPL MSRs series Anthony Harivel
2024-01-25 7:22 ` [PATCH v3 1/3] qio: add support for SO_PEERCRED for socket channel Anthony Harivel
2024-01-25 16:37 ` Daniel P. Berrangé
2024-01-29 19:25 ` Paolo Bonzini
2024-01-29 19:30 ` Daniel P. Berrangé
2024-01-25 7:22 ` [PATCH v3 2/3] tools: build qemu-vmsr-helper Anthony Harivel
2024-01-29 18:53 ` Daniel P. Berrangé
2024-01-29 19:33 ` Paolo Bonzini
2024-01-29 19:45 ` Daniel P. Berrangé
2024-01-29 19:53 ` Daniel P. Berrangé
2024-01-29 20:21 ` Paolo Bonzini
2024-02-21 13:19 ` Anthony Harivel
2024-02-21 13:47 ` Daniel P. Berrangé
2024-02-21 13:52 ` Anthony Harivel
2024-03-01 11:08 ` Anthony Harivel
2024-01-25 7:22 ` [PATCH v3 3/3] Add support for RAPL MSRs in KVM/Qemu Anthony Harivel
2024-01-29 19:29 ` Daniel P. Berrangé
2024-02-20 14:00 ` Anthony Harivel
2024-02-20 15:00 ` Daniel P. Berrangé
2024-03-05 14:58 ` Anthony Harivel
2024-01-30 9:13 ` Daniel P. Berrangé
2024-03-04 14:41 ` Anthony Harivel
2024-03-04 14:48 ` Daniel P. Berrangé
2024-03-05 13:25 ` Anthony Harivel
2024-03-05 13:57 ` Daniel P. Berrangé
2024-01-30 9:39 ` Daniel P. Berrangé
2024-03-12 11:21 ` Anthony Harivel [this message]
2024-03-12 15:49 ` Daniel P. Berrangé
2024-03-13 10:48 ` Anthony Harivel
2024-03-13 11:04 ` Daniel P. Berrangé
2024-03-14 8:26 ` Anthony Harivel
2024-03-14 8:55 ` Daniel P. Berrangé
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CZRQCYCXNTF2.1I5CNECSOB6IL@fedora \
--to=aharivel@redhat.com \
--cc=berrange@redhat.com \
--cc=mtosatti@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=vchundur@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.