|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 04/18] xen: Preserve reserved grant entries when switching versions
>>> On 11.01.12 at 18:21, Daniel De Graaf <dgdegra@xxxxxxxxxxxxx> wrote:
> --- a/xen/common/grant_table.c
> +++ b/xen/common/grant_table.c
> @@ -2106,6 +2106,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];
How much stack space does this consume? (Or in other words, where
does GNTTAB_NR_RESERVED_ENTRIES get defined? It's not in this
patch, I can't find it in earlier patches, and it also doesn't exist in the
current staging tree.)
Jan
> long res;
> int i;
>
> @@ -2126,7 +2127,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++
> )
> {
> act = &active_entry(gt, i);
> if ( act->pin != 0 )
> @@ -2151,15 +2152,38 @@
> 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) {
> + memcpy(reserved_entries, gt->shared_v1[0], sizeof(reserved_entries));
> + } 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 ( 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);
> + /* 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) {
> + 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;
> --
> 1.7.7.5
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |