mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
gnttab: fix/adjust gnttab_transfer()
- don't update shared entry's frame number for translated domains (as
MFNs shouldn't be exposed to such guests)
- for v1 grant table format, force copying of the page also when the
intended MFN doesn't fit in 32 bits (and the domain isn't translated)
- fix an apparent off-by-one error (it's unclear to me why commit
5cc77f9098 ("32-on-64: Fix domain address-size clamping, implement")
uses BITS_PER_LONG-1 here, while using BITS_PER_LONG in the two other
invocations of domain_clamp_alloc_bitsize())
- adjust comments accompanying the shared entry's frame field
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
This commit is contained in:
1 parent
1549a9dac1
commit
213f145114
2 files changed
+12
-5
No files matched your search
@@ -1708,7 +1708,8 @@ gnttab_transfer(
|
||||
}
|
||||
|
||||
max_bitsize = domain_clamp_alloc_bitsize(
|
||||
e, BITS_PER_LONG+PAGE_SHIFT-1);
|
||||
e, e->grant_table->gt_version > 1 || paging_mode_translate(e)
|
||||
? BITS_PER_LONG + PAGE_SHIFT : 32 + PAGE_SHIFT);
|
||||
if ( (1UL << (max_bitsize - PAGE_SHIFT)) <= mfn )
|
||||
{
|
||||
struct page_info *new_page;
|
||||
@@ -1806,14 +1807,18 @@ gnttab_transfer(
|
||||
if ( e->grant_table->gt_version == 1 )
|
||||
{
|
||||
grant_entry_v1_t *sha = &shared_entry_v1(e->grant_table, gop.ref);
|
||||
|
||||
guest_physmap_add_page(e, sha->frame, mfn, 0);
|
||||
sha->frame = mfn;
|
||||
if ( !paging_mode_translate(e) )
|
||||
sha->frame = mfn;
|
||||
}
|
||||
else
|
||||
{
|
||||
grant_entry_v2_t *sha = &shared_entry_v2(e->grant_table, gop.ref);
|
||||
|
||||
guest_physmap_add_page(e, sha->full_page.frame, mfn, 0);
|
||||
sha->full_page.frame = mfn;
|
||||
if ( !paging_mode_translate(e) )
|
||||
sha->full_page.frame = mfn;
|
||||
}
|
||||
smp_wmb();
|
||||
shared_entry_header(e->grant_table, gop.ref)->flags |=
|
||||
|
||||
@@ -134,8 +134,10 @@ struct grant_entry_v1 {
|
||||
/* The domain being granted foreign privileges. [GST] */
|
||||
domid_t domid;
|
||||
/*
|
||||
* GTF_permit_access: Frame that @domid is allowed to map and access. [GST]
|
||||
* GTF_accept_transfer: Frame whose ownership transferred by @domid. [XEN]
|
||||
* GTF_permit_access: GFN that @domid is allowed to map and access. [GST]
|
||||
* GTF_accept_transfer: GFN that @domid is allowed to transfer into. [GST]
|
||||
* GTF_transfer_completed: MFN whose ownership transferred by @domid
|
||||
* (non-translated guests only). [XEN]
|
||||
*/
|
||||
uint32_t frame;
|
||||
};
|
||||
|
||||