summaryrefslogtreecommitdiffstats
path: root/drivers/xen/grant-table.c
diff options
context:
space:
mode:
authorJuergen Gross <jgross@suse.com>2017-11-02 05:19:18 -0400
committerBoris Ostrovsky <boris.ostrovsky@oracle.com>2017-11-06 15:50:17 -0500
commit56c9c700c4399858e50971d98ac44b5842b06a87 (patch)
tree5638993f152d66b55eceb9b06abc486c18087b4b /drivers/xen/grant-table.c
parentb988b8ff072ab04abd62d10d3fe44ec544be8a7d (diff)
xen: limit grant v2 interface to the v1 functionality
As there is currently no user for sub-page grants or transient grants remove that functionality. This at once makes it possible to switch from grant v2 to grant v1 without restrictions, as there is no loss of functionality other than the limited frame number width related to the switch. Signed-off-by: Juergen Gross <jgross@suse.com> Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com> Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Diffstat (limited to 'drivers/xen/grant-table.c')
-rw-r--r--drivers/xen/grant-table.c150
1 files changed, 0 insertions, 150 deletions
diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c
index 65c4bdb0b463..db6a1b9efd11 100644
--- a/drivers/xen/grant-table.c
+++ b/drivers/xen/grant-table.c
@@ -122,29 +122,6 @@ struct gnttab_ops {
122 * by bit operations. 122 * by bit operations.
123 */ 123 */
124 int (*query_foreign_access)(grant_ref_t ref); 124 int (*query_foreign_access)(grant_ref_t ref);
125 /*
126 * Grant a domain to access a range of bytes within the page referred by
127 * an available grant entry. Ref parameter is reference of a grant entry
128 * which will be sub-page accessed, domid is id of grantee domain, frame
129 * is frame address of subpage grant, flags is grant type and flag
130 * information, page_off is offset of the range of bytes, and length is
131 * length of bytes to be accessed.
132 */
133 void (*update_subpage_entry)(grant_ref_t ref, domid_t domid,
134 unsigned long frame, int flags,
135 unsigned page_off, unsigned length);
136 /*
137 * Redirect an available grant entry on domain A to another grant
138 * reference of domain B, then allow domain C to use grant reference
139 * of domain B transitively. Ref parameter is an available grant entry
140 * reference on domain A, domid is id of domain C which accesses grant
141 * entry transitively, flags is grant type and flag information,
142 * trans_domid is id of domain B whose grant entry is finally accessed
143 * transitively, trans_gref is grant entry transitive reference of
144 * domain B.
145 */
146 void (*update_trans_entry)(grant_ref_t ref, domid_t domid, int flags,
147 domid_t trans_domid, grant_ref_t trans_gref);
148}; 125};
149 126
150struct unmap_refs_callback_data { 127struct unmap_refs_callback_data {
@@ -292,122 +269,6 @@ int gnttab_grant_foreign_access(domid_t domid, unsigned long frame,
292} 269}
293EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access); 270EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access);
294 271
295static void gnttab_update_subpage_entry_v2(grant_ref_t ref, domid_t domid,
296 unsigned long frame, int flags,
297 unsigned page_off, unsigned length)
298{
299 gnttab_shared.v2[ref].sub_page.frame = frame;
300 gnttab_shared.v2[ref].sub_page.page_off = page_off;
301 gnttab_shared.v2[ref].sub_page.length = length;
302 gnttab_shared.v2[ref].hdr.domid = domid;
303 wmb();
304 gnttab_shared.v2[ref].hdr.flags =
305 GTF_permit_access | GTF_sub_page | flags;
306}
307
308int gnttab_grant_foreign_access_subpage_ref(grant_ref_t ref, domid_t domid,
309 unsigned long frame, int flags,
310 unsigned page_off,
311 unsigned length)
312{
313 if (flags & (GTF_accept_transfer | GTF_reading |
314 GTF_writing | GTF_transitive))
315 return -EPERM;
316
317 if (gnttab_interface->update_subpage_entry == NULL)
318 return -ENOSYS;
319
320 gnttab_interface->update_subpage_entry(ref, domid, frame, flags,
321 page_off, length);
322
323 return 0;
324}
325EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access_subpage_ref);
326
327int gnttab_grant_foreign_access_subpage(domid_t domid, unsigned long frame,
328 int flags, unsigned page_off,
329 unsigned length)
330{
331 int ref, rc;
332
333 ref = get_free_entries(1);
334 if (unlikely(ref < 0))
335 return -ENOSPC;
336
337 rc = gnttab_grant_foreign_access_subpage_ref(ref, domid, frame, flags,
338 page_off, length);
339 if (rc < 0) {
340 put_free_entry(ref);
341 return rc;
342 }
343
344 return ref;
345}
346EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access_subpage);
347
348bool gnttab_subpage_grants_available(void)
349{
350 return gnttab_interface->update_subpage_entry != NULL;
351}
352EXPORT_SYMBOL_GPL(gnttab_subpage_grants_available);
353
354static void gnttab_update_trans_entry_v2(grant_ref_t ref, domid_t domid,
355 int flags, domid_t trans_domid,
356 grant_ref_t trans_gref)
357{
358 gnttab_shared.v2[ref].transitive.trans_domid = trans_domid;
359 gnttab_shared.v2[ref].transitive.gref = trans_gref;
360 gnttab_shared.v2[ref].hdr.domid = domid;
361 wmb();
362 gnttab_shared.v2[ref].hdr.flags =
363 GTF_permit_access | GTF_transitive | flags;
364}
365
366int gnttab_grant_foreign_access_trans_ref(grant_ref_t ref, domid_t domid,
367 int flags, domid_t trans_domid,
368 grant_ref_t trans_gref)
369{
370 if (flags & (GTF_accept_transfer | GTF_reading |
371 GTF_writing | GTF_sub_page))
372 return -EPERM;
373
374 if (gnttab_interface->update_trans_entry == NULL)
375 return -ENOSYS;
376
377 gnttab_interface->update_trans_entry(ref, domid, flags, trans_domid,
378 trans_gref);
379
380 return 0;
381}
382EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access_trans_ref);
383
384int gnttab_grant_foreign_access_trans(domid_t domid, int flags,
385 domid_t trans_domid,
386 grant_ref_t trans_gref)
387{
388 int ref, rc;
389
390 ref = get_free_entries(1);
391 if (unlikely(ref < 0))
392 return -ENOSPC;
393
394 rc = gnttab_grant_foreign_access_trans_ref(ref, domid, flags,
395 trans_domid, trans_gref);
396 if (rc < 0) {
397 put_free_entry(ref);
398 return rc;
399 }
400
401 return ref;
402}
403EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access_trans);
404
405bool gnttab_trans_grants_available(void)
406{
407 return gnttab_interface->update_trans_entry != NULL;
408}
409EXPORT_SYMBOL_GPL(gnttab_trans_grants_available);
410
411static int gnttab_query_foreign_access_v1(grant_ref_t ref) 272static int gnttab_query_foreign_access_v1(grant_ref_t ref)
412{ 273{
413 return gnttab_shared.v1[ref].flags & (GTF_reading|GTF_writing); 274 return gnttab_shared.v1[ref].flags & (GTF_reading|GTF_writing);
@@ -1296,8 +1157,6 @@ static const struct gnttab_ops gnttab_v2_ops = {
1296 .end_foreign_access_ref = gnttab_end_foreign_access_ref_v2, 1157 .end_foreign_access_ref = gnttab_end_foreign_access_ref_v2,
1297 .end_foreign_transfer_ref = gnttab_end_foreign_transfer_ref_v2, 1158 .end_foreign_transfer_ref = gnttab_end_foreign_transfer_ref_v2,
1298 .query_foreign_access = gnttab_query_foreign_access_v2, 1159 .query_foreign_access = gnttab_query_foreign_access_v2,
1299 .update_subpage_entry = gnttab_update_subpage_entry_v2,
1300 .update_trans_entry = gnttab_update_trans_entry_v2,
1301}; 1160};
1302 1161
1303static void gnttab_request_version(void) 1162static void gnttab_request_version(void)
@@ -1313,15 +1172,6 @@ static void gnttab_request_version(void)
1313 grefs_per_grant_frame = XEN_PAGE_SIZE / 1172 grefs_per_grant_frame = XEN_PAGE_SIZE /
1314 sizeof(union grant_entry_v2); 1173 sizeof(union grant_entry_v2);
1315 gnttab_interface = &gnttab_v2_ops; 1174 gnttab_interface = &gnttab_v2_ops;
1316 } else if (grant_table_version == 2) {
1317 /*
1318 * If we've already used version 2 features,
1319 * but then suddenly discover that they're not
1320 * available (e.g. migrating to an older
1321 * version of Xen), almost unbounded badness
1322 * can happen.
1323 */
1324 panic("we need grant tables version 2, but only version 1 is available");
1325 } else { 1175 } else {
1326 grant_table_version = 1; 1176 grant_table_version = 1;
1327 grefs_per_grant_frame = XEN_PAGE_SIZE / 1177 grefs_per_grant_frame = XEN_PAGE_SIZE /