Merge remote-tracking branch 'lsk/v3.10/topic/tc2' into linux-linaro-lsk
[firefly-linux-kernel-4.4.55.git] / drivers / xen / grant-table.c
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 #include <linux/module.h>
35 #include <linux/sched.h>
36 #include <linux/mm.h>
37 #include <linux/slab.h>
38 #include <linux/vmalloc.h>
39 #include <linux/uaccess.h>
40 #include <linux/io.h>
41 #include <linux/delay.h>
42 #include <linux/hardirq.h>
43
44 #include <xen/xen.h>
45 #include <xen/interface/xen.h>
46 #include <xen/page.h>
47 #include <xen/grant_table.h>
48 #include <xen/interface/memory.h>
49 #include <xen/hvc-console.h>
50 #include <asm/xen/hypercall.h>
51 #include <asm/xen/interface.h>
52
53 #include <asm/pgtable.h>
54 #include <asm/sync_bitops.h>
55
56 /* External tools reserve first few grant table entries. */
57 #define NR_RESERVED_ENTRIES 8
58 #define GNTTAB_LIST_END 0xffffffff
59
60 static grant_ref_t **gnttab_list;
61 static unsigned int nr_grant_frames;
62 static unsigned int boot_max_nr_grant_frames;
63 static int gnttab_free_count;
64 static grant_ref_t gnttab_free_head;
65 static DEFINE_SPINLOCK(gnttab_list_lock);
66 unsigned long xen_hvm_resume_frames;
67 EXPORT_SYMBOL_GPL(xen_hvm_resume_frames);
68
69 static union {
70         struct grant_entry_v1 *v1;
71         union grant_entry_v2 *v2;
72         void *addr;
73 } gnttab_shared;
74
75 /*This is a structure of function pointers for grant table*/
76 struct gnttab_ops {
77         /*
78          * Mapping a list of frames for storing grant entries. Frames parameter
79          * is used to store grant table address when grant table being setup,
80          * nr_gframes is the number of frames to map grant table. Returning
81          * GNTST_okay means success and negative value means failure.
82          */
83         int (*map_frames)(xen_pfn_t *frames, unsigned int nr_gframes);
84         /*
85          * Release a list of frames which are mapped in map_frames for grant
86          * entry status.
87          */
88         void (*unmap_frames)(void);
89         /*
90          * Introducing a valid entry into the grant table, granting the frame of
91          * this grant entry to domain for accessing or transfering. Ref
92          * parameter is reference of this introduced grant entry, domid is id of
93          * granted domain, frame is the page frame to be granted, and flags is
94          * status of the grant entry to be updated.
95          */
96         void (*update_entry)(grant_ref_t ref, domid_t domid,
97                              unsigned long frame, unsigned flags);
98         /*
99          * Stop granting a grant entry to domain for accessing. Ref parameter is
100          * reference of a grant entry whose grant access will be stopped,
101          * readonly is not in use in this function. If the grant entry is
102          * currently mapped for reading or writing, just return failure(==0)
103          * directly and don't tear down the grant access. Otherwise, stop grant
104          * access for this entry and return success(==1).
105          */
106         int (*end_foreign_access_ref)(grant_ref_t ref, int readonly);
107         /*
108          * Stop granting a grant entry to domain for transfer. Ref parameter is
109          * reference of a grant entry whose grant transfer will be stopped. If
110          * tranfer has not started, just reclaim the grant entry and return
111          * failure(==0). Otherwise, wait for the transfer to complete and then
112          * return the frame.
113          */
114         unsigned long (*end_foreign_transfer_ref)(grant_ref_t ref);
115         /*
116          * Query the status of a grant entry. Ref parameter is reference of
117          * queried grant entry, return value is the status of queried entry.
118          * Detailed status(writing/reading) can be gotten from the return value
119          * by bit operations.
120          */
121         int (*query_foreign_access)(grant_ref_t ref);
122         /*
123          * Grant a domain to access a range of bytes within the page referred by
124          * an available grant entry. Ref parameter is reference of a grant entry
125          * which will be sub-page accessed, domid is id of grantee domain, frame
126          * is frame address of subpage grant, flags is grant type and flag
127          * information, page_off is offset of the range of bytes, and length is
128          * length of bytes to be accessed.
129          */
130         void (*update_subpage_entry)(grant_ref_t ref, domid_t domid,
131                                      unsigned long frame, int flags,
132                                      unsigned page_off, unsigned length);
133         /*
134          * Redirect an available grant entry on domain A to another grant
135          * reference of domain B, then allow domain C to use grant reference
136          * of domain B transitively. Ref parameter is an available grant entry
137          * reference on domain A, domid is id of domain C which accesses grant
138          * entry transitively, flags is grant type and flag information,
139          * trans_domid is id of domain B whose grant entry is finally accessed
140          * transitively, trans_gref is grant entry transitive reference of
141          * domain B.
142          */
143         void (*update_trans_entry)(grant_ref_t ref, domid_t domid, int flags,
144                                    domid_t trans_domid, grant_ref_t trans_gref);
145 };
146
147 static struct gnttab_ops *gnttab_interface;
148
149 /*This reflects status of grant entries, so act as a global value*/
150 static grant_status_t *grstatus;
151
152 static int grant_table_version;
153 static int grefs_per_grant_frame;
154
155 static struct gnttab_free_callback *gnttab_free_callback_list;
156
157 static int gnttab_expand(unsigned int req_entries);
158
159 #define RPP (PAGE_SIZE / sizeof(grant_ref_t))
160 #define SPP (PAGE_SIZE / sizeof(grant_status_t))
161
162 static inline grant_ref_t *__gnttab_entry(grant_ref_t entry)
163 {
164         return &gnttab_list[(entry) / RPP][(entry) % RPP];
165 }
166 /* This can be used as an l-value */
167 #define gnttab_entry(entry) (*__gnttab_entry(entry))
168
169 static int get_free_entries(unsigned count)
170 {
171         unsigned long flags;
172         int ref, rc = 0;
173         grant_ref_t head;
174
175         spin_lock_irqsave(&gnttab_list_lock, flags);
176
177         if ((gnttab_free_count < count) &&
178             ((rc = gnttab_expand(count - gnttab_free_count)) < 0)) {
179                 spin_unlock_irqrestore(&gnttab_list_lock, flags);
180                 return rc;
181         }
182
183         ref = head = gnttab_free_head;
184         gnttab_free_count -= count;
185         while (count-- > 1)
186                 head = gnttab_entry(head);
187         gnttab_free_head = gnttab_entry(head);
188         gnttab_entry(head) = GNTTAB_LIST_END;
189
190         spin_unlock_irqrestore(&gnttab_list_lock, flags);
191
192         return ref;
193 }
194
195 static void do_free_callbacks(void)
196 {
197         struct gnttab_free_callback *callback, *next;
198
199         callback = gnttab_free_callback_list;
200         gnttab_free_callback_list = NULL;
201
202         while (callback != NULL) {
203                 next = callback->next;
204                 if (gnttab_free_count >= callback->count) {
205                         callback->next = NULL;
206                         callback->fn(callback->arg);
207                 } else {
208                         callback->next = gnttab_free_callback_list;
209                         gnttab_free_callback_list = callback;
210                 }
211                 callback = next;
212         }
213 }
214
215 static inline void check_free_callbacks(void)
216 {
217         if (unlikely(gnttab_free_callback_list))
218                 do_free_callbacks();
219 }
220
221 static void put_free_entry(grant_ref_t ref)
222 {
223         unsigned long flags;
224         spin_lock_irqsave(&gnttab_list_lock, flags);
225         gnttab_entry(ref) = gnttab_free_head;
226         gnttab_free_head = ref;
227         gnttab_free_count++;
228         check_free_callbacks();
229         spin_unlock_irqrestore(&gnttab_list_lock, flags);
230 }
231
232 /*
233  * Following applies to gnttab_update_entry_v1 and gnttab_update_entry_v2.
234  * Introducing a valid entry into the grant table:
235  *  1. Write ent->domid.
236  *  2. Write ent->frame:
237  *      GTF_permit_access:   Frame to which access is permitted.
238  *      GTF_accept_transfer: Pseudo-phys frame slot being filled by new
239  *                           frame, or zero if none.
240  *  3. Write memory barrier (WMB).
241  *  4. Write ent->flags, inc. valid type.
242  */
243 static void gnttab_update_entry_v1(grant_ref_t ref, domid_t domid,
244                                    unsigned long frame, unsigned flags)
245 {
246         gnttab_shared.v1[ref].domid = domid;
247         gnttab_shared.v1[ref].frame = frame;
248         wmb();
249         gnttab_shared.v1[ref].flags = flags;
250 }
251
252 static void gnttab_update_entry_v2(grant_ref_t ref, domid_t domid,
253                                    unsigned long frame, unsigned flags)
254 {
255         gnttab_shared.v2[ref].hdr.domid = domid;
256         gnttab_shared.v2[ref].full_page.frame = frame;
257         wmb();
258         gnttab_shared.v2[ref].hdr.flags = GTF_permit_access | flags;
259 }
260
261 /*
262  * Public grant-issuing interface functions
263  */
264 void gnttab_grant_foreign_access_ref(grant_ref_t ref, domid_t domid,
265                                      unsigned long frame, int readonly)
266 {
267         gnttab_interface->update_entry(ref, domid, frame,
268                            GTF_permit_access | (readonly ? GTF_readonly : 0));
269 }
270 EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access_ref);
271
272 int gnttab_grant_foreign_access(domid_t domid, unsigned long frame,
273                                 int readonly)
274 {
275         int ref;
276
277         ref = get_free_entries(1);
278         if (unlikely(ref < 0))
279                 return -ENOSPC;
280
281         gnttab_grant_foreign_access_ref(ref, domid, frame, readonly);
282
283         return ref;
284 }
285 EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access);
286
287 static void gnttab_update_subpage_entry_v2(grant_ref_t ref, domid_t domid,
288                                            unsigned long frame, int flags,
289                                            unsigned page_off, unsigned length)
290 {
291         gnttab_shared.v2[ref].sub_page.frame = frame;
292         gnttab_shared.v2[ref].sub_page.page_off = page_off;
293         gnttab_shared.v2[ref].sub_page.length = length;
294         gnttab_shared.v2[ref].hdr.domid = domid;
295         wmb();
296         gnttab_shared.v2[ref].hdr.flags =
297                                 GTF_permit_access | GTF_sub_page | flags;
298 }
299
300 int gnttab_grant_foreign_access_subpage_ref(grant_ref_t ref, domid_t domid,
301                                             unsigned long frame, int flags,
302                                             unsigned page_off,
303                                             unsigned length)
304 {
305         if (flags & (GTF_accept_transfer | GTF_reading |
306                      GTF_writing | GTF_transitive))
307                 return -EPERM;
308
309         if (gnttab_interface->update_subpage_entry == NULL)
310                 return -ENOSYS;
311
312         gnttab_interface->update_subpage_entry(ref, domid, frame, flags,
313                                                page_off, length);
314
315         return 0;
316 }
317 EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access_subpage_ref);
318
319 int gnttab_grant_foreign_access_subpage(domid_t domid, unsigned long frame,
320                                         int flags, unsigned page_off,
321                                         unsigned length)
322 {
323         int ref, rc;
324
325         ref = get_free_entries(1);
326         if (unlikely(ref < 0))
327                 return -ENOSPC;
328
329         rc = gnttab_grant_foreign_access_subpage_ref(ref, domid, frame, flags,
330                                                      page_off, length);
331         if (rc < 0) {
332                 put_free_entry(ref);
333                 return rc;
334         }
335
336         return ref;
337 }
338 EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access_subpage);
339
340 bool gnttab_subpage_grants_available(void)
341 {
342         return gnttab_interface->update_subpage_entry != NULL;
343 }
344 EXPORT_SYMBOL_GPL(gnttab_subpage_grants_available);
345
346 static void gnttab_update_trans_entry_v2(grant_ref_t ref, domid_t domid,
347                                          int flags, domid_t trans_domid,
348                                          grant_ref_t trans_gref)
349 {
350         gnttab_shared.v2[ref].transitive.trans_domid = trans_domid;
351         gnttab_shared.v2[ref].transitive.gref = trans_gref;
352         gnttab_shared.v2[ref].hdr.domid = domid;
353         wmb();
354         gnttab_shared.v2[ref].hdr.flags =
355                                 GTF_permit_access | GTF_transitive | flags;
356 }
357
358 int gnttab_grant_foreign_access_trans_ref(grant_ref_t ref, domid_t domid,
359                                           int flags, domid_t trans_domid,
360                                           grant_ref_t trans_gref)
361 {
362         if (flags & (GTF_accept_transfer | GTF_reading |
363                      GTF_writing | GTF_sub_page))
364                 return -EPERM;
365
366         if (gnttab_interface->update_trans_entry == NULL)
367                 return -ENOSYS;
368
369         gnttab_interface->update_trans_entry(ref, domid, flags, trans_domid,
370                                              trans_gref);
371
372         return 0;
373 }
374 EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access_trans_ref);
375
376 int gnttab_grant_foreign_access_trans(domid_t domid, int flags,
377                                       domid_t trans_domid,
378                                       grant_ref_t trans_gref)
379 {
380         int ref, rc;
381
382         ref = get_free_entries(1);
383         if (unlikely(ref < 0))
384                 return -ENOSPC;
385
386         rc = gnttab_grant_foreign_access_trans_ref(ref, domid, flags,
387                                                    trans_domid, trans_gref);
388         if (rc < 0) {
389                 put_free_entry(ref);
390                 return rc;
391         }
392
393         return ref;
394 }
395 EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access_trans);
396
397 bool gnttab_trans_grants_available(void)
398 {
399         return gnttab_interface->update_trans_entry != NULL;
400 }
401 EXPORT_SYMBOL_GPL(gnttab_trans_grants_available);
402
403 static int gnttab_query_foreign_access_v1(grant_ref_t ref)
404 {
405         return gnttab_shared.v1[ref].flags & (GTF_reading|GTF_writing);
406 }
407
408 static int gnttab_query_foreign_access_v2(grant_ref_t ref)
409 {
410         return grstatus[ref] & (GTF_reading|GTF_writing);
411 }
412
413 int gnttab_query_foreign_access(grant_ref_t ref)
414 {
415         return gnttab_interface->query_foreign_access(ref);
416 }
417 EXPORT_SYMBOL_GPL(gnttab_query_foreign_access);
418
419 static int gnttab_end_foreign_access_ref_v1(grant_ref_t ref, int readonly)
420 {
421         u16 flags, nflags;
422         u16 *pflags;
423
424         pflags = &gnttab_shared.v1[ref].flags;
425         nflags = *pflags;
426         do {
427                 flags = nflags;
428                 if (flags & (GTF_reading|GTF_writing))
429                         return 0;
430         } while ((nflags = sync_cmpxchg(pflags, flags, 0)) != flags);
431
432         return 1;
433 }
434
435 static int gnttab_end_foreign_access_ref_v2(grant_ref_t ref, int readonly)
436 {
437         gnttab_shared.v2[ref].hdr.flags = 0;
438         mb();
439         if (grstatus[ref] & (GTF_reading|GTF_writing)) {
440                 return 0;
441         } else {
442                 /* The read of grstatus needs to have acquire
443                 semantics.  On x86, reads already have
444                 that, and we just need to protect against
445                 compiler reorderings.  On other
446                 architectures we may need a full
447                 barrier. */
448 #ifdef CONFIG_X86
449                 barrier();
450 #else
451                 mb();
452 #endif
453         }
454
455         return 1;
456 }
457
458 static inline int _gnttab_end_foreign_access_ref(grant_ref_t ref, int readonly)
459 {
460         return gnttab_interface->end_foreign_access_ref(ref, readonly);
461 }
462
463 int gnttab_end_foreign_access_ref(grant_ref_t ref, int readonly)
464 {
465         if (_gnttab_end_foreign_access_ref(ref, readonly))
466                 return 1;
467         pr_warn("WARNING: g.e. %#x still in use!\n", ref);
468         return 0;
469 }
470 EXPORT_SYMBOL_GPL(gnttab_end_foreign_access_ref);
471
472 struct deferred_entry {
473         struct list_head list;
474         grant_ref_t ref;
475         bool ro;
476         uint16_t warn_delay;
477         struct page *page;
478 };
479 static LIST_HEAD(deferred_list);
480 static void gnttab_handle_deferred(unsigned long);
481 static DEFINE_TIMER(deferred_timer, gnttab_handle_deferred, 0, 0);
482
483 static void gnttab_handle_deferred(unsigned long unused)
484 {
485         unsigned int nr = 10;
486         struct deferred_entry *first = NULL;
487         unsigned long flags;
488
489         spin_lock_irqsave(&gnttab_list_lock, flags);
490         while (nr--) {
491                 struct deferred_entry *entry
492                         = list_first_entry(&deferred_list,
493                                            struct deferred_entry, list);
494
495                 if (entry == first)
496                         break;
497                 list_del(&entry->list);
498                 spin_unlock_irqrestore(&gnttab_list_lock, flags);
499                 if (_gnttab_end_foreign_access_ref(entry->ref, entry->ro)) {
500                         put_free_entry(entry->ref);
501                         if (entry->page) {
502                                 pr_debug("freeing g.e. %#x (pfn %#lx)\n",
503                                          entry->ref, page_to_pfn(entry->page));
504                                 __free_page(entry->page);
505                         } else
506                                 pr_info("freeing g.e. %#x\n", entry->ref);
507                         kfree(entry);
508                         entry = NULL;
509                 } else {
510                         if (!--entry->warn_delay)
511                                 pr_info("g.e. %#x still pending\n",
512                                         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
829         if (xen_max > boot_max_nr_grant_frames)
830                 return boot_max_nr_grant_frames;
831         return xen_max;
832 }
833 EXPORT_SYMBOL_GPL(gnttab_max_grant_frames);
834
835 /* Handling of paged out grant targets (GNTST_eagain) */
836 #define MAX_DELAY 256
837 static inline void
838 gnttab_retry_eagain_gop(unsigned int cmd, void *gop, int16_t *status,
839                                                 const char *func)
840 {
841         unsigned delay = 1;
842
843         do {
844                 BUG_ON(HYPERVISOR_grant_table_op(cmd, gop, 1));
845                 if (*status == GNTST_eagain)
846                         msleep(delay++);
847         } while ((*status == GNTST_eagain) && (delay < MAX_DELAY));
848
849         if (delay >= MAX_DELAY) {
850                 printk(KERN_ERR "%s: %s eagain grant\n", func, current->comm);
851                 *status = GNTST_bad_page;
852         }
853 }
854
855 void gnttab_batch_map(struct gnttab_map_grant_ref *batch, unsigned count)
856 {
857         struct gnttab_map_grant_ref *op;
858
859         if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, batch, count))
860                 BUG();
861         for (op = batch; op < batch + count; op++)
862                 if (op->status == GNTST_eagain)
863                         gnttab_retry_eagain_gop(GNTTABOP_map_grant_ref, op,
864                                                 &op->status, __func__);
865 }
866 EXPORT_SYMBOL_GPL(gnttab_batch_map);
867
868 void gnttab_batch_copy(struct gnttab_copy *batch, unsigned count)
869 {
870         struct gnttab_copy *op;
871
872         if (HYPERVISOR_grant_table_op(GNTTABOP_copy, batch, count))
873                 BUG();
874         for (op = batch; op < batch + count; op++)
875                 if (op->status == GNTST_eagain)
876                         gnttab_retry_eagain_gop(GNTTABOP_copy, op,
877                                                 &op->status, __func__);
878 }
879 EXPORT_SYMBOL_GPL(gnttab_batch_copy);
880
881 int gnttab_map_refs(struct gnttab_map_grant_ref *map_ops,
882                     struct gnttab_map_grant_ref *kmap_ops,
883                     struct page **pages, unsigned int count)
884 {
885         int i, ret;
886         bool lazy = false;
887         pte_t *pte;
888         unsigned long mfn;
889
890         ret = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, map_ops, count);
891         if (ret)
892                 return ret;
893
894         /* Retry eagain maps */
895         for (i = 0; i < count; i++)
896                 if (map_ops[i].status == GNTST_eagain)
897                         gnttab_retry_eagain_gop(GNTTABOP_map_grant_ref, map_ops + i,
898                                                 &map_ops[i].status, __func__);
899
900         if (xen_feature(XENFEAT_auto_translated_physmap))
901                 return ret;
902
903         if (!in_interrupt() && paravirt_get_lazy_mode() == PARAVIRT_LAZY_NONE) {
904                 arch_enter_lazy_mmu_mode();
905                 lazy = true;
906         }
907
908         for (i = 0; i < count; i++) {
909                 /* Do not add to override if the map failed. */
910                 if (map_ops[i].status)
911                         continue;
912
913                 if (map_ops[i].flags & GNTMAP_contains_pte) {
914                         pte = (pte_t *) (mfn_to_virt(PFN_DOWN(map_ops[i].host_addr)) +
915                                 (map_ops[i].host_addr & ~PAGE_MASK));
916                         mfn = pte_mfn(*pte);
917                 } else {
918                         mfn = PFN_DOWN(map_ops[i].dev_bus_addr);
919                 }
920                 ret = m2p_add_override(mfn, pages[i], kmap_ops ?
921                                        &kmap_ops[i] : NULL);
922                 if (ret)
923                         return ret;
924         }
925
926         if (lazy)
927                 arch_leave_lazy_mmu_mode();
928
929         return ret;
930 }
931 EXPORT_SYMBOL_GPL(gnttab_map_refs);
932
933 int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops,
934                       struct gnttab_map_grant_ref *kmap_ops,
935                       struct page **pages, unsigned int count)
936 {
937         int i, ret;
938         bool lazy = false;
939
940         ret = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, unmap_ops, count);
941         if (ret)
942                 return ret;
943
944         if (xen_feature(XENFEAT_auto_translated_physmap))
945                 return ret;
946
947         if (!in_interrupt() && paravirt_get_lazy_mode() == PARAVIRT_LAZY_NONE) {
948                 arch_enter_lazy_mmu_mode();
949                 lazy = true;
950         }
951
952         for (i = 0; i < count; i++) {
953                 ret = m2p_remove_override(pages[i], kmap_ops ?
954                                        &kmap_ops[i] : NULL);
955                 if (ret)
956                         return ret;
957         }
958
959         if (lazy)
960                 arch_leave_lazy_mmu_mode();
961
962         return ret;
963 }
964 EXPORT_SYMBOL_GPL(gnttab_unmap_refs);
965
966 static unsigned nr_status_frames(unsigned nr_grant_frames)
967 {
968         BUG_ON(grefs_per_grant_frame == 0);
969         return (nr_grant_frames * grefs_per_grant_frame + SPP - 1) / SPP;
970 }
971
972 static int gnttab_map_frames_v1(xen_pfn_t *frames, unsigned int nr_gframes)
973 {
974         int rc;
975
976         rc = arch_gnttab_map_shared(frames, nr_gframes,
977                                     gnttab_max_grant_frames(),
978                                     &gnttab_shared.addr);
979         BUG_ON(rc);
980
981         return 0;
982 }
983
984 static void gnttab_unmap_frames_v1(void)
985 {
986         arch_gnttab_unmap(gnttab_shared.addr, nr_grant_frames);
987 }
988
989 static int gnttab_map_frames_v2(xen_pfn_t *frames, unsigned int nr_gframes)
990 {
991         uint64_t *sframes;
992         unsigned int nr_sframes;
993         struct gnttab_get_status_frames getframes;
994         int rc;
995
996         nr_sframes = nr_status_frames(nr_gframes);
997
998         /* No need for kzalloc as it is initialized in following hypercall
999          * GNTTABOP_get_status_frames.
1000          */
1001         sframes = kmalloc(nr_sframes  * sizeof(uint64_t), GFP_ATOMIC);
1002         if (!sframes)
1003                 return -ENOMEM;
1004
1005         getframes.dom        = DOMID_SELF;
1006         getframes.nr_frames  = nr_sframes;
1007         set_xen_guest_handle(getframes.frame_list, sframes);
1008
1009         rc = HYPERVISOR_grant_table_op(GNTTABOP_get_status_frames,
1010                                        &getframes, 1);
1011         if (rc == -ENOSYS) {
1012                 kfree(sframes);
1013                 return -ENOSYS;
1014         }
1015
1016         BUG_ON(rc || getframes.status);
1017
1018         rc = arch_gnttab_map_status(sframes, nr_sframes,
1019                                     nr_status_frames(gnttab_max_grant_frames()),
1020                                     &grstatus);
1021         BUG_ON(rc);
1022         kfree(sframes);
1023
1024         rc = arch_gnttab_map_shared(frames, nr_gframes,
1025                                     gnttab_max_grant_frames(),
1026                                     &gnttab_shared.addr);
1027         BUG_ON(rc);
1028
1029         return 0;
1030 }
1031
1032 static void gnttab_unmap_frames_v2(void)
1033 {
1034         arch_gnttab_unmap(gnttab_shared.addr, nr_grant_frames);
1035         arch_gnttab_unmap(grstatus, nr_status_frames(nr_grant_frames));
1036 }
1037
1038 static int gnttab_map(unsigned int start_idx, unsigned int end_idx)
1039 {
1040         struct gnttab_setup_table setup;
1041         xen_pfn_t *frames;
1042         unsigned int nr_gframes = end_idx + 1;
1043         int rc;
1044
1045         if (xen_hvm_domain()) {
1046                 struct xen_add_to_physmap xatp;
1047                 unsigned int i = end_idx;
1048                 rc = 0;
1049                 /*
1050                  * Loop backwards, so that the first hypercall has the largest
1051                  * index, ensuring that the table will grow only once.
1052                  */
1053                 do {
1054                         xatp.domid = DOMID_SELF;
1055                         xatp.idx = i;
1056                         xatp.space = XENMAPSPACE_grant_table;
1057                         xatp.gpfn = (xen_hvm_resume_frames >> PAGE_SHIFT) + i;
1058                         rc = HYPERVISOR_memory_op(XENMEM_add_to_physmap, &xatp);
1059                         if (rc != 0) {
1060                                 printk(KERN_WARNING
1061                                                 "grant table add_to_physmap failed, err=%d\n", rc);
1062                                 break;
1063                         }
1064                 } while (i-- > start_idx);
1065
1066                 return rc;
1067         }
1068
1069         /* No need for kzalloc as it is initialized in following hypercall
1070          * GNTTABOP_setup_table.
1071          */
1072         frames = kmalloc(nr_gframes * sizeof(unsigned long), GFP_ATOMIC);
1073         if (!frames)
1074                 return -ENOMEM;
1075
1076         setup.dom        = DOMID_SELF;
1077         setup.nr_frames  = nr_gframes;
1078         set_xen_guest_handle(setup.frame_list, frames);
1079
1080         rc = HYPERVISOR_grant_table_op(GNTTABOP_setup_table, &setup, 1);
1081         if (rc == -ENOSYS) {
1082                 kfree(frames);
1083                 return -ENOSYS;
1084         }
1085
1086         BUG_ON(rc || setup.status);
1087
1088         rc = gnttab_interface->map_frames(frames, nr_gframes);
1089
1090         kfree(frames);
1091
1092         return rc;
1093 }
1094
1095 static struct gnttab_ops gnttab_v1_ops = {
1096         .map_frames                     = gnttab_map_frames_v1,
1097         .unmap_frames                   = gnttab_unmap_frames_v1,
1098         .update_entry                   = gnttab_update_entry_v1,
1099         .end_foreign_access_ref         = gnttab_end_foreign_access_ref_v1,
1100         .end_foreign_transfer_ref       = gnttab_end_foreign_transfer_ref_v1,
1101         .query_foreign_access           = gnttab_query_foreign_access_v1,
1102 };
1103
1104 static struct gnttab_ops gnttab_v2_ops = {
1105         .map_frames                     = gnttab_map_frames_v2,
1106         .unmap_frames                   = gnttab_unmap_frames_v2,
1107         .update_entry                   = gnttab_update_entry_v2,
1108         .end_foreign_access_ref         = gnttab_end_foreign_access_ref_v2,
1109         .end_foreign_transfer_ref       = gnttab_end_foreign_transfer_ref_v2,
1110         .query_foreign_access           = gnttab_query_foreign_access_v2,
1111         .update_subpage_entry           = gnttab_update_subpage_entry_v2,
1112         .update_trans_entry             = gnttab_update_trans_entry_v2,
1113 };
1114
1115 static void gnttab_request_version(void)
1116 {
1117         int rc;
1118         struct gnttab_set_version gsv;
1119
1120         if (xen_hvm_domain())
1121                 gsv.version = 1;
1122         else
1123                 gsv.version = 2;
1124         rc = HYPERVISOR_grant_table_op(GNTTABOP_set_version, &gsv, 1);
1125         if (rc == 0 && gsv.version == 2) {
1126                 grant_table_version = 2;
1127                 grefs_per_grant_frame = PAGE_SIZE / sizeof(union grant_entry_v2);
1128                 gnttab_interface = &gnttab_v2_ops;
1129         } else if (grant_table_version == 2) {
1130                 /*
1131                  * If we've already used version 2 features,
1132                  * but then suddenly discover that they're not
1133                  * available (e.g. migrating to an older
1134                  * version of Xen), almost unbounded badness
1135                  * can happen.
1136                  */
1137                 panic("we need grant tables version 2, but only version 1 is available");
1138         } else {
1139                 grant_table_version = 1;
1140                 grefs_per_grant_frame = PAGE_SIZE / sizeof(struct grant_entry_v1);
1141                 gnttab_interface = &gnttab_v1_ops;
1142         }
1143         printk(KERN_INFO "Grant tables using version %d layout.\n",
1144                 grant_table_version);
1145 }
1146
1147 static int gnttab_setup(void)
1148 {
1149         unsigned int max_nr_gframes;
1150
1151         max_nr_gframes = gnttab_max_grant_frames();
1152         if (max_nr_gframes < nr_grant_frames)
1153                 return -ENOSYS;
1154
1155         if (xen_pv_domain())
1156                 return gnttab_map(0, nr_grant_frames - 1);
1157
1158         if (gnttab_shared.addr == NULL) {
1159                 gnttab_shared.addr = xen_remap(xen_hvm_resume_frames,
1160                                                 PAGE_SIZE * max_nr_gframes);
1161                 if (gnttab_shared.addr == NULL) {
1162                         printk(KERN_WARNING
1163                                         "Failed to ioremap gnttab share frames!");
1164                         return -ENOMEM;
1165                 }
1166         }
1167
1168         gnttab_map(0, nr_grant_frames - 1);
1169
1170         return 0;
1171 }
1172
1173 int gnttab_resume(void)
1174 {
1175         gnttab_request_version();
1176         return gnttab_setup();
1177 }
1178
1179 int gnttab_suspend(void)
1180 {
1181         gnttab_interface->unmap_frames();
1182         return 0;
1183 }
1184
1185 static int gnttab_expand(unsigned int req_entries)
1186 {
1187         int rc;
1188         unsigned int cur, extra;
1189
1190         BUG_ON(grefs_per_grant_frame == 0);
1191         cur = nr_grant_frames;
1192         extra = ((req_entries + (grefs_per_grant_frame-1)) /
1193                  grefs_per_grant_frame);
1194         if (cur + extra > gnttab_max_grant_frames())
1195                 return -ENOSPC;
1196
1197         rc = gnttab_map(cur, cur + extra - 1);
1198         if (rc == 0)
1199                 rc = grow_gnttab_list(extra);
1200
1201         return rc;
1202 }
1203
1204 int gnttab_init(void)
1205 {
1206         int i;
1207         unsigned int max_nr_glist_frames, nr_glist_frames;
1208         unsigned int nr_init_grefs;
1209         int ret;
1210
1211         gnttab_request_version();
1212         nr_grant_frames = 1;
1213         boot_max_nr_grant_frames = __max_nr_grant_frames();
1214
1215         /* Determine the maximum number of frames required for the
1216          * grant reference free list on the current hypervisor.
1217          */
1218         BUG_ON(grefs_per_grant_frame == 0);
1219         max_nr_glist_frames = (boot_max_nr_grant_frames *
1220                                grefs_per_grant_frame / RPP);
1221
1222         gnttab_list = kmalloc(max_nr_glist_frames * sizeof(grant_ref_t *),
1223                               GFP_KERNEL);
1224         if (gnttab_list == NULL)
1225                 return -ENOMEM;
1226
1227         nr_glist_frames = (nr_grant_frames * grefs_per_grant_frame + RPP - 1) / RPP;
1228         for (i = 0; i < nr_glist_frames; i++) {
1229                 gnttab_list[i] = (grant_ref_t *)__get_free_page(GFP_KERNEL);
1230                 if (gnttab_list[i] == NULL) {
1231                         ret = -ENOMEM;
1232                         goto ini_nomem;
1233                 }
1234         }
1235
1236         if (gnttab_setup() < 0) {
1237                 ret = -ENODEV;
1238                 goto ini_nomem;
1239         }
1240
1241         nr_init_grefs = nr_grant_frames * grefs_per_grant_frame;
1242
1243         for (i = NR_RESERVED_ENTRIES; i < nr_init_grefs - 1; i++)
1244                 gnttab_entry(i) = i + 1;
1245
1246         gnttab_entry(nr_init_grefs - 1) = GNTTAB_LIST_END;
1247         gnttab_free_count = nr_init_grefs - NR_RESERVED_ENTRIES;
1248         gnttab_free_head  = NR_RESERVED_ENTRIES;
1249
1250         printk("Grant table initialized\n");
1251         return 0;
1252
1253  ini_nomem:
1254         for (i--; i >= 0; i--)
1255                 free_page((unsigned long)gnttab_list[i]);
1256         kfree(gnttab_list);
1257         return ret;
1258 }
1259 EXPORT_SYMBOL_GPL(gnttab_init);
1260
1261 static int __gnttab_init(void)
1262 {
1263         /* Delay grant-table initialization in the PV on HVM case */
1264         if (xen_hvm_domain())
1265                 return 0;
1266
1267         if (!xen_pv_domain())
1268                 return -ENODEV;
1269
1270         return gnttab_init();
1271 }
1272
1273 core_initcall(__gnttab_init);