From: "Han, Huaitong" <huaitong.han@intel.com>
To: "JBeulich@suse.com" <JBeulich@suse.com>
Cc: "Tian, Kevin" <kevin.tian@intel.com>,
"wei.liu2@citrix.com" <wei.liu2@citrix.com>,
"ian.campbell@citrix.com" <ian.campbell@citrix.com>,
"stefano.stabellini@eu.citrix.com"
<stefano.stabellini@eu.citrix.com>,
"george.dunlap@eu.citrix.com" <george.dunlap@eu.citrix.com>,
"andrew.cooper3@citrix.com" <andrew.cooper3@citrix.com>,
"ian.jackson@eu.citrix.com" <ian.jackson@eu.citrix.com>,
"george.dunlap@citrix.com" <george.dunlap@citrix.com>,
"xen-devel@lists.xen.org" <xen-devel@lists.xen.org>,
"Nakajima, Jun" <jun.nakajima@intel.com>,
"keir@xen.org" <keir@xen.org>
Subject: Re: [V3 PATCH 7/9] x86/hvm: pkeys, add pkeys support for guest_walk_tables
Date: Thu, 17 Dec 2015 09:18:56 +0000 [thread overview]
Message-ID: <1450343942.3809.8.camel@intel.com> (raw)
In-Reply-To: <5671392502000078000C0093@prv-mh.provo.novell.com>
On Wed, 2015-12-16 at 02:12 -0700, Jan Beulich wrote:
> > > > On 16.12.15 at 10:03, <huaitong.han@intel.com> wrote:
> > On Wed, 2015-12-16 at 01:32 -0700, Jan Beulich wrote:
> > > > > > On 16.12.15 at 09:16, <huaitong.han@intel.com> wrote:
> > > > On Tue, 2015-12-15 at 02:02 -0700, Jan Beulich wrote:
> > > > > Well, I wouldn't want you to introduce a brand new function,
> > > > > but
> > > > > instead just factor out the necessary piece from xsave()
> > > > > (making
> > > > > the new one take a struct xsave_struct * instead of a struct
> > > > > vcpu
> > > > > *,
> > > > > and calling it from what is now xsave()).
> > > > So the function looks like this:
> > > > unsigned int get_xsave_pkru(struct vcpu *v)
> > > > {
> > > > void *offset;
> > > > struct xsave_struct *xsave_area;
> > > > uint64_t mask = XSTATE_PKRU;
> > > > unsigned int index = fls64(mask) - 1;
> > > > unsigned int pkru = 0;
> > > >
> > > > if ( !cpu_has_xsave )
> > > > return 0;
> > > >
> > > > BUG_ON(xsave_cntxt_size < XSTATE_AREA_MIN_SIZE);
> > > > xsave_area = _xzalloc(xsave_cntxt_size, 64);
> > > > if ( xsave_area == NULL )
> > > > return 0;
> > > >
> > > > xsave(xsave_area, mask);
> > > > offset = (void *)xsave_area + (xsave_area_compressed(xsave)
> > > > ?
> > > > XSTATE_AREA_MIN_SIZE : xstate_offsets[index] );
> > > > memcpy(&pkru, offset, sizeof(pkru));
> > > >
> > > > xfree(xsave_area);
> > > >
> > > > return pkru;
> > > > }
> > >
> > > Depending on how frequently this might get called, the allocation
> > > overhead may not be tolerable. I.e. you may want to set up e.g.
> > > a per-CPU buffer up front. Or you check whether using RDPKRU
> > > (with temporarily setting CR4.PKE) is cheaper than what you
> > > do right now.
> > RDPKRU does cost less than the function, and if temporarily setting
> > CR4.PKE is accepted, I will use RDPKRU instead of the function.
>
> The question isn't just the RDPKRU cost, but that of the two CR4
> writes.
Testing result with NOW() function:
Time of the function 10 times execution
(XEN)xsave time is 1376 ns
(XEN)read_pkru time is 28 ns
So, read_pkru function does cost less than get_xsave_pkru, and I will
use read_pkru.
Testing codes:
static void reboot_machine(unsigned char key, struct cpu_user_regs
*regs)
{
- printk("'%c' pressed -> rebooting machine\n", key);
- machine_restart(0);
+ // printk("read pkru test\n", key);
+ s_time_t pre, last;
+ unsigned int pkru = 0;
+ unsigned int i = 0;
+ void * offset;
+ struct xsave_struct *save_area = _xzalloc(1024, 64);
+
+ pre = NOW();
+ for (;i< 10;i++){
+ xsave(current, XSTATE_PKRU, save_area);
+ offset = (void *)save_area + XSTATE_AREA_MIN_SIZE;
+ memcpy(&pkru, offset, sizeof(pkru));}
+ last = NOW();
+ printk("xsave time is %lu\n", (last - pre));
+
+ pre = NOW();
+ for (;i< 10;i++){
+ pkru = read_pkru();
+ }
+ last = NOW();
+ printk("read_pkru time is %lu\n", (last - pre));
+ // machine_restart(0);
}
static inline unsigned int read_pkru(void)
{
unsigned int pkru;
set_in_cr4(X86_CR4_PKE);
asm volatile (".byte 0x0f,0x01,0xee"
: "=a" (pkru) : "c" (0) : "dx");
clear_in_cr4(X86_CR4_PKE);
return pkru;
}
>
> Jan
>
next prev parent reply other threads:[~2015-12-17 9:18 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-12-07 9:16 [V3 PATCH 0/9] x86/hvm: pkeys, add memory protection-key support Huaitong Han
2015-12-07 9:16 ` [V3 PATCH 1/9] x86/hvm: pkeys, add the flag to enable Memory Protection Keys Huaitong Han
2015-12-10 15:37 ` George Dunlap
2015-12-07 9:16 ` [V3 PATCH 2/9] x86/hvm: pkeys, add pkeys support when setting CR4 Huaitong Han
2015-12-07 9:16 ` [V3 PATCH 3/9] x86/hvm: pkeys, disable pkeys for guests in non-paging mode Huaitong Han
2015-12-07 9:16 ` [V3 PATCH 4/9] x86/hvm: pkeys, add functions to get pkeys value from PTE Huaitong Han
2015-12-10 15:48 ` George Dunlap
2015-12-10 18:47 ` Andrew Cooper
2015-12-07 9:16 ` [V3 PATCH 5/9] x86/hvm: pkeys, add functions to support PKRU access Huaitong Han
2015-12-10 18:48 ` Andrew Cooper
2015-12-07 9:16 ` [V3 PATCH 6/9] x86/hvm: pkeys, add xstate support for pkeys Huaitong Han
2015-12-10 17:39 ` George Dunlap
2015-12-10 18:57 ` Andrew Cooper
2015-12-11 9:36 ` Jan Beulich
2015-12-07 9:16 ` [V3 PATCH 7/9] x86/hvm: pkeys, add pkeys support for guest_walk_tables Huaitong Han
2015-12-10 18:19 ` George Dunlap
2015-12-11 9:16 ` Wu, Feng
2015-12-11 9:23 ` Jan Beulich
2015-12-16 15:36 ` George Dunlap
2015-12-16 16:28 ` Tim Deegan
2015-12-16 16:34 ` Andrew Cooper
2015-12-16 17:33 ` Tim Deegan
2015-12-16 16:50 ` George Dunlap
2015-12-16 17:21 ` Tim Deegan
2015-12-18 8:21 ` Han, Huaitong
2015-12-18 10:03 ` George Dunlap
2015-12-18 11:46 ` Tim Deegan
2015-12-11 9:23 ` Han, Huaitong
2015-12-11 9:50 ` Jan Beulich
2015-12-11 9:26 ` Jan Beulich
2015-12-15 8:14 ` Han, Huaitong
2015-12-15 9:02 ` Jan Beulich
2015-12-16 8:16 ` Han, Huaitong
2015-12-16 8:32 ` Jan Beulich
2015-12-16 9:03 ` Han, Huaitong
2015-12-16 9:12 ` Jan Beulich
2015-12-17 9:18 ` Han, Huaitong [this message]
2015-12-17 10:05 ` Jan Beulich
2015-12-10 18:59 ` Andrew Cooper
2015-12-11 7:18 ` Han, Huaitong
2015-12-11 8:48 ` Andrew Cooper
2015-12-07 9:16 ` [V3 PATCH 8/9] x86/hvm: pkeys, add pkeys support for gva2gfn funcitons Huaitong Han
2015-12-07 9:16 ` [V3 PATCH 9/9] x86/hvm: pkeys, add pkeys support for cpuid handling Huaitong Han
2015-12-11 9:47 ` Jan Beulich
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=1450343942.3809.8.camel@intel.com \
--to=huaitong.han@intel.com \
--cc=JBeulich@suse.com \
--cc=andrew.cooper3@citrix.com \
--cc=george.dunlap@citrix.com \
--cc=george.dunlap@eu.citrix.com \
--cc=ian.campbell@citrix.com \
--cc=ian.jackson@eu.citrix.com \
--cc=jun.nakajima@intel.com \
--cc=keir@xen.org \
--cc=kevin.tian@intel.com \
--cc=stefano.stabellini@eu.citrix.com \
--cc=wei.liu2@citrix.com \
--cc=xen-devel@lists.xen.org \
/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.