xref: /linux/drivers/xen/grant-table.c (revision c98be0c96db00e9b6b02d31e0fa7590c54cdaaac)
1 /******************************************************************************
2  * grant_table.c
3  *
4  * Granting foreign access to our memory reservation.
5  *
6  * Copyright (c) 2005-2006, Christopher Clark
7  * Copyright (c) 2004-2005, K A Fraser
8  *
9  * This program is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU General Public License version 2
11  * as published by the Free Software Foundation; or, when distributed
12  * separately from the Linux kernel or incorporated into other
13  * software packages, subject to the following license:
14  *
15  * Permission is hereby granted, free of charge, to any person obtaining a copy
16  * of this source file (the "Software"), to deal in the Software without
17  * restriction, including without limitation the rights to use, copy, modify,
18  * merge, publish, distribute, sublicense, and/or sell copies of the Software,
19  * and to permit persons to whom the Software is furnished to do so, subject to
20  * the following conditions:
21  *
22  * The above copyright notice and this permission notice shall be included in
23  * all copies or substantial portions of the Software.
24  *
25  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
26  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
27  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
28  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
29  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
30  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
31  * IN THE SOFTWARE.
32  */
33 
34 #define pr_fmt(fmt) "xen:" KBUILD_MODNAME ": " fmt
35 
36 #include <linux/module.h>
37 #include <linux/sched.h>
38 #include <linux/mm.h>
39 #include <linux/slab.h>
40 #include <linux/vmalloc.h>
41 #include <linux/uaccess.h>
42 #include <linux/io.h>
43 #include <linux/delay.h>
44 #include <linux/hardirq.h>
45 
46 #include <xen/xen.h>
47 #include <xen/interface/xen.h>
48 #include <xen/page.h>
49 #include <xen/grant_table.h>
50 #include <xen/interface/memory.h>
51 #include <xen/hvc-console.h>
52 #include <xen/swiotlb-xen.h>
53 #include <asm/xen/hypercall.h>
54 #include <asm/xen/interface.h>
55 
56 #include <asm/pgtable.h>
57 #include <asm/sync_bitops.h>
58 
59 /* External tools reserve first few grant table entries. */
60 #define NR_RESERVED_ENTRIES 8
61 #define GNTTAB_LIST_END 0xffffffff
62 
63 static grant_ref_t **gnttab_list;
64 static unsigned int nr_grant_frames;
65 static int gnttab_free_count;
66 static grant_ref_t gnttab_free_head;
67 static DEFINE_SPINLOCK(gnttab_list_lock);
68 struct grant_frames xen_auto_xlat_grant_frames;
69 
70 static union {
71 	struct grant_entry_v1 *v1;
72 	union grant_entry_v2 *v2;
73 	void *addr;
74 } gnttab_shared;
75 
76 /*This is a structure of function pointers for grant table*/
77 struct gnttab_ops {
78 	/*
79 	 * Mapping a list of frames for storing grant entries. Frames parameter
80 	 * is used to store grant table address when grant table being setup,
81 	 * nr_gframes is the number of frames to map grant table. Returning
82 	 * GNTST_okay means success and negative value means failure.
83 	 */
84 	int (*map_frames)(xen_pfn_t *frames, unsigned int nr_gframes);
85 	/*
86 	 * Release a list of frames which are mapped in map_frames for grant
87 	 * entry status.
88 	 */
89 	void (*unmap_frames)(void);
90 	/*
91 	 * Introducing a valid entry into the grant table, granting the frame of
92 	 * this grant entry to domain for accessing or transfering. Ref
93 	 * parameter is reference of this introduced grant entry, domid is id of
94 	 * granted domain, frame is the page frame to be granted, and flags is
95 	 * status of the grant entry to be updated.
96 	 */
97 	void (*update_entry)(grant_ref_t ref, domid_t domid,
98 			     unsigned long frame, unsigned flags);
99 	/*
100 	 * Stop granting a grant entry to domain for accessing. Ref parameter is
101 	 * reference of a grant entry whose grant access will be stopped,
102 	 * readonly is not in use in this function. If the grant entry is
103 	 * currently mapped for reading or writing, just return failure(==0)
104 	 * directly and don't tear down the grant access. Otherwise, stop grant
105 	 * access for this entry and return success(==1).
106 	 */
107 	int (*end_foreign_access_ref)(grant_ref_t ref, int readonly);
108 	/*
109 	 * Stop granting a grant entry to domain for transfer. Ref parameter is
110 	 * reference of a grant entry whose grant transfer will be stopped. If
111 	 * tranfer has not started, just reclaim the grant entry and return
112 	 * failure(==0). Otherwise, wait for the transfer to complete and then
113 	 * return the frame.
114 	 */
115 	unsigned long (*end_foreign_transfer_ref)(grant_ref_t ref);
116 	/*
117 	 * Query the status of a grant entry. Ref parameter is reference of
118 	 * queried grant entry, return value is the status of queried entry.
119 	 * Detailed status(writing/reading) can be gotten from the return value
120 	 * by bit operations.
121 	 */
122 	int (*query_foreign_access)(grant_ref_t ref);
123 	/*
124 	 * Grant a domain to access a range of bytes within the page referred by
125 	 * an available grant entry. Ref parameter is reference of a grant entry
126 	 * which will be sub-page accessed, domid is id of grantee domain, frame
127 	 * is frame address of subpage grant, flags is grant type and flag
128 	 * information, page_off is offset of the range of bytes, and length is
129 	 * length of bytes to be accessed.
130 	 */
131 	void (*update_subpage_entry)(grant_ref_t ref, domid_t domid,
132 				     unsigned long frame, int flags,
133 				     unsigned page_off, unsigned length);
134 	/*
135 	 * Redirect an available grant entry on domain A to another grant
136 	 * reference of domain B, then allow domain C to use grant reference
137 	 * of domain B transitively. Ref parameter is an available grant entry
138 	 * reference on domain A, domid is id of domain C which accesses grant
139 	 * entry transitively, flags is grant type and flag information,
140 	 * trans_domid is id of domain B whose grant entry is finally accessed
141 	 * transitively, trans_gref is grant entry transitive reference of
142 	 * domain B.
143 	 */
144 	void (*update_trans_entry)(grant_ref_t ref, domid_t domid, int flags,
145 				   domid_t trans_domid, grant_ref_t trans_gref);
146 };
147 
148 static struct gnttab_ops *gnttab_interface;
149 
150 /*This reflects status of grant entries, so act as a global value*/
151 static grant_status_t *grstatus;
152 
153 static int grant_table_version;
154 static int grefs_per_grant_frame;
155 
156 static struct gnttab_free_callback *gnttab_free_callback_list;
157 
158 static int gnttab_expand(unsigned int req_entries);
159 
160 #define RPP (PAGE_SIZE / sizeof(grant_ref_t))
161 #define SPP (PAGE_SIZE / sizeof(grant_status_t))
162 
163 static inline grant_ref_t *__gnttab_entry(grant_ref_t entry)
164 {
165 	return &gnttab_list[(entry) / RPP][(entry) % RPP];
166 }
167 /* This can be used as an l-value */
168 #define gnttab_entry(entry) (*__gnttab_entry(entry))
169 
170 static int get_free_entries(unsigned count)
171 {
172 	unsigned long flags;
173 	int ref, rc = 0;
174 	grant_ref_t head;
175 
176 	spin_lock_irqsave(&gnttab_list_lock, flags);
177 
178 	if ((gnttab_free_count < count) &&
179 	    ((rc = gnttab_expand(count - gnttab_free_count)) < 0)) {
180 		spin_unlock_irqrestore(&gnttab_list_lock, flags);
181 		return rc;
182 	}
183 
184 	ref = head = gnttab_free_head;
185 	gnttab_free_count -= count;
186 	while (count-- > 1)
187 		head = gnttab_entry(head);
188 	gnttab_free_head = gnttab_entry(head);
189 	gnttab_entry(head) = GNTTAB_LIST_END;
190 
191 	spin_unlock_irqrestore(&gnttab_list_lock, flags);
192 
193 	return ref;
194 }
195 
196 static void do_free_callbacks(void)
197 {
198 	struct gnttab_free_callback *callback, *next;
199 
200 	callback = gnttab_free_callback_list;
201 	gnttab_free_callback_list = NULL;
202 
203 	while (callback != NULL) {
204 		next = callback->next;
205 		if (gnttab_free_count >= callback->count) {
206 			callback->next = NULL;
207 			callback->fn(callback->arg);
208 		} else {
209 			callback->next = gnttab_free_callback_list;
210 			gnttab_free_callback_list = callback;
211 		}
212 		callback = next;
213 	}
214 }
215 
216 static inline void check_free_callbacks(void)
217 {
218 	if (unlikely(gnttab_free_callback_list))
219 		do_free_callbacks();
220 }
221 
222 static void put_free_entry(grant_ref_t ref)
223 {
224 	unsigned long flags;
225 	spin_lock_irqsave(&gnttab_list_lock, flags);
226 	gnttab_entry(ref) = gnttab_free_head;
227 	gnttab_free_head = ref;
228 	gnttab_free_count++;
229 	check_free_callbacks();
230 	spin_unlock_irqrestore(&gnttab_list_lock, flags);
231 }
232 
233 /*
234  * Following applies to gnttab_update_entry_v1 and gnttab_update_entry_v2.
235  * Introducing a valid entry into the grant table:
236  *  1. Write ent->domid.
237  *  2. Write ent->frame:
238  *      GTF_permit_access:   Frame to which access is permitted.
239  *      GTF_accept_transfer: Pseudo-phys frame slot being filled by new
240  *                           frame, or zero if none.
241  *  3. Write memory barrier (WMB).
242  *  4. Write ent->flags, inc. valid type.
243  */
244 static void gnttab_update_entry_v1(grant_ref_t ref, domid_t domid,
245 				   unsigned long frame, unsigned flags)
246 {
247 	gnttab_shared.v1[ref].domid = domid;
248 	gnttab_shared.v1[ref].frame = frame;
249 	wmb();
250 	gnttab_shared.v1[ref].flags = flags;
251 }
252 
253 static void gnttab_update_entry_v2(grant_ref_t ref, domid_t domid,
254 				   unsigned long frame, unsigned flags)
255 {
256 	gnttab_shared.v2[ref].hdr.domid = domid;
257 	gnttab_shared.v2[ref].full_page.frame = frame;
258 	wmb();
259 	gnttab_shared.v2[ref].hdr.flags = GTF_permit_access | flags;
260 }
261 
262 /*
263  * Public grant-issuing interface functions
264  */
265 void gnttab_grant_foreign_access_ref(grant_ref_t ref, domid_t domid,
266 				     unsigned long frame, int readonly)
267 {
268 	gnttab_interface->update_entry(ref, domid, frame,
269 			   GTF_permit_access | (readonly ? GTF_readonly : 0));
270 }
271 EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access_ref);
272 
273 int gnttab_grant_foreign_access(domid_t domid, unsigned long frame,
274 				int readonly)
275 {
276 	int ref;
277 
278 	ref = get_free_entries(1);
279 	if (unlikely(ref < 0))
280 		return -ENOSPC;
281 
282 	gnttab_grant_foreign_access_ref(ref, domid, frame, readonly);
283 
284 	return ref;
285 }
286 EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access);
287 
288 static void gnttab_update_subpage_entry_v2(grant_ref_t ref, domid_t domid,
289 					   unsigned long frame, int flags,
290 					   unsigned page_off, unsigned length)
291 {
292 	gnttab_shared.v2[ref].sub_page.frame = frame;
293 	gnttab_shared.v2[ref].sub_page.page_off = page_off;
294 	gnttab_shared.v2[ref].sub_page.length = length;
295 	gnttab_shared.v2[ref].hdr.domid = domid;
296 	wmb();
297 	gnttab_shared.v2[ref].hdr.flags =
298 				GTF_permit_access | GTF_sub_page | flags;
299 }
300 
301 int gnttab_grant_foreign_access_subpage_ref(grant_ref_t ref, domid_t domid,
302 					    unsigned long frame, int flags,
303 					    unsigned page_off,
304 					    unsigned length)
305 {
306 	if (flags & (GTF_accept_transfer | GTF_reading |
307 		     GTF_writing | GTF_transitive))
308 		return -EPERM;
309 
310 	if (gnttab_interface->update_subpage_entry == NULL)
311 		return -ENOSYS;
312 
313 	gnttab_interface->update_subpage_entry(ref, domid, frame, flags,
314 					       page_off, length);
315 
316 	return 0;
317 }
318 EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access_subpage_ref);
319 
320 int gnttab_grant_foreign_access_subpage(domid_t domid, unsigned long frame,
321 					int flags, unsigned page_off,
322 					unsigned length)
323 {
324 	int ref, rc;
325 
326 	ref = get_free_entries(1);
327 	if (unlikely(ref < 0))
328 		return -ENOSPC;
329 
330 	rc = gnttab_grant_foreign_access_subpage_ref(ref, domid, frame, flags,
331 						     page_off, length);
332 	if (rc < 0) {
333 		put_free_entry(ref);
334 		return rc;
335 	}
336 
337 	return ref;
338 }
339 EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access_subpage);
340 
341 bool gnttab_subpage_grants_available(void)
342 {
343 	return gnttab_interface->update_subpage_entry != NULL;
344 }
345 EXPORT_SYMBOL_GPL(gnttab_subpage_grants_available);
346 
347 static void gnttab_update_trans_entry_v2(grant_ref_t ref, domid_t domid,
348 					 int flags, domid_t trans_domid,
349 					 grant_ref_t trans_gref)
350 {
351 	gnttab_shared.v2[ref].transitive.trans_domid = trans_domid;
352 	gnttab_shared.v2[ref].transitive.gref = trans_gref;
353 	gnttab_shared.v2[ref].hdr.domid = domid;
354 	wmb();
355 	gnttab_shared.v2[ref].hdr.flags =
356 				GTF_permit_access | GTF_transitive | flags;
357 }
358 
359 int gnttab_grant_foreign_access_trans_ref(grant_ref_t ref, domid_t domid,
360 					  int flags, domid_t trans_domid,
361 					  grant_ref_t trans_gref)
362 {
363 	if (flags & (GTF_accept_transfer | GTF_reading |
364 		     GTF_writing | GTF_sub_page))
365 		return -EPERM;
366 
367 	if (gnttab_interface->update_trans_entry == NULL)
368 		return -ENOSYS;
369 
370 	gnttab_interface->update_trans_entry(ref, domid, flags, trans_domid,
371 					     trans_gref);
372 
373 	return 0;
374 }
375 EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access_trans_ref);
376 
377 int gnttab_grant_foreign_access_trans(domid_t domid, int flags,
378 				      domid_t trans_domid,
379 				      grant_ref_t trans_gref)
380 {
381 	int ref, rc;
382 
383 	ref = get_free_entries(1);
384 	if (unlikely(ref < 0))
385 		return -ENOSPC;
386 
387 	rc = gnttab_grant_foreign_access_trans_ref(ref, domid, flags,
388 						   trans_domid, trans_gref);
389 	if (rc < 0) {
390 		put_free_entry(ref);
391 		return rc;
392 	}
393 
394 	return ref;
395 }
396 EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access_trans);
397 
398 bool gnttab_trans_grants_available(void)
399 {
400 	return gnttab_interface->update_trans_entry != NULL;
401 }
402 EXPORT_SYMBOL_GPL(gnttab_trans_grants_available);
403 
404 static int gnttab_query_foreign_access_v1(grant_ref_t ref)
405 {
406 	return gnttab_shared.v1[ref].flags & (GTF_reading|GTF_writing);
407 }
408 
409 static int gnttab_query_foreign_access_v2(grant_ref_t ref)
410 {
411 	return grstatus[ref] & (GTF_reading|GTF_writing);
412 }
413 
414 int gnttab_query_foreign_access(grant_ref_t ref)
415 {
416 	return gnttab_interface->query_foreign_access(ref);
417 }
418 EXPORT_SYMBOL_GPL(gnttab_query_foreign_access);
419 
420 static int gnttab_end_foreign_access_ref_v1(grant_ref_t ref, int readonly)
421 {
422 	u16 flags, nflags;
423 	u16 *pflags;
424 
425 	pflags = &gnttab_shared.v1[ref].flags;
426 	nflags = *pflags;
427 	do {
428 		flags = nflags;
429 		if (flags & (GTF_reading|GTF_writing))
430 			return 0;
431 	} while ((nflags = sync_cmpxchg(pflags, flags, 0)) != flags);
432 
433 	return 1;
434 }
435 
436 static int gnttab_end_foreign_access_ref_v2(grant_ref_t ref, int readonly)
437 {
438 	gnttab_shared.v2[ref].hdr.flags = 0;
439 	mb();
440 	if (grstatus[ref] & (GTF_reading|GTF_writing)) {
441 		return 0;
442 	} else {
443 		/* The read of grstatus needs to have acquire
444 		semantics.  On x86, reads already have
445 		that, and we just need to protect against
446 		compiler reorderings.  On other
447 		architectures we may need a full
448 		barrier. */
449 #ifdef CONFIG_X86
450 		barrier();
451 #else
452 		mb();
453 #endif
454 	}
455 
456 	return 1;
457 }
458 
459 static inline int _gnttab_end_foreign_access_ref(grant_ref_t ref, int readonly)
460 {
461 	return gnttab_interface->end_foreign_access_ref(ref, readonly);
462 }
463 
464 int gnttab_end_foreign_access_ref(grant_ref_t ref, int readonly)
465 {
466 	if (_gnttab_end_foreign_access_ref(ref, readonly))
467 		return 1;
468 	pr_warn("WARNING: g.e. %#x still in use!\n", ref);
469 	return 0;
470 }
471 EXPORT_SYMBOL_GPL(gnttab_end_foreign_access_ref);
472 
473 struct deferred_entry {
474 	struct list_head list;
475 	grant_ref_t ref;
476 	bool ro;
477 	uint16_t warn_delay;
478 	struct page *page;
479 };
480 static LIST_HEAD(deferred_list);
481 static void gnttab_handle_deferred(unsigned long);
482 static DEFINE_TIMER(deferred_timer, gnttab_handle_deferred, 0, 0);
483 
484 static void gnttab_handle_deferred(unsigned long unused)
485 {
486 	unsigned int nr = 10;
487 	struct deferred_entry *first = NULL;
488 	unsigned long flags;
489 
490 	spin_lock_irqsave(&gnttab_list_lock, flags);
491 	while (nr--) {
492 		struct deferred_entry *entry
493 			= list_first_entry(&deferred_list,
494 					   struct deferred_entry, list);
495 
496 		if (entry == first)
497 			break;
498 		list_del(&entry->list);
499 		spin_unlock_irqrestore(&gnttab_list_lock, flags);
500 		if (_gnttab_end_foreign_access_ref(entry->ref, entry->ro)) {
501 			put_free_entry(entry->ref);
502 			if (entry->page) {
503 				pr_debug("freeing g.e. %#x (pfn %#lx)\n",
504 					 entry->ref, page_to_pfn(entry->page));
505 				__free_page(entry->page);
506 			} else
507 				pr_info("freeing g.e. %#x\n", entry->ref);
508 			kfree(entry);
509 			entry = NULL;
510 		} else {
511 			if (!--entry->warn_delay)
512 				pr_info("g.e. %#x still pending\n", entry->ref);
513 			if (!first)
514 				first = entry;
515 		}
516 		spin_lock_irqsave(&gnttab_list_lock, flags);
517 		if (entry)
518 			list_add_tail(&entry->list, &deferred_list);
519 		else if (list_empty(&deferred_list))
520 			break;
521 	}
522 	if (!list_empty(&deferred_list) && !timer_pending(&deferred_timer)) {
523 		deferred_timer.expires = jiffies + HZ;
524 		add_timer(&deferred_timer);
525 	}
526 	spin_unlock_irqrestore(&gnttab_list_lock, flags);
527 }
528 
529 static void gnttab_add_deferred(grant_ref_t ref, bool readonly,
530 				struct page *page)
531 {
532 	struct deferred_entry *entry = kmalloc(sizeof(*entry), GFP_ATOMIC);
533 	const char *what = KERN_WARNING "leaking";
534 
535 	if (entry) {
536 		unsigned long flags;
537 
538 		entry->ref = ref;
539 		entry->ro = readonly;
540 		entry->page = page;
541 		entry->warn_delay = 60;
542 		spin_lock_irqsave(&gnttab_list_lock, flags);
543 		list_add_tail(&entry->list, &deferred_list);
544 		if (!timer_pending(&deferred_timer)) {
545 			deferred_timer.expires = jiffies + HZ;
546 			add_timer(&deferred_timer);
547 		}
548 		spin_unlock_irqrestore(&gnttab_list_lock, flags);
549 		what = KERN_DEBUG "deferring";
550 	}
551 	printk("%s g.e. %#x (pfn %#lx)\n",
552 	       what, ref, page ? page_to_pfn(page) : -1);
553 }
554 
555 void gnttab_end_foreign_access(grant_ref_t ref, int readonly,
556 			       unsigned long page)
557 {
558 	if (gnttab_end_foreign_access_ref(ref, readonly)) {
559 		put_free_entry(ref);
560 		if (page != 0)
561 			free_page(page);
562 	} else
563 		gnttab_add_deferred(ref, readonly,
564 				    page ? virt_to_page(page) : NULL);
565 }
566 EXPORT_SYMBOL_GPL(gnttab_end_foreign_access);
567 
568 int gnttab_grant_foreign_transfer(domid_t domid, unsigned long pfn)
569 {
570 	int ref;
571 
572 	ref = get_free_entries(1);
573 	if (unlikely(ref < 0))
574 		return -ENOSPC;
575 	gnttab_grant_foreign_transfer_ref(ref, domid, pfn);
576 
577 	return ref;
578 }
579 EXPORT_SYMBOL_GPL(gnttab_grant_foreign_transfer);
580 
581 void gnttab_grant_foreign_transfer_ref(grant_ref_t ref, domid_t domid,
582 				       unsigned long pfn)
583 {
584 	gnttab_interface->update_entry(ref, domid, pfn, GTF_accept_transfer);
585 }
586 EXPORT_SYMBOL_GPL(gnttab_grant_foreign_transfer_ref);
587 
588 static unsigned long gnttab_end_foreign_transfer_ref_v1(grant_ref_t ref)
589 {
590 	unsigned long frame;
591 	u16           flags;
592 	u16          *pflags;
593 
594 	pflags = &gnttab_shared.v1[ref].flags;
595 
596 	/*
597 	 * If a transfer is not even yet started, try to reclaim the grant
598 	 * reference and return failure (== 0).
599 	 */
600 	while (!((flags = *pflags) & GTF_transfer_committed)) {
601 		if (sync_cmpxchg(pflags, flags, 0) == flags)
602 			return 0;
603 		cpu_relax();
604 	}
605 
606 	/* If a transfer is in progress then wait until it is completed. */
607 	while (!(flags & GTF_transfer_completed)) {
608 		flags = *pflags;
609 		cpu_relax();
610 	}
611 
612 	rmb();	/* Read the frame number /after/ reading completion status. */
613 	frame = gnttab_shared.v1[ref].frame;
614 	BUG_ON(frame == 0);
615 
616 	return frame;
617 }
618 
619 static unsigned long gnttab_end_foreign_transfer_ref_v2(grant_ref_t ref)
620 {
621 	unsigned long frame;
622 	u16           flags;
623 	u16          *pflags;
624 
625 	pflags = &gnttab_shared.v2[ref].hdr.flags;
626 
627 	/*
628 	 * If a transfer is not even yet started, try to reclaim the grant
629 	 * reference and return failure (== 0).
630 	 */
631 	while (!((flags = *pflags) & GTF_transfer_committed)) {
632 		if (sync_cmpxchg(pflags, flags, 0) == flags)
633 			return 0;
634 		cpu_relax();
635 	}
636 
637 	/* If a transfer is in progress then wait until it is completed. */
638 	while (!(flags & GTF_transfer_completed)) {
639 		flags = *pflags;
640 		cpu_relax();
641 	}
642 
643 	rmb();  /* Read the frame number /after/ reading completion status. */
644 	frame = gnttab_shared.v2[ref].full_page.frame;
645 	BUG_ON(frame == 0);
646 
647 	return frame;
648 }
649 
650 unsigned long gnttab_end_foreign_transfer_ref(grant_ref_t ref)
651 {
652 	return gnttab_interface->end_foreign_transfer_ref(ref);
653 }
654 EXPORT_SYMBOL_GPL(gnttab_end_foreign_transfer_ref);
655 
656 unsigned long gnttab_end_foreign_transfer(grant_ref_t ref)
657 {
658 	unsigned long frame = gnttab_end_foreign_transfer_ref(ref);
659 	put_free_entry(ref);
660 	return frame;
661 }
662 EXPORT_SYMBOL_GPL(gnttab_end_foreign_transfer);
663 
664 void gnttab_free_grant_reference(grant_ref_t ref)
665 {
666 	put_free_entry(ref);
667 }
668 EXPORT_SYMBOL_GPL(gnttab_free_grant_reference);
669 
670 void gnttab_free_grant_references(grant_ref_t head)
671 {
672 	grant_ref_t ref;
673 	unsigned long flags;
674 	int count = 1;
675 	if (head == GNTTAB_LIST_END)
676 		return;
677 	spin_lock_irqsave(&gnttab_list_lock, flags);
678 	ref = head;
679 	while (gnttab_entry(ref) != GNTTAB_LIST_END) {
680 		ref = gnttab_entry(ref);
681 		count++;
682 	}
683 	gnttab_entry(ref) = gnttab_free_head;
684 	gnttab_free_head = head;
685 	gnttab_free_count += count;
686 	check_free_callbacks();
687 	spin_unlock_irqrestore(&gnttab_list_lock, flags);
688 }
689 EXPORT_SYMBOL_GPL(gnttab_free_grant_references);
690 
691 int gnttab_alloc_grant_references(u16 count, grant_ref_t *head)
692 {
693 	int h = get_free_entries(count);
694 
695 	if (h < 0)
696 		return -ENOSPC;
697 
698 	*head = h;
699 
700 	return 0;
701 }
702 EXPORT_SYMBOL_GPL(gnttab_alloc_grant_references);
703 
704 int gnttab_empty_grant_references(const grant_ref_t *private_head)
705 {
706 	return (*private_head == GNTTAB_LIST_END);
707 }
708 EXPORT_SYMBOL_GPL(gnttab_empty_grant_references);
709 
710 int gnttab_claim_grant_reference(grant_ref_t *private_head)
711 {
712 	grant_ref_t g = *private_head;
713 	if (unlikely(g == GNTTAB_LIST_END))
714 		return -ENOSPC;
715 	*private_head = gnttab_entry(g);
716 	return g;
717 }
718 EXPORT_SYMBOL_GPL(gnttab_claim_grant_reference);
719 
720 void gnttab_release_grant_reference(grant_ref_t *private_head,
721 				    grant_ref_t release)
722 {
723 	gnttab_entry(release) = *private_head;
724 	*private_head = release;
725 }
726 EXPORT_SYMBOL_GPL(gnttab_release_grant_reference);
727 
728 void gnttab_request_free_callback(struct gnttab_free_callback *callback,
729 				  void (*fn)(void *), void *arg, u16 count)
730 {
731 	unsigned long flags;
732 	struct gnttab_free_callback *cb;
733 
734 	spin_lock_irqsave(&gnttab_list_lock, flags);
735 
736 	/* Check if the callback is already on the list */
737 	cb = gnttab_free_callback_list;
738 	while (cb) {
739 		if (cb == callback)
740 			goto out;
741 		cb = cb->next;
742 	}
743 
744 	callback->fn = fn;
745 	callback->arg = arg;
746 	callback->count = count;
747 	callback->next = gnttab_free_callback_list;
748 	gnttab_free_callback_list = callback;
749 	check_free_callbacks();
750 out:
751 	spin_unlock_irqrestore(&gnttab_list_lock, flags);
752 }
753 EXPORT_SYMBOL_GPL(gnttab_request_free_callback);
754 
755 void gnttab_cancel_free_callback(struct gnttab_free_callback *callback)
756 {
757 	struct gnttab_free_callback **pcb;
758 	unsigned long flags;
759 
760 	spin_lock_irqsave(&gnttab_list_lock, flags);
761 	for (pcb = &gnttab_free_callback_list; *pcb; pcb = &(*pcb)->next) {
762 		if (*pcb == callback) {
763 			*pcb = callback->next;
764 			break;
765 		}
766 	}
767 	spin_unlock_irqrestore(&gnttab_list_lock, flags);
768 }
769 EXPORT_SYMBOL_GPL(gnttab_cancel_free_callback);
770 
771 static int grow_gnttab_list(unsigned int more_frames)
772 {
773 	unsigned int new_nr_grant_frames, extra_entries, i;
774 	unsigned int nr_glist_frames, new_nr_glist_frames;
775 
776 	BUG_ON(grefs_per_grant_frame == 0);
777 
778 	new_nr_grant_frames = nr_grant_frames + more_frames;
779 	extra_entries       = more_frames * grefs_per_grant_frame;
780 
781 	nr_glist_frames = (nr_grant_frames * grefs_per_grant_frame + RPP - 1) / RPP;
782 	new_nr_glist_frames =
783 		(new_nr_grant_frames * grefs_per_grant_frame + RPP - 1) / RPP;
784 	for (i = nr_glist_frames; i < new_nr_glist_frames; i++) {
785 		gnttab_list[i] = (grant_ref_t *)__get_free_page(GFP_ATOMIC);
786 		if (!gnttab_list[i])
787 			goto grow_nomem;
788 	}
789 
790 
791 	for (i = grefs_per_grant_frame * nr_grant_frames;
792 	     i < grefs_per_grant_frame * new_nr_grant_frames - 1; i++)
793 		gnttab_entry(i) = i + 1;
794 
795 	gnttab_entry(i) = gnttab_free_head;
796 	gnttab_free_head = grefs_per_grant_frame * nr_grant_frames;
797 	gnttab_free_count += extra_entries;
798 
799 	nr_grant_frames = new_nr_grant_frames;
800 
801 	check_free_callbacks();
802 
803 	return 0;
804 
805 grow_nomem:
806 	for ( ; i >= nr_glist_frames; i--)
807 		free_page((unsigned long) gnttab_list[i]);
808 	return -ENOMEM;
809 }
810 
811 static unsigned int __max_nr_grant_frames(void)
812 {
813 	struct gnttab_query_size query;
814 	int rc;
815 
816 	query.dom = DOMID_SELF;
817 
818 	rc = HYPERVISOR_grant_table_op(GNTTABOP_query_size, &query, 1);
819 	if ((rc < 0) || (query.status != GNTST_okay))
820 		return 4; /* Legacy max supported number of frames */
821 
822 	return query.max_nr_frames;
823 }
824 
825 unsigned int gnttab_max_grant_frames(void)
826 {
827 	unsigned int xen_max = __max_nr_grant_frames();
828 	static unsigned int boot_max_nr_grant_frames;
829 
830 	/* First time, initialize it properly. */
831 	if (!boot_max_nr_grant_frames)
832 		boot_max_nr_grant_frames = __max_nr_grant_frames();
833 
834 	if (xen_max > boot_max_nr_grant_frames)
835 		return boot_max_nr_grant_frames;
836 	return xen_max;
837 }
838 EXPORT_SYMBOL_GPL(gnttab_max_grant_frames);
839 
840 int gnttab_setup_auto_xlat_frames(phys_addr_t addr)
841 {
842 	xen_pfn_t *pfn;
843 	unsigned int max_nr_gframes = __max_nr_grant_frames();
844 	unsigned int i;
845 	void *vaddr;
846 
847 	if (xen_auto_xlat_grant_frames.count)
848 		return -EINVAL;
849 
850 	vaddr = xen_remap(addr, PAGE_SIZE * max_nr_gframes);
851 	if (vaddr == NULL) {
852 		pr_warn("Failed to ioremap gnttab share frames (addr=%pa)!\n",
853 			&addr);
854 		return -ENOMEM;
855 	}
856 	pfn = kcalloc(max_nr_gframes, sizeof(pfn[0]), GFP_KERNEL);
857 	if (!pfn) {
858 		xen_unmap(vaddr);
859 		return -ENOMEM;
860 	}
861 	for (i = 0; i < max_nr_gframes; i++)
862 		pfn[i] = PFN_DOWN(addr) + i;
863 
864 	xen_auto_xlat_grant_frames.vaddr = vaddr;
865 	xen_auto_xlat_grant_frames.pfn = pfn;
866 	xen_auto_xlat_grant_frames.count = max_nr_gframes;
867 
868 	return 0;
869 }
870 EXPORT_SYMBOL_GPL(gnttab_setup_auto_xlat_frames);
871 
872 void gnttab_free_auto_xlat_frames(void)
873 {
874 	if (!xen_auto_xlat_grant_frames.count)
875 		return;
876 	kfree(xen_auto_xlat_grant_frames.pfn);
877 	xen_unmap(xen_auto_xlat_grant_frames.vaddr);
878 
879 	xen_auto_xlat_grant_frames.pfn = NULL;
880 	xen_auto_xlat_grant_frames.count = 0;
881 	xen_auto_xlat_grant_frames.vaddr = NULL;
882 }
883 EXPORT_SYMBOL_GPL(gnttab_free_auto_xlat_frames);
884 
885 /* Handling of paged out grant targets (GNTST_eagain) */
886 #define MAX_DELAY 256
887 static inline void
888 gnttab_retry_eagain_gop(unsigned int cmd, void *gop, int16_t *status,
889 						const char *func)
890 {
891 	unsigned delay = 1;
892 
893 	do {
894 		BUG_ON(HYPERVISOR_grant_table_op(cmd, gop, 1));
895 		if (*status == GNTST_eagain)
896 			msleep(delay++);
897 	} while ((*status == GNTST_eagain) && (delay < MAX_DELAY));
898 
899 	if (delay >= MAX_DELAY) {
900 		pr_err("%s: %s eagain grant\n", func, current->comm);
901 		*status = GNTST_bad_page;
902 	}
903 }
904 
905 void gnttab_batch_map(struct gnttab_map_grant_ref *batch, unsigned count)
906 {
907 	struct gnttab_map_grant_ref *op;
908 
909 	if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, batch, count))
910 		BUG();
911 	for (op = batch; op < batch + count; op++)
912 		if (op->status == GNTST_eagain)
913 			gnttab_retry_eagain_gop(GNTTABOP_map_grant_ref, op,
914 						&op->status, __func__);
915 }
916 EXPORT_SYMBOL_GPL(gnttab_batch_map);
917 
918 void gnttab_batch_copy(struct gnttab_copy *batch, unsigned count)
919 {
920 	struct gnttab_copy *op;
921 
922 	if (HYPERVISOR_grant_table_op(GNTTABOP_copy, batch, count))
923 		BUG();
924 	for (op = batch; op < batch + count; op++)
925 		if (op->status == GNTST_eagain)
926 			gnttab_retry_eagain_gop(GNTTABOP_copy, op,
927 						&op->status, __func__);
928 }
929 EXPORT_SYMBOL_GPL(gnttab_batch_copy);
930 
931 int gnttab_map_refs(struct gnttab_map_grant_ref *map_ops,
932 		    struct gnttab_map_grant_ref *kmap_ops,
933 		    struct page **pages, unsigned int count)
934 {
935 	int i, ret;
936 	bool lazy = false;
937 	pte_t *pte;
938 	unsigned long mfn;
939 
940 	ret = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, map_ops, count);
941 	if (ret)
942 		return ret;
943 
944 	/* Retry eagain maps */
945 	for (i = 0; i < count; i++)
946 		if (map_ops[i].status == GNTST_eagain)
947 			gnttab_retry_eagain_gop(GNTTABOP_map_grant_ref, map_ops + i,
948 						&map_ops[i].status, __func__);
949 
950 	/* this is basically a nop on x86 */
951 	if (xen_feature(XENFEAT_auto_translated_physmap)) {
952 		for (i = 0; i < count; i++) {
953 			if (map_ops[i].status)
954 				continue;
955 			set_phys_to_machine(map_ops[i].host_addr >> PAGE_SHIFT,
956 					map_ops[i].dev_bus_addr >> PAGE_SHIFT);
957 		}
958 		return ret;
959 	}
960 
961 	if (!in_interrupt() && paravirt_get_lazy_mode() == PARAVIRT_LAZY_NONE) {
962 		arch_enter_lazy_mmu_mode();
963 		lazy = true;
964 	}
965 
966 	for (i = 0; i < count; i++) {
967 		/* Do not add to override if the map failed. */
968 		if (map_ops[i].status)
969 			continue;
970 
971 		if (map_ops[i].flags & GNTMAP_contains_pte) {
972 			pte = (pte_t *) (mfn_to_virt(PFN_DOWN(map_ops[i].host_addr)) +
973 				(map_ops[i].host_addr & ~PAGE_MASK));
974 			mfn = pte_mfn(*pte);
975 		} else {
976 			mfn = PFN_DOWN(map_ops[i].dev_bus_addr);
977 		}
978 		ret = m2p_add_override(mfn, pages[i], kmap_ops ?
979 				       &kmap_ops[i] : NULL);
980 		if (ret)
981 			goto out;
982 	}
983 
984  out:
985 	if (lazy)
986 		arch_leave_lazy_mmu_mode();
987 
988 	return ret;
989 }
990 EXPORT_SYMBOL_GPL(gnttab_map_refs);
991 
992 int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops,
993 		      struct gnttab_map_grant_ref *kmap_ops,
994 		      struct page **pages, unsigned int count)
995 {
996 	int i, ret;
997 	bool lazy = false;
998 
999 	ret = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, unmap_ops, count);
1000 	if (ret)
1001 		return ret;
1002 
1003 	/* this is basically a nop on x86 */
1004 	if (xen_feature(XENFEAT_auto_translated_physmap)) {
1005 		for (i = 0; i < count; i++) {
1006 			set_phys_to_machine(unmap_ops[i].host_addr >> PAGE_SHIFT,
1007 					INVALID_P2M_ENTRY);
1008 		}
1009 		return ret;
1010 	}
1011 
1012 	if (!in_interrupt() && paravirt_get_lazy_mode() == PARAVIRT_LAZY_NONE) {
1013 		arch_enter_lazy_mmu_mode();
1014 		lazy = true;
1015 	}
1016 
1017 	for (i = 0; i < count; i++) {
1018 		ret = m2p_remove_override(pages[i], kmap_ops ?
1019 				       &kmap_ops[i] : NULL);
1020 		if (ret)
1021 			goto out;
1022 	}
1023 
1024  out:
1025 	if (lazy)
1026 		arch_leave_lazy_mmu_mode();
1027 
1028 	return ret;
1029 }
1030 EXPORT_SYMBOL_GPL(gnttab_unmap_refs);
1031 
1032 static unsigned nr_status_frames(unsigned nr_grant_frames)
1033 {
1034 	BUG_ON(grefs_per_grant_frame == 0);
1035 	return (nr_grant_frames * grefs_per_grant_frame + SPP - 1) / SPP;
1036 }
1037 
1038 static int gnttab_map_frames_v1(xen_pfn_t *frames, unsigned int nr_gframes)
1039 {
1040 	int rc;
1041 
1042 	rc = arch_gnttab_map_shared(frames, nr_gframes,
1043 				    gnttab_max_grant_frames(),
1044 				    &gnttab_shared.addr);
1045 	BUG_ON(rc);
1046 
1047 	return 0;
1048 }
1049 
1050 static void gnttab_unmap_frames_v1(void)
1051 {
1052 	arch_gnttab_unmap(gnttab_shared.addr, nr_grant_frames);
1053 }
1054 
1055 static int gnttab_map_frames_v2(xen_pfn_t *frames, unsigned int nr_gframes)
1056 {
1057 	uint64_t *sframes;
1058 	unsigned int nr_sframes;
1059 	struct gnttab_get_status_frames getframes;
1060 	int rc;
1061 
1062 	nr_sframes = nr_status_frames(nr_gframes);
1063 
1064 	/* No need for kzalloc as it is initialized in following hypercall
1065 	 * GNTTABOP_get_status_frames.
1066 	 */
1067 	sframes = kmalloc(nr_sframes  * sizeof(uint64_t), GFP_ATOMIC);
1068 	if (!sframes)
1069 		return -ENOMEM;
1070 
1071 	getframes.dom        = DOMID_SELF;
1072 	getframes.nr_frames  = nr_sframes;
1073 	set_xen_guest_handle(getframes.frame_list, sframes);
1074 
1075 	rc = HYPERVISOR_grant_table_op(GNTTABOP_get_status_frames,
1076 				       &getframes, 1);
1077 	if (rc == -ENOSYS) {
1078 		kfree(sframes);
1079 		return -ENOSYS;
1080 	}
1081 
1082 	BUG_ON(rc || getframes.status);
1083 
1084 	rc = arch_gnttab_map_status(sframes, nr_sframes,
1085 				    nr_status_frames(gnttab_max_grant_frames()),
1086 				    &grstatus);
1087 	BUG_ON(rc);
1088 	kfree(sframes);
1089 
1090 	rc = arch_gnttab_map_shared(frames, nr_gframes,
1091 				    gnttab_max_grant_frames(),
1092 				    &gnttab_shared.addr);
1093 	BUG_ON(rc);
1094 
1095 	return 0;
1096 }
1097 
1098 static void gnttab_unmap_frames_v2(void)
1099 {
1100 	arch_gnttab_unmap(gnttab_shared.addr, nr_grant_frames);
1101 	arch_gnttab_unmap(grstatus, nr_status_frames(nr_grant_frames));
1102 }
1103 
1104 static int gnttab_map(unsigned int start_idx, unsigned int end_idx)
1105 {
1106 	struct gnttab_setup_table setup;
1107 	xen_pfn_t *frames;
1108 	unsigned int nr_gframes = end_idx + 1;
1109 	int rc;
1110 
1111 	if (xen_feature(XENFEAT_auto_translated_physmap)) {
1112 		struct xen_add_to_physmap xatp;
1113 		unsigned int i = end_idx;
1114 		rc = 0;
1115 		BUG_ON(xen_auto_xlat_grant_frames.count < nr_gframes);
1116 		/*
1117 		 * Loop backwards, so that the first hypercall has the largest
1118 		 * index, ensuring that the table will grow only once.
1119 		 */
1120 		do {
1121 			xatp.domid = DOMID_SELF;
1122 			xatp.idx = i;
1123 			xatp.space = XENMAPSPACE_grant_table;
1124 			xatp.gpfn = xen_auto_xlat_grant_frames.pfn[i];
1125 			rc = HYPERVISOR_memory_op(XENMEM_add_to_physmap, &xatp);
1126 			if (rc != 0) {
1127 				pr_warn("grant table add_to_physmap failed, err=%d\n",
1128 					rc);
1129 				break;
1130 			}
1131 		} while (i-- > start_idx);
1132 
1133 		return rc;
1134 	}
1135 
1136 	/* No need for kzalloc as it is initialized in following hypercall
1137 	 * GNTTABOP_setup_table.
1138 	 */
1139 	frames = kmalloc(nr_gframes * sizeof(unsigned long), GFP_ATOMIC);
1140 	if (!frames)
1141 		return -ENOMEM;
1142 
1143 	setup.dom        = DOMID_SELF;
1144 	setup.nr_frames  = nr_gframes;
1145 	set_xen_guest_handle(setup.frame_list, frames);
1146 
1147 	rc = HYPERVISOR_grant_table_op(GNTTABOP_setup_table, &setup, 1);
1148 	if (rc == -ENOSYS) {
1149 		kfree(frames);
1150 		return -ENOSYS;
1151 	}
1152 
1153 	BUG_ON(rc || setup.status);
1154 
1155 	rc = gnttab_interface->map_frames(frames, nr_gframes);
1156 
1157 	kfree(frames);
1158 
1159 	return rc;
1160 }
1161 
1162 static struct gnttab_ops gnttab_v1_ops = {
1163 	.map_frames			= gnttab_map_frames_v1,
1164 	.unmap_frames			= gnttab_unmap_frames_v1,
1165 	.update_entry			= gnttab_update_entry_v1,
1166 	.end_foreign_access_ref		= gnttab_end_foreign_access_ref_v1,
1167 	.end_foreign_transfer_ref	= gnttab_end_foreign_transfer_ref_v1,
1168 	.query_foreign_access		= gnttab_query_foreign_access_v1,
1169 };
1170 
1171 static struct gnttab_ops gnttab_v2_ops = {
1172 	.map_frames			= gnttab_map_frames_v2,
1173 	.unmap_frames			= gnttab_unmap_frames_v2,
1174 	.update_entry			= gnttab_update_entry_v2,
1175 	.end_foreign_access_ref		= gnttab_end_foreign_access_ref_v2,
1176 	.end_foreign_transfer_ref	= gnttab_end_foreign_transfer_ref_v2,
1177 	.query_foreign_access		= gnttab_query_foreign_access_v2,
1178 	.update_subpage_entry		= gnttab_update_subpage_entry_v2,
1179 	.update_trans_entry		= gnttab_update_trans_entry_v2,
1180 };
1181 
1182 static void gnttab_request_version(void)
1183 {
1184 	int rc;
1185 	struct gnttab_set_version gsv;
1186 
1187 	gsv.version = 1;
1188 
1189 	rc = HYPERVISOR_grant_table_op(GNTTABOP_set_version, &gsv, 1);
1190 	if (rc == 0 && gsv.version == 2) {
1191 		grant_table_version = 2;
1192 		grefs_per_grant_frame = PAGE_SIZE / sizeof(union grant_entry_v2);
1193 		gnttab_interface = &gnttab_v2_ops;
1194 	} else if (grant_table_version == 2) {
1195 		/*
1196 		 * If we've already used version 2 features,
1197 		 * but then suddenly discover that they're not
1198 		 * available (e.g. migrating to an older
1199 		 * version of Xen), almost unbounded badness
1200 		 * can happen.
1201 		 */
1202 		panic("we need grant tables version 2, but only version 1 is available");
1203 	} else {
1204 		grant_table_version = 1;
1205 		grefs_per_grant_frame = PAGE_SIZE / sizeof(struct grant_entry_v1);
1206 		gnttab_interface = &gnttab_v1_ops;
1207 	}
1208 	pr_info("Grant tables using version %d layout\n", grant_table_version);
1209 }
1210 
1211 static int gnttab_setup(void)
1212 {
1213 	unsigned int max_nr_gframes;
1214 
1215 	max_nr_gframes = gnttab_max_grant_frames();
1216 	if (max_nr_gframes < nr_grant_frames)
1217 		return -ENOSYS;
1218 
1219 	if (xen_feature(XENFEAT_auto_translated_physmap) && gnttab_shared.addr == NULL) {
1220 		gnttab_shared.addr = xen_auto_xlat_grant_frames.vaddr;
1221 		if (gnttab_shared.addr == NULL) {
1222 			pr_warn("gnttab share frames (addr=0x%08lx) is not mapped!\n",
1223 				(unsigned long)xen_auto_xlat_grant_frames.vaddr);
1224 			return -ENOMEM;
1225 		}
1226 	}
1227 	return gnttab_map(0, nr_grant_frames - 1);
1228 }
1229 
1230 int gnttab_resume(void)
1231 {
1232 	gnttab_request_version();
1233 	return gnttab_setup();
1234 }
1235 
1236 int gnttab_suspend(void)
1237 {
1238 	gnttab_interface->unmap_frames();
1239 	return 0;
1240 }
1241 
1242 static int gnttab_expand(unsigned int req_entries)
1243 {
1244 	int rc;
1245 	unsigned int cur, extra;
1246 
1247 	BUG_ON(grefs_per_grant_frame == 0);
1248 	cur = nr_grant_frames;
1249 	extra = ((req_entries + (grefs_per_grant_frame-1)) /
1250 		 grefs_per_grant_frame);
1251 	if (cur + extra > gnttab_max_grant_frames())
1252 		return -ENOSPC;
1253 
1254 	rc = gnttab_map(cur, cur + extra - 1);
1255 	if (rc == 0)
1256 		rc = grow_gnttab_list(extra);
1257 
1258 	return rc;
1259 }
1260 
1261 int gnttab_init(void)
1262 {
1263 	int i;
1264 	unsigned int max_nr_glist_frames, nr_glist_frames;
1265 	unsigned int nr_init_grefs;
1266 	int ret;
1267 
1268 	gnttab_request_version();
1269 	nr_grant_frames = 1;
1270 
1271 	/* Determine the maximum number of frames required for the
1272 	 * grant reference free list on the current hypervisor.
1273 	 */
1274 	BUG_ON(grefs_per_grant_frame == 0);
1275 	max_nr_glist_frames = (gnttab_max_grant_frames() *
1276 			       grefs_per_grant_frame / RPP);
1277 
1278 	gnttab_list = kmalloc(max_nr_glist_frames * sizeof(grant_ref_t *),
1279 			      GFP_KERNEL);
1280 	if (gnttab_list == NULL)
1281 		return -ENOMEM;
1282 
1283 	nr_glist_frames = (nr_grant_frames * grefs_per_grant_frame + RPP - 1) / RPP;
1284 	for (i = 0; i < nr_glist_frames; i++) {
1285 		gnttab_list[i] = (grant_ref_t *)__get_free_page(GFP_KERNEL);
1286 		if (gnttab_list[i] == NULL) {
1287 			ret = -ENOMEM;
1288 			goto ini_nomem;
1289 		}
1290 	}
1291 
1292 	if (gnttab_setup() < 0) {
1293 		ret = -ENODEV;
1294 		goto ini_nomem;
1295 	}
1296 
1297 	nr_init_grefs = nr_grant_frames * grefs_per_grant_frame;
1298 
1299 	for (i = NR_RESERVED_ENTRIES; i < nr_init_grefs - 1; i++)
1300 		gnttab_entry(i) = i + 1;
1301 
1302 	gnttab_entry(nr_init_grefs - 1) = GNTTAB_LIST_END;
1303 	gnttab_free_count = nr_init_grefs - NR_RESERVED_ENTRIES;
1304 	gnttab_free_head  = NR_RESERVED_ENTRIES;
1305 
1306 	printk("Grant table initialized\n");
1307 	return 0;
1308 
1309  ini_nomem:
1310 	for (i--; i >= 0; i--)
1311 		free_page((unsigned long)gnttab_list[i]);
1312 	kfree(gnttab_list);
1313 	return ret;
1314 }
1315 EXPORT_SYMBOL_GPL(gnttab_init);
1316 
1317 static int __gnttab_init(void)
1318 {
1319 	/* Delay grant-table initialization in the PV on HVM case */
1320 	if (xen_hvm_domain())
1321 		return 0;
1322 
1323 	if (!xen_pv_domain())
1324 		return -ENODEV;
1325 
1326 	return gnttab_init();
1327 }
1328 /* Starts after core_initcall so that xen_pvh_gnttab_setup can be called
1329  * beforehand to initialize xen_auto_xlat_grant_frames. */
1330 core_initcall_sync(__gnttab_init);
1331