From: Sean Christopherson <sean.j.christopherson@intel.com>
To: David Laight <David.Laight@ACULAB.COM>
Cc: 'Paolo Bonzini' <pbonzini@redhat.com>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"kvm@vger.kernel.org" <kvm@vger.kernel.org>
Subject: Re: [PATCH] KVM: x86: optimize check for valid PAT value
Date: Wed, 10 Apr 2019 07:57:25 -0700 [thread overview]
Message-ID: <20190410145725.GB10760@linux.intel.com> (raw)
In-Reply-To: <c2aaa028ef564c6d8bd50dbd86489115@AcuMS.aculab.com>
On Wed, Apr 10, 2019 at 12:55:53PM +0000, David Laight wrote:
> From: Paolo Bonzini
> > Sent: 10 April 2019 10:55
> >
> > This check will soon be done on every nested vmentry and vmexit,
> > "parallelize" it using bitwise operations.
> >
> > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> > ---
> ...
> > diff --git a/arch/x86/kvm/x86.h b/arch/x86/kvm/x86.h
> > index 28406aa1136d..7bc7ac9d2a44 100644
> > --- a/arch/x86/kvm/x86.h
> > +++ b/arch/x86/kvm/x86.h
> > @@ -347,4 +347,12 @@ static inline void kvm_after_interrupt(struct kvm_vcpu *vcpu)
> > __this_cpu_write(current_vcpu, NULL);
> > }
> >
> > +static inline bool kvm_pat_valid(u64 data)
> > +{
> > + if (data & 0xF8F8F8F8F8F8F8F8)
> > + return false;
> > + /* 0, 1, 4, 5, 6, 7 are valid values. */
> > + return (data | ((data & 0x0202020202020202) << 1)) == data;
> > +}
> > +
>
> How about:
> /*
> * Each byte must be 0, 1, 4, 5, 6 or 7.
> * Convert 001x to 011x then 100x so 2 and 3 fail the test.
> */
> data |= (data ^ 0x0404040404040404ULL)) + 0x0202020202020202ULL;
> if (data & 0xF8F8F8F8F8F8F8F8ULL)
> return false;
Woah. My vote is for Paolo's version as the separate checks allow the
reader to walk through step-by-step. The generated assembly isn't much
different from a performance perspective since the TEST+JNE will be not
taken in the fast path.
Fancy:
0x000000000004844f <+255>: movabs $0xf8f8f8f8f8f8f8f8,%rcx
0x0000000000048459 <+265>: xor %eax,%eax
0x000000000004845b <+267>: test %rcx,%rdx
0x000000000004845e <+270>: jne 0x4848b <kvm_mtrr_valid+315>
0x0000000000048460 <+272>: movabs $0x202020202020202,%rax
0x000000000004846a <+282>: and %rdx,%rax
0x000000000004846d <+285>: add %rax,%rax
0x0000000000048470 <+288>: or %rdx,%rax
0x0000000000048473 <+291>: cmp %rdx,%rax
0x0000000000048476 <+294>: sete %al
0x0000000000048479 <+297>: retq
Really fancy:
0x0000000000048447 <+247>: movabs $0x404040404040404,%rcx
0x0000000000048451 <+257>: movabs $0x202020202020202,%rax
0x000000000004845b <+267>: xor %rdx,%rcx
0x000000000004845e <+270>: add %rax,%rcx
0x0000000000048461 <+273>: movabs $0xf8f8f8f8f8f8f8f8,%rax
0x000000000004846b <+283>: or %rcx,%rdx
0x000000000004846e <+286>: test %rax,%rdx
0x0000000000048471 <+289>: sete %al
0x0000000000048474 <+292>: retq
next prev parent reply other threads:[~2019-04-10 14:57 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-04-10 9:55 [PATCH] KVM: x86: optimize check for valid PAT value Paolo Bonzini
2019-04-10 12:55 ` David Laight
2019-04-10 14:57 ` Sean Christopherson [this message]
2019-04-10 17:09 ` Paolo Bonzini
2019-04-11 9:06 ` David Laight
2019-04-15 8:11 ` Paolo Bonzini
2019-04-15 9:03 ` David Laight
2019-04-10 14:58 ` Sean Christopherson
2019-04-10 23:36 ` Krish Sadhukhan
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=20190410145725.GB10760@linux.intel.com \
--to=sean.j.christopherson@intel.com \
--cc=David.Laight@ACULAB.COM \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=pbonzini@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.