Lines Matching refs:gref
105 struct gntalloc_gref *gref;
110 static void __del_gref(struct gntalloc_gref *gref);
114 struct gntalloc_gref *gref, *n;
115 list_for_each_entry_safe(gref, n, &gref_list, next_gref) {
116 if (!gref->users)
117 __del_gref(gref);
127 struct gntalloc_gref *gref, *next;
131 gref = kzalloc(sizeof(*gref), GFP_KERNEL);
132 if (!gref) {
136 list_add_tail(&gref->next_gref, &queue_gref);
137 list_add_tail(&gref->next_file, &queue_file);
138 gref->users = 1;
139 gref->file_index = op->index + i * PAGE_SIZE;
140 gref->page = alloc_page(GFP_KERNEL|__GFP_ZERO);
141 if (!gref->page) {
148 xen_page_to_gfn(gref->page),
152 gref_ids[i] = gref->gref_id = rc;
155 /* Add to gref lists. */
167 list_for_each_entry_safe(gref, next, &queue_file, next_file) {
168 list_del(&gref->next_file);
169 __del_gref(gref);
176 static void __del_gref(struct gntalloc_gref *gref)
180 if (gref->notify.flags & UNMAP_NOTIFY_CLEAR_BYTE) {
181 uint8_t *tmp = kmap(gref->page);
182 tmp[gref->notify.pgoff] = 0;
183 kunmap(gref->page);
185 if (gref->notify.flags & UNMAP_NOTIFY_SEND_EVENT) {
186 notify_remote_via_evtchn(gref->notify.event);
187 evtchn_put(gref->notify.event);
190 gref->notify.flags = 0;
192 if (gref->gref_id) {
193 if (gref->page) {
194 addr = (unsigned long)page_to_virt(gref->page);
195 gnttab_end_foreign_access(gref->gref_id, 0, addr);
197 gnttab_free_grant_reference(gref->gref_id);
201 list_del(&gref->next_gref);
203 kfree(gref);
210 struct gntalloc_gref *rv = NULL, *gref;
211 list_for_each_entry(gref, &priv->list, next_file) {
212 if (gref->file_index == index && !rv)
213 rv = gref;
215 if (gref->file_index != index)
253 struct gntalloc_gref *gref;
259 gref = list_entry(priv->list.next,
261 list_del(&gref->next_file);
262 gref->users--;
263 if (gref->users == 0)
264 __del_gref(gref);
340 struct gntalloc_gref *gref, *n;
350 gref = find_grefs(priv, op.index, op.count);
351 if (gref) {
357 n = list_entry(gref->next_file.next,
359 list_del(&gref->next_file);
360 gref->users--;
361 gref = n;
378 struct gntalloc_gref *gref;
391 gref = find_grefs(priv, index, 1);
392 if (!gref) {
416 if (gref->notify.flags & UNMAP_NOTIFY_SEND_EVENT)
417 evtchn_put(gref->notify.event);
419 gref->notify.flags = op.action;
420 gref->notify.pgoff = pgoff;
421 gref->notify.event = op.event_channel_port;
466 struct gntalloc_gref *gref, *next;
475 gref = priv->gref;
477 gref->users--;
478 next = list_entry(gref->next_gref.next,
480 if (gref->users == 0)
481 __del_gref(gref);
482 gref = next;
498 struct gntalloc_gref *gref;
516 gref = find_grefs(priv, vma->vm_pgoff << PAGE_SHIFT, count);
517 if (gref == NULL) {
525 vm_priv->gref = gref;
536 gref->users++;
538 gref->page);
542 gref = list_entry(gref->next_file.next,