|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 05/24] xen: Preserve reserved grant entries when switching versions
On 01/27/2012 04:54 AM, Ian Campbell wrote:
> It would be worth CCing the relevant maintainers for each patch in the
> series. e.g. Keir in this case.
OK, will do that for v6.
> On Thu, 2012-01-26 at 19:44 +0000, Daniel De Graaf wrote:
>> In order for the toolstack to use reserved grant table entries, the
>> grant table for a guest must be initialized prior to the guest's boot.
>> When the guest switches grant table versions (necessary if the guest is
>> using v2 grant tables, or on kexec if switching grant versions), these
>> initial grants will be cleared. Instead of clearing them, preserve
>> the grants across the type change.
>>
>> Attempting to preserve v2-only features such as sub-page grants will
>> produce a warning and invalidate the resulting v1 grant entry.
>>
>> Signed-off-by: Daniel De Graaf <dgdegra@xxxxxxxxxxxxx>
>> ---
>> xen/common/grant_table.c | 48
>> +++++++++++++++++++++++++++++++++----
>> xen/include/public/grant_table.h | 7 +++++
>> 2 files changed, 49 insertions(+), 6 deletions(-)
>>
>> diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c
>> index 0c55fd1..6f24a94 100644
>> --- a/xen/common/grant_table.c
>> +++ b/xen/common/grant_table.c
>> @@ -2111,6 +2111,7 @@
>> gnttab_set_version(XEN_GUEST_HANDLE(gnttab_set_version_t uop))
>> struct domain *d = current->domain;
>> struct grant_table *gt = d->grant_table;
>> struct active_grant_entry *act;
>> + grant_entry_v1_t reserved_entries[GNTTAB_NR_RESERVED_ENTRIES];
>> long res;
>> int i;
>>
>> @@ -2131,7 +2132,7 @@
>> gnttab_set_version(XEN_GUEST_HANDLE(gnttab_set_version_t uop))
>> /* (You need to change the version number for e.g. kexec.) */
>> if ( gt->gt_version != 0 )
>> {
>> - for ( i = 0; i < nr_grant_entries(gt); i++ )
>> + for ( i = GNTTAB_NR_RESERVED_ENTRIES; i < nr_grant_entries(gt); i++
>> )
>
> The comment just prior says:
> /* Make sure that the grant table isn't currently in use when we
> change the version number. */
> I think this needs updating to note that we do allow reserved entries to
> be active during the switch over and we will correctly preserve
> flags/status/mapped-ness etc.
Right.
>> {
>> act = &active_entry(gt, i);
>> if ( act->pin != 0 )
>> @@ -2156,15 +2157,50 @@
>> gnttab_set_version(XEN_GUEST_HANDLE(gnttab_set_version_t uop))
>> goto out_unlock;
>> }
>>
>> + /* Preserve the first 8 entries (toolstack reserved grants) */
>> + if (gt->gt_version == 1)
>
> Xen coding style has extra spaces just inside the braces (and again
> below a few more times).
>
>> + {
>> + memcpy(reserved_entries, gt->shared_v1[0],
>> sizeof(reserved_entries));
>
> Shouldn't that be either "gt->shared_v1" or ">->shared_v1[0]" ?
>
No, [0] means this is copying from the first page; the first entry would be
gt->shared_v1[0][0]. &shared_entry_v1(gt, 0) may be clearer here; I'll use that.
>> + }
>> + else if (gt->gt_version == 2)
>> + {
>> + for ( i = 0; i < GNTTAB_NR_RESERVED_ENTRIES && i <
>> nr_grant_entries(gt); i++ )
>> + {
>> + reserved_entries[i].flags = shared_entry_v2(gt, i).hdr.flags;
>> + reserved_entries[i].domid = shared_entry_v2(gt, i).hdr.domid;
>> + reserved_entries[i].frame = shared_entry_v2(gt,
>> i).full_page.frame;
>> + reserved_entries[i].flags |= status_entry(gt, i);
>> + if ((reserved_entries[i].flags & GTF_type_mask) >
>> GTF_permit_access)
>
> In effect this only allows GTF_permit_access or GTF_invalid, which is
> good. It would be more obvious/explicit to do
> if ((shared_entry_v2(gt, i).hdr.flags & GTF_type_mask) != GTF_invalid &&
> (shared_entry_v2(gt, i).hdr.flags & GTF_type_mask) !=
> GTF_permit_access)
> memset-whole-entry and continue;
> at the top or even a switch().
In that case I think it would be clearer to only populate the entry if
GTF_permit_access
and clear it otherwise (warning if not already GTF_invalid).
>> + {
>> + gdprintk(XENLOG_INFO, "d%d: bad flags %x in grant %d when
>> switching grant version\n",
>> + d->domain_id, reserved_entries[i].flags, i);
>> + reserved_entries[i].flags = GTF_invalid;
>> + }
>> + }
>> + }
>> +
>> if ( op.version < 2 && gt->gt_version == 2 )
>> gnttab_unpopulate_status_frames(d, gt);
>>
>> - if ( op.version != gt->gt_version )
>> + /* Make sure there's no crud left over in the table from the
>> + old version. */
>> + for ( i = 0; i < nr_grant_frames(gt); i++ )
>> + memset(gt->shared_raw[i], 0, PAGE_SIZE);
>> +
>> + /* Restore the first 8 entries (toolstack reserved grants) */
>> + if (gt->gt_version != 0 && op.version == 1)
>> {
>> - /* Make sure there's no crud left over in the table from the
>> - old version. */
>> - for ( i = 0; i < nr_grant_frames(gt); i++ )
>> - memset(gt->shared_raw[i], 0, PAGE_SIZE);
>> + memcpy(gt->shared_v1[0], reserved_entries,
>> sizeof(reserved_entries));
>> + }
>> + else if (gt->gt_version != 0 && op.version == 2)
>> + {
>> + for ( i = 0; i < GNTTAB_NR_RESERVED_ENTRIES; i++ )
>> + {
>> + status_entry(gt, i) = reserved_entries[i].flags &
>> (GTF_reading|GTF_writing);
>> + shared_entry_v2(gt, i).hdr.flags = reserved_entries[i].flags &
>> ~(GTF_reading|GTF_writing);
>> + shared_entry_v2(gt, i).hdr.domid = reserved_entries[i].domid;
>> + shared_entry_v2(gt, i).full_page.frame =
>> reserved_entries[i].frame;
>> + }
>> }
>>
>> gt->gt_version = op.version;
>> diff --git a/xen/include/public/grant_table.h
>> b/xen/include/public/grant_table.h
>> index 54d9551..292d724 100644
>> --- a/xen/include/public/grant_table.h
>> +++ b/xen/include/public/grant_table.h
>> @@ -117,6 +117,13 @@ struct grant_entry_v1 {
>> };
>> typedef struct grant_entry_v1 grant_entry_v1_t;
>>
>> +/* The first few grant table entries will be preserved across grant table
>> + * version changes and may be pre-populated at domain creation by tools.
>> + */
>> +#define GNTTAB_NR_RESERVED_ENTRIES 8
>> +#define GNTTAB_RESERVED_CONSOLE 0
>> +#define GNTTAB_RESERVED_XENSTORE 1
>> +
>> /*
>> * Type of grant entry.
>> * GTF_invalid: This grant entry grants no privileges.
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |