ia64/xen-unstable

changeset 6364:5b1ed5b39451

Cleanup grant table code.
- keep count of free references
- let callbacks specify the number of references they need at least
- get rid of terminal reference
- simplify and more correct locking for callbacks
Signed-off-by: Christian Limpach <Christian.Limpach@cl.cam.ac.uk>
author cl349@firebug.cl.cam.ac.uk
date Tue Aug 23 13:11:31 2005 +0000 (2005-08-23)
parents eecb74e515fd
children 28e55fad651f
files linux-2.6-xen-sparse/arch/xen/kernel/gnttab.c linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c linux-2.6-xen-sparse/include/asm-xen/gnttab.h
line diff
     1.1 --- a/linux-2.6-xen-sparse/arch/xen/kernel/gnttab.c	Tue Aug 23 09:33:48 2005 +0000
     1.2 +++ b/linux-2.6-xen-sparse/arch/xen/kernel/gnttab.c	Tue Aug 23 13:11:31 2005 +0000
     1.3 @@ -46,55 +46,76 @@ EXPORT_SYMBOL(gnttab_release_grant_refer
     1.4  EXPORT_SYMBOL(gnttab_grant_foreign_access_ref);
     1.5  EXPORT_SYMBOL(gnttab_grant_foreign_transfer_ref);
     1.6  
     1.7 -static grant_ref_t gnttab_free_list[NR_GRANT_ENTRIES];
     1.8 +#define NR_GRANT_ENTRIES (NR_GRANT_FRAMES * PAGE_SIZE / sizeof(grant_entry_t))
     1.9 +#define GNTTAB_LIST_END (NR_GRANT_ENTRIES + 1)
    1.10 +
    1.11 +static grant_ref_t gnttab_list[NR_GRANT_ENTRIES];
    1.12 +static int gnttab_free_count = NR_GRANT_ENTRIES;
    1.13  static grant_ref_t gnttab_free_head;
    1.14 +static spinlock_t gnttab_list_lock = SPIN_LOCK_UNLOCKED;
    1.15  
    1.16  static grant_entry_t *shared;
    1.17  
    1.18  static struct gnttab_free_callback *gnttab_free_callback_list = NULL;
    1.19 -static spinlock_t gnttab_free_callback_list_lock = SPIN_LOCK_UNLOCKED;
    1.20  
    1.21 -/*
    1.22 - * Lock-free grant-entry allocator
    1.23 - */
    1.24 -
    1.25 -static inline int
    1.26 -get_free_entry(
    1.27 -    void)
    1.28 +static int
    1.29 +get_free_entries(int count)
    1.30  {
    1.31 -    grant_ref_t fh, nfh = gnttab_free_head;
    1.32 -    do { if ( unlikely((fh = nfh) == NR_GRANT_ENTRIES) ) return -1; }
    1.33 -    while ( unlikely((nfh = cmpxchg(&gnttab_free_head, fh,
    1.34 -                                    gnttab_free_list[fh])) != fh) );
    1.35 -    return fh;
    1.36 +    unsigned long flags;
    1.37 +    int ref;
    1.38 +    grant_ref_t head;
    1.39 +    spin_lock_irqsave(&gnttab_list_lock, flags);
    1.40 +    if (gnttab_free_count < count) {
    1.41 +	spin_unlock_irqrestore(&gnttab_list_lock, flags);
    1.42 +	return -1;
    1.43 +    }
    1.44 +    ref = head = gnttab_free_head;
    1.45 +    gnttab_free_count -= count;
    1.46 +    while (count-- > 1)
    1.47 +	head = gnttab_list[head];
    1.48 +    gnttab_free_head = gnttab_list[head];
    1.49 +    gnttab_list[head] = GNTTAB_LIST_END;
    1.50 +    spin_unlock_irqrestore(&gnttab_list_lock, flags);
    1.51 +    return ref;
    1.52  }
    1.53  
    1.54 -static void do_free_callbacks(unsigned long flags)
    1.55 +#define get_free_entry() get_free_entries(1)
    1.56 +
    1.57 +static void
    1.58 +do_free_callbacks(void)
    1.59  {
    1.60      struct gnttab_free_callback *callback = gnttab_free_callback_list, *next;
    1.61      gnttab_free_callback_list = NULL;
    1.62 -    spin_unlock_irqrestore(&gnttab_free_callback_list_lock, flags);
    1.63      while (callback) {
    1.64  	next = callback->next;
    1.65 -	callback->next = NULL;
    1.66 -	callback->fn(callback->arg);
    1.67 +	if (gnttab_free_count >= callback->count) {
    1.68 +	    callback->next = NULL;
    1.69 +	    callback->fn(callback->arg);
    1.70 +	} else {
    1.71 +	    callback->next = gnttab_free_callback_list;
    1.72 +	    gnttab_free_callback_list = callback;
    1.73 +	}
    1.74  	callback = next;
    1.75      }
    1.76  }
    1.77  
    1.78  static inline void
    1.79 -put_free_entry(
    1.80 -    grant_ref_t ref)
    1.81 +check_free_callbacks(void)
    1.82  {
    1.83 -    grant_ref_t fh, nfh = gnttab_free_head;
    1.84 +    if (unlikely(gnttab_free_callback_list))
    1.85 +	do_free_callbacks();
    1.86 +}
    1.87 +
    1.88 +static void
    1.89 +put_free_entry(grant_ref_t ref)
    1.90 +{
    1.91      unsigned long flags;
    1.92 -    do { gnttab_free_list[ref] = fh = nfh; wmb(); }
    1.93 -    while ( unlikely((nfh = cmpxchg(&gnttab_free_head, fh, ref)) != fh) );
    1.94 -    spin_lock_irqsave(&gnttab_free_callback_list_lock, flags);
    1.95 -    if ( unlikely(gnttab_free_callback_list) )
    1.96 -	do_free_callbacks(flags);
    1.97 -    else
    1.98 -	spin_unlock_irqrestore(&gnttab_free_callback_list_lock, flags);
    1.99 +    spin_lock_irqsave(&gnttab_list_lock, flags);
   1.100 +    gnttab_list[ref] = gnttab_free_head;
   1.101 +    gnttab_free_head = ref;
   1.102 +    gnttab_free_count++;
   1.103 +    check_free_callbacks();
   1.104 +    spin_unlock_irqrestore(&gnttab_list_lock, flags);
   1.105  }
   1.106  
   1.107  /*
   1.108 @@ -102,8 +123,7 @@ put_free_entry(
   1.109   */
   1.110  
   1.111  int
   1.112 -gnttab_grant_foreign_access(
   1.113 -    domid_t domid, unsigned long frame, int readonly)
   1.114 +gnttab_grant_foreign_access(domid_t domid, unsigned long frame, int readonly)
   1.115  {
   1.116      int ref;
   1.117      
   1.118 @@ -119,8 +139,8 @@ gnttab_grant_foreign_access(
   1.119  }
   1.120  
   1.121  void
   1.122 -gnttab_grant_foreign_access_ref(
   1.123 -    grant_ref_t ref, domid_t domid, unsigned long frame, int readonly)
   1.124 +gnttab_grant_foreign_access_ref(grant_ref_t ref, domid_t domid,
   1.125 +				unsigned long frame, int readonly)
   1.126  {
   1.127      shared[ref].frame = frame;
   1.128      shared[ref].domid = domid;
   1.129 @@ -130,7 +150,7 @@ gnttab_grant_foreign_access_ref(
   1.130  
   1.131  
   1.132  int
   1.133 -gnttab_query_foreign_access( grant_ref_t ref )
   1.134 +gnttab_query_foreign_access(grant_ref_t ref)
   1.135  {
   1.136      u16 nflags;
   1.137  
   1.138 @@ -140,7 +160,7 @@ gnttab_query_foreign_access( grant_ref_t
   1.139  }
   1.140  
   1.141  void
   1.142 -gnttab_end_foreign_access( grant_ref_t ref, int readonly )
   1.143 +gnttab_end_foreign_access(grant_ref_t ref, int readonly)
   1.144  {
   1.145      u16 flags, nflags;
   1.146  
   1.147 @@ -155,8 +175,7 @@ gnttab_end_foreign_access( grant_ref_t r
   1.148  }
   1.149  
   1.150  int
   1.151 -gnttab_grant_foreign_transfer(
   1.152 -    domid_t domid, unsigned long pfn )
   1.153 +gnttab_grant_foreign_transfer(domid_t domid, unsigned long pfn)
   1.154  {
   1.155      int ref;
   1.156  
   1.157 @@ -172,8 +191,8 @@ gnttab_grant_foreign_transfer(
   1.158  }
   1.159  
   1.160  void
   1.161 -gnttab_grant_foreign_transfer_ref(
   1.162 -    grant_ref_t ref, domid_t domid, unsigned long pfn )
   1.163 +gnttab_grant_foreign_transfer_ref(grant_ref_t ref, domid_t domid,
   1.164 +				  unsigned long pfn)
   1.165  {
   1.166      shared[ref].frame = pfn;
   1.167      shared[ref].domid = domid;
   1.168 @@ -182,8 +201,7 @@ gnttab_grant_foreign_transfer_ref(
   1.169  }
   1.170  
   1.171  unsigned long
   1.172 -gnttab_end_foreign_transfer(
   1.173 -    grant_ref_t ref)
   1.174 +gnttab_end_foreign_transfer(grant_ref_t ref)
   1.175  {
   1.176      unsigned long frame = 0;
   1.177      u16           flags;
   1.178 @@ -212,80 +230,79 @@ gnttab_end_foreign_transfer(
   1.179  }
   1.180  
   1.181  void
   1.182 -gnttab_free_grant_reference( grant_ref_t ref )
   1.183 +gnttab_free_grant_reference(grant_ref_t ref)
   1.184  {
   1.185  
   1.186      put_free_entry(ref);
   1.187  }
   1.188  
   1.189  void
   1.190 -gnttab_free_grant_references( grant_ref_t *head,
   1.191 -                              grant_ref_t terminal )
   1.192 +gnttab_free_grant_references(grant_ref_t head)
   1.193  {
   1.194 -    /* TODO: O(N)...? */
   1.195      grant_ref_t ref;
   1.196 -
   1.197 -    while (*head != terminal) {
   1.198 -	ref = *head;
   1.199 -	*head = gnttab_free_list[*head];
   1.200 -	put_free_entry(ref);
   1.201 +    unsigned long flags;
   1.202 +    int count = 1;
   1.203 +    if (head == GNTTAB_LIST_END)
   1.204 +	return;
   1.205 +    spin_lock_irqsave(&gnttab_list_lock, flags);
   1.206 +    ref = head;
   1.207 +    while (gnttab_list[ref] != GNTTAB_LIST_END) {
   1.208 +	ref = gnttab_list[ref];
   1.209 +	count++;
   1.210      }
   1.211 +    gnttab_list[ref] = gnttab_free_head;
   1.212 +    gnttab_free_head = head;
   1.213 +    gnttab_free_count += count;
   1.214 +    check_free_callbacks();
   1.215 +    spin_unlock_irqrestore(&gnttab_list_lock, flags);
   1.216  }
   1.217  
   1.218  int
   1.219 -gnttab_alloc_grant_references( u16 count,
   1.220 -                               grant_ref_t *head,
   1.221 -                               grant_ref_t *terminal )
   1.222 +gnttab_alloc_grant_references(u16 count, grant_ref_t *head)
   1.223  {
   1.224 -    int i;
   1.225 -    grant_ref_t h = gnttab_free_head;
   1.226 +    int h = get_free_entries(count);
   1.227  
   1.228 -    for ( i = 0; i < count; i++ )
   1.229 -        if ( unlikely(get_free_entry() == -1) )
   1.230 -            goto not_enough_refs;
   1.231 +    if (h == -1)
   1.232 +	return -ENOSPC;
   1.233  
   1.234      *head = h;
   1.235 -    *terminal = gnttab_free_head;
   1.236  
   1.237      return 0;
   1.238 -
   1.239 -not_enough_refs:
   1.240 -    gnttab_free_head = h;
   1.241 -    return -ENOSPC;
   1.242  }
   1.243  
   1.244  int
   1.245 -gnttab_claim_grant_reference( grant_ref_t *private_head,
   1.246 -                              grant_ref_t  terminal )
   1.247 +gnttab_claim_grant_reference(grant_ref_t *private_head)
   1.248  {
   1.249 -    grant_ref_t g;
   1.250 -    if ( unlikely((g = *private_head) == terminal) )
   1.251 +    grant_ref_t g = *private_head;
   1.252 +    if (unlikely(g == GNTTAB_LIST_END))
   1.253          return -ENOSPC;
   1.254 -    *private_head = gnttab_free_list[g];
   1.255 +    *private_head = gnttab_list[g];
   1.256      return g;
   1.257  }
   1.258  
   1.259  void
   1.260 -gnttab_release_grant_reference( grant_ref_t *private_head,
   1.261 -                                grant_ref_t  release )
   1.262 +gnttab_release_grant_reference(grant_ref_t *private_head, grant_ref_t  release)
   1.263  {
   1.264 -    gnttab_free_list[release] = *private_head;
   1.265 +    gnttab_list[release] = *private_head;
   1.266      *private_head = release;
   1.267  }
   1.268  
   1.269  void
   1.270  gnttab_request_free_callback(struct gnttab_free_callback *callback,
   1.271 -			     void (*fn)(void *), void *arg)
   1.272 +			     void (*fn)(void *), void *arg, u16 count)
   1.273  {
   1.274      unsigned long flags;
   1.275 +    spin_lock_irqsave(&gnttab_list_lock, flags);
   1.276      if (callback->next)
   1.277 -	return;
   1.278 +	goto out;
   1.279      callback->fn = fn;
   1.280      callback->arg = arg;
   1.281 -    spin_lock_irqsave(&gnttab_free_callback_list_lock, flags);
   1.282 +    callback->count = count;
   1.283      callback->next = gnttab_free_callback_list;
   1.284      gnttab_free_callback_list = callback;
   1.285 -    spin_unlock_irqrestore(&gnttab_free_callback_list_lock, flags);
   1.286 +    check_free_callbacks();
   1.287 + out:
   1.288 +    spin_unlock_irqrestore(&gnttab_list_lock, flags);
   1.289  }
   1.290  
   1.291  /*
   1.292 @@ -296,8 +313,9 @@ gnttab_request_free_callback(struct gntt
   1.293  
   1.294  static struct proc_dir_entry *grant_pde;
   1.295  
   1.296 -static int grant_ioctl(struct inode *inode, struct file *file,
   1.297 -                       unsigned int cmd, unsigned long data)
   1.298 +static int
   1.299 +grant_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
   1.300 +	    unsigned long data)
   1.301  {
   1.302      int                     ret;
   1.303      privcmd_hypercall_t     hypercall;
   1.304 @@ -335,8 +353,9 @@ static struct file_operations grant_file
   1.305      ioctl:  grant_ioctl,
   1.306  };
   1.307  
   1.308 -static int grant_read(char *page, char **start, off_t off,
   1.309 -                      int count, int *eof, void *data)
   1.310 +static int
   1.311 +grant_read(char *page, char **start, off_t off, int count, int *eof,
   1.312 +	   void *data)
   1.313  {
   1.314      int             len;
   1.315      unsigned int    i;
   1.316 @@ -365,8 +384,9 @@ static int grant_read(char *page, char *
   1.317      return len;
   1.318  }
   1.319  
   1.320 -static int grant_write(struct file *file, const char __user *buffer,
   1.321 -                       unsigned long count, void *data)
   1.322 +static int
   1.323 +grant_write(struct file *file, const char __user *buffer, unsigned long count,
   1.324 +	    void *data)
   1.325  {
   1.326      /* TODO: implement this */
   1.327      return -ENOSYS;
   1.328 @@ -374,7 +394,8 @@ static int grant_write(struct file *file
   1.329  
   1.330  #endif /* CONFIG_PROC_FS */
   1.331  
   1.332 -int gnttab_resume(void)
   1.333 +int
   1.334 +gnttab_resume(void)
   1.335  {
   1.336      gnttab_setup_table_t setup;
   1.337      unsigned long        frames[NR_GRANT_FRAMES];
   1.338 @@ -393,7 +414,8 @@ int gnttab_resume(void)
   1.339      return 0;
   1.340  }
   1.341  
   1.342 -int gnttab_suspend(void)
   1.343 +int
   1.344 +gnttab_suspend(void)
   1.345  {
   1.346      int i;
   1.347  
   1.348 @@ -403,7 +425,8 @@ int gnttab_suspend(void)
   1.349      return 0;
   1.350  }
   1.351  
   1.352 -static int __init gnttab_init(void)
   1.353 +static int __init
   1.354 +gnttab_init(void)
   1.355  {
   1.356      int i;
   1.357  
   1.358 @@ -412,7 +435,7 @@ static int __init gnttab_init(void)
   1.359      shared = (grant_entry_t *)fix_to_virt(FIX_GNTTAB_END);
   1.360  
   1.361      for ( i = 0; i < NR_GRANT_ENTRIES; i++ )
   1.362 -        gnttab_free_list[i] = i + 1;
   1.363 +        gnttab_list[i] = i + 1;
   1.364      
   1.365  #ifdef CONFIG_PROC_FS
   1.366      /*
     2.1 --- a/linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c	Tue Aug 23 09:33:48 2005 +0000
     2.2 +++ b/linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c	Tue Aug 23 13:11:31 2005 +0000
     2.3 @@ -237,15 +237,16 @@ static int blkif_queue_request(struct re
     2.4      unsigned long id;
     2.5      unsigned int fsect, lsect;
     2.6      int ref;
     2.7 -    grant_ref_t gref_head, gref_terminal;
     2.8 +    grant_ref_t gref_head;
     2.9  
    2.10      if (unlikely(info->connected != BLKIF_STATE_CONNECTED))
    2.11          return 1;
    2.12  
    2.13      if (gnttab_alloc_grant_references(BLKIF_MAX_SEGMENTS_PER_REQUEST,
    2.14 -				      &gref_head, &gref_terminal) < 0) {
    2.15 +				      &gref_head) < 0) {
    2.16  	    gnttab_request_free_callback(&info->callback,
    2.17 -					 blkif_restart_queue_callback, info);
    2.18 +					 blkif_restart_queue_callback, info,
    2.19 +					 BLKIF_MAX_SEGMENTS_PER_REQUEST);
    2.20  	    return 1;
    2.21      }
    2.22  
    2.23 @@ -270,7 +271,7 @@ static int blkif_queue_request(struct re
    2.24              fsect = bvec->bv_offset >> 9;
    2.25              lsect = fsect + (bvec->bv_len >> 9) - 1;
    2.26              /* install a grant reference. */
    2.27 -            ref = gnttab_claim_grant_reference(&gref_head, gref_terminal);
    2.28 +            ref = gnttab_claim_grant_reference(&gref_head);
    2.29              ASSERT( ref != -ENOSPC );
    2.30  
    2.31              gnttab_grant_foreign_access_ref(
    2.32 @@ -294,7 +295,7 @@ static int blkif_queue_request(struct re
    2.33      /* Keep a private copy so we can reissue requests when recovering. */
    2.34      pickle_request(&blk_shadow[id], ring_req);
    2.35  
    2.36 -    gnttab_free_grant_references(&gref_head, gref_terminal);
    2.37 +    gnttab_free_grant_references(gref_head);
    2.38  
    2.39      return 0;
    2.40  }
    2.41 @@ -738,7 +739,7 @@ static int blkif_queue_request(unsigned 
    2.42              blk_shadow[req->id].request = (unsigned long)id;
    2.43  
    2.44              /* install a grant reference. */
    2.45 -            ref = gnttab_claim_grant_reference(&gref_head, gref_terminal);
    2.46 +            ref = gnttab_claim_grant_reference(&gref_head);
    2.47              ASSERT( ref != -ENOSPC );
    2.48  
    2.49              gnttab_grant_foreign_access_ref(
    2.50 @@ -790,7 +791,7 @@ static int blkif_queue_request(unsigned 
    2.51      req->handle        = handle;
    2.52      req->nr_segments   = 1;
    2.53      /* install a grant reference. */
    2.54 -    ref = gnttab_claim_grant_reference(&gref_head, gref_terminal);
    2.55 +    ref = gnttab_claim_grant_reference(&gref_head);
    2.56      ASSERT( ref != -ENOSPC );
    2.57  
    2.58      gnttab_grant_foreign_access_ref(
     3.1 --- a/linux-2.6-xen-sparse/include/asm-xen/gnttab.h	Tue Aug 23 09:33:48 2005 +0000
     3.2 +++ b/linux-2.6-xen-sparse/include/asm-xen/gnttab.h	Tue Aug 23 13:11:31 2005 +0000
     3.3 @@ -19,68 +19,46 @@
     3.4  
     3.5  /* NR_GRANT_FRAMES must be less than or equal to that configured in Xen */
     3.6  #define NR_GRANT_FRAMES 4
     3.7 -#define NR_GRANT_ENTRIES (NR_GRANT_FRAMES * PAGE_SIZE / sizeof(grant_entry_t))
     3.8  
     3.9  struct gnttab_free_callback {
    3.10      struct gnttab_free_callback *next;
    3.11      void (*fn)(void *);
    3.12      void *arg;
    3.13 +    u16 count;
    3.14  };
    3.15  
    3.16 -int
    3.17 -gnttab_grant_foreign_access(
    3.18 -    domid_t domid, unsigned long frame, int readonly);
    3.19 +int gnttab_grant_foreign_access(domid_t domid, unsigned long frame,
    3.20 +				int readonly);
    3.21  
    3.22 -void
    3.23 -gnttab_end_foreign_access(
    3.24 -    grant_ref_t ref, int readonly);
    3.25 +void gnttab_end_foreign_access(grant_ref_t ref, int readonly);
    3.26  
    3.27 -int
    3.28 -gnttab_grant_foreign_transfer(
    3.29 -    domid_t domid, unsigned long pfn);
    3.30 +int gnttab_grant_foreign_transfer(domid_t domid, unsigned long pfn);
    3.31  
    3.32 -unsigned long
    3.33 -gnttab_end_foreign_transfer(
    3.34 -    grant_ref_t ref);
    3.35 +unsigned long gnttab_end_foreign_transfer(grant_ref_t ref);
    3.36  
    3.37 -int
    3.38 -gnttab_query_foreign_access( 
    3.39 -    grant_ref_t ref );
    3.40 +int gnttab_query_foreign_access(grant_ref_t ref);
    3.41  
    3.42  /*
    3.43   * operations on reserved batches of grant references
    3.44   */
    3.45 -int
    3.46 -gnttab_alloc_grant_references(
    3.47 -    u16 count, grant_ref_t *pprivate_head, grant_ref_t *private_terminal );
    3.48 +int gnttab_alloc_grant_references(u16 count, grant_ref_t *pprivate_head);
    3.49  
    3.50 -void
    3.51 -gnttab_free_grant_reference(
    3.52 -    grant_ref_t ref );
    3.53 +void gnttab_free_grant_reference(grant_ref_t ref);
    3.54  
    3.55 -void
    3.56 -gnttab_free_grant_references(
    3.57 -    grant_ref_t *head, grant_ref_t terminal );
    3.58 +void gnttab_free_grant_references(grant_ref_t head);
    3.59  
    3.60 -int
    3.61 -gnttab_claim_grant_reference( grant_ref_t *pprivate_head, grant_ref_t terminal
    3.62 -);
    3.63 +int gnttab_claim_grant_reference(grant_ref_t *pprivate_head);
    3.64  
    3.65 -void
    3.66 -gnttab_release_grant_reference(
    3.67 -    grant_ref_t *private_head, grant_ref_t release );
    3.68 +void gnttab_release_grant_reference(grant_ref_t *private_head,
    3.69 +				    grant_ref_t release);
    3.70  
    3.71 -void
    3.72 -gnttab_request_free_callback(
    3.73 -    struct gnttab_free_callback *callback, void (*fn)(void *), void *arg);
    3.74 +void gnttab_request_free_callback(struct gnttab_free_callback *callback,
    3.75 +				  void (*fn)(void *), void *arg, u16 count);
    3.76  
    3.77 -void
    3.78 -gnttab_grant_foreign_access_ref(
    3.79 -    grant_ref_t ref, domid_t domid, unsigned long frame, int readonly);
    3.80 +void gnttab_grant_foreign_access_ref(grant_ref_t ref, domid_t domid,
    3.81 +				     unsigned long frame, int readonly);
    3.82  
    3.83 -void
    3.84 -gnttab_grant_foreign_transfer_ref(
    3.85 -    grant_ref_t, domid_t domid, unsigned long pfn);
    3.86 -
    3.87 +void gnttab_grant_foreign_transfer_ref(grant_ref_t, domid_t domid,
    3.88 +				       unsigned long pfn);
    3.89  
    3.90  #endif /* __ASM_GNTTAB_H__ */