|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [RFC PATCH v1 21/25] hw/xen: Add emulated implementation of grant table operations
On Tue, 2023-03-07 at 16:07 +0000, Paul Durrant wrote:
> On 02/03/2023 15:34, David Woodhouse wrote:
> > From: David Woodhouse <dwmw@xxxxxxxxxxxx>
> >
> > This is limited to mapping a single grant at a time, because under Xen the
> > pages are mapped *contiguously* into qemu's address space, and that's very
> > hard to do when those pages actually come from anonymous mappings in qemu
> > in the first place.
> >
> > Eventually perhaps we can look at using shared mappings of actual objects
> > for system RAM, and then we can make new mappings of the same backing
> > store (be it deleted files, shmem, whatever). But for now let's stick to
> > a page at a time.
> >
> > Signed-off-by: David Woodhouse <dwmw@xxxxxxxxxxxx>
> > ---
> > hw/i386/kvm/xen_gnttab.c | 299 ++++++++++++++++++++++++++++++++++++++-
> > 1 file changed, 296 insertions(+), 3 deletions(-)
> >
> [snip]
> > +static uint64_t gnt_ref(XenGnttabState *s, grant_ref_t ref, int prot)
> > +{
> > + uint16_t mask = GTF_type_mask | GTF_sub_page;
> > + grant_entry_v1_t gnt, *gnt_p;
> > + int retries = 0;
> > +
> > + if (ref >= s->max_frames * ENTRIES_PER_FRAME_V1 ||
> > + s->map_track[ref] == UINT8_MAX) {
> > + return INVALID_GPA;
> > + }
> > +
> > + if (prot & PROT_WRITE) {
> > + mask |= GTF_readonly;
> > + }
> > +
> > + gnt_p = &s->entries.v1[ref];
> > +
> > + /*
> > + * The guest can legitimately be changing the GTF_readonly flag. Allow
>
> I'd call a guest playing with the ref after setting GTF_permit_access a
> buggy guest and not bother with the loop.
Didn't we have this argument already when I tried to get you to change
your one? :)
I argue that it's OK for a guest to *increase* permissions to include
write permission, even while a read-only grant may be in progress.
And also to *decrease* permissions to take away write permission, even
while read-only grants may be in progress.
The loop is what Xen does, so let's do it that way.
>
> > + * that, but don't let a malicious guest cause a livelock.
> > + */
> > + for (retries = 0; retries < 5; retries++) {
> > + uint16_t new_flags;
> > +
> > + /* Read the entry before an atomic operation on its flags */
> > + gnt = *(volatile grant_entry_v1_t *)gnt_p;
> > +
> > + if ((gnt.flags & mask) != GTF_permit_access ||
> > + gnt.domid != DOMID_QEMU) {
> > + return INVALID_GPA;
> > + }
> > +
> > + new_flags = gnt.flags | GTF_reading;
> > + if (prot & PROT_WRITE) {
> > + new_flags |= GTF_writing;
> > + }
> > +
> > + if (qatomic_cmpxchg(&gnt_p->flags, gnt.flags, new_flags) ==
> > gnt.flags) {
>
> Xen actually does a cmpxchg on both the flags and the domid. We probably
> ought to fail to set the flags if the guest is playing with the domid
> but since we're single-tenant it doesn't *really* matter... just a
> nice-to-have. So...
Yeah, changing the *domid* while it's active is definitely not an OK
thing to do.
Attachment:
smime.p7s
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |