From: Sean Christopherson <seanjc@google.com>
To: Colton Lewis <coltonlewis@google.com>
Cc: kvm@vger.kernel.org, pbonzini@redhat.com, maz@kernel.org,
dmatlack@google.com, oupton@google.com, ricarkol@google.com,
andrew.jones@linux.dev
Subject: Re: [PATCH v6 1/3] KVM: selftests: implement random number generation for guest code
Date: Tue, 11 Oct 2022 23:47:01 +0000 [thread overview]
Message-ID: <Y0YAdQC7eP1TN90b@google.com> (raw)
In-Reply-To: <gsnt8rlm2e38.fsf@coltonlewis-kvm.c.googlers.com>
On Tue, Oct 11, 2022, Colton Lewis wrote:
> Sean Christopherson <seanjc@google.com> writes:
> > Regardless of whether or not the details are gory, having to be aware of
> > those details unnecessarily impedes understanding the code. The vast, vast
> > majority of folks that read this code won't care about how PRNGs work.
> > Even if the reader is familiar with PRNGs, those details aren't at all
> > relevant to understanding what the guest code does. The reader only needs
> > to know "oh, this is randomizing the address". How the randomization works
> > is completely irrelevant for that level of understanding.
>
> It is relevant if the reader of the guest code cares about reentrancy
> and thread-safety (good for such things as reproducing the same stream
> of randoms from the same initial conditions), because they will have to
> manage some state to make that work. Whether that state is an integer or
> an opaque struct requires the same level of knowledge to use the API.
By "readers" I'm not (only) talking about developers actively writing code, I'm
I'm talking about people that run this test, encounter a failure, and read the code
to try and understand what went wrong. For those people, knowing that the guest is
generating a random number is sufficient information during initial triage. If the
failure ends up being related to the random number, then yes they'll likely need to
learn the details, but that's a few steps down the road.
> > > I agree returning the value could make it easier to use as part of
> > > expressions, but is it that important?
>
> > Yes, because in pretty much every use case, the random number is going to
> > be immediately consumed. Readability and robustness aside, returning the
> > value cuts the amount of code need to generate and consume a random number
> > in half.
>
> Ok. This is trivial to change (or implement on top of what is
> there). Would you be happy with something like the following?
>
> uint32_t guest_random(uint32_t *seed)
> {
> *seed = (uint64_t)*seed * 48271 % ((uint32_t)(1 << 31) - 1);
> return *seed;
> }
Honestly, no. I truly don't understand the pushback on throwing the seed into
a struct and giving the helpers more precise names. E.g. without looking at the
prototype, guest_random() tells the reader nothing about the size of the random
number returned, whereas <namespace>_random_u32() or <namespace>_get_random_u32()
(if we want to more closely follow kernel nomenclature) tells the reader exactly
what is returned.
As a contrived example, imagine a bug where the intent was to do 50/50 reads/writes,
but the test ends up doing almost all writes. Code that looks like:
if (guest_random(...))
is less obviously wrong than
if (guest_random_u32(...))
even if the user knows nothing about how the random number is generated.
And aside from hiding details and providing abstraction for readers, throwing a
shim struct around the seed means that if we do want to change up the internal
implementation, then we can do so without having to churn users.
The code is trivial to write and I can't think of any meaningful downside. Worst
case scenario, we end up with an implementation that is slightly more formal than
then we really need.
next prev parent reply other threads:[~2022-10-11 23:47 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-09-12 19:58 [PATCH v6 0/3] KVM: selftests: randomize memory access of dirty_log_perf_test Colton Lewis
2022-09-12 19:58 ` [PATCH v6 1/3] KVM: selftests: implement random number generation for guest code Colton Lewis
2022-10-07 20:41 ` Sean Christopherson
2022-10-11 18:11 ` Colton Lewis
2022-10-11 18:39 ` Sean Christopherson
2022-10-11 22:24 ` Colton Lewis
2022-10-11 23:47 ` Sean Christopherson [this message]
2022-10-12 21:11 ` Colton Lewis
2022-10-12 23:34 ` Sean Christopherson
2022-10-10 18:03 ` Sean Christopherson
2022-10-11 18:13 ` Colton Lewis
2022-10-11 18:26 ` Sean Christopherson
2022-10-11 22:33 ` Colton Lewis
2022-09-12 19:58 ` [PATCH v6 2/3] KVM: selftests: randomize which pages are written vs read Colton Lewis
2022-10-07 20:55 ` Sean Christopherson
2022-10-07 21:07 ` David Matlack
2022-10-08 9:50 ` Andrew Jones
2022-10-10 14:46 ` Sean Christopherson
2022-10-10 16:38 ` Andrew Jones
2022-09-12 19:58 ` [PATCH v6 3/3] KVM: selftests: randomize page access order Colton Lewis
2022-10-07 21:09 ` Sean Christopherson
2022-10-11 18:12 ` Colton Lewis
2022-10-11 18:22 ` Sean Christopherson
2022-10-11 22:25 ` Colton Lewis
2022-10-11 22:50 ` Sean Christopherson
2022-09-19 22:36 ` [PATCH v6 0/3] KVM: selftests: randomize memory access of dirty_log_perf_test David Matlack
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=Y0YAdQC7eP1TN90b@google.com \
--to=seanjc@google.com \
--cc=andrew.jones@linux.dev \
--cc=coltonlewis@google.com \
--cc=dmatlack@google.com \
--cc=kvm@vger.kernel.org \
--cc=maz@kernel.org \
--cc=oupton@google.com \
--cc=pbonzini@redhat.com \
--cc=ricarkol@google.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.