Lines Matching refs:buf

48 	void (*calc_num_grefs)(struct xen_front_pgdir_shbuf *buf);
51 void (*fill_page_dir)(struct xen_front_pgdir_shbuf *buf);
54 int (*grant_refs_for_buffer)(struct xen_front_pgdir_shbuf *buf,
58 int (*map)(struct xen_front_pgdir_shbuf *buf);
61 int (*unmap)(struct xen_front_pgdir_shbuf *buf);
75 xen_front_pgdir_shbuf_get_dir_start(struct xen_front_pgdir_shbuf *buf) in xen_front_pgdir_shbuf_get_dir_start() argument
77 if (!buf->grefs) in xen_front_pgdir_shbuf_get_dir_start()
80 return buf->grefs[0]; in xen_front_pgdir_shbuf_get_dir_start()
95 int xen_front_pgdir_shbuf_map(struct xen_front_pgdir_shbuf *buf) in xen_front_pgdir_shbuf_map() argument
97 if (buf->ops && buf->ops->map) in xen_front_pgdir_shbuf_map()
98 return buf->ops->map(buf); in xen_front_pgdir_shbuf_map()
116 int xen_front_pgdir_shbuf_unmap(struct xen_front_pgdir_shbuf *buf) in xen_front_pgdir_shbuf_unmap() argument
118 if (buf->ops && buf->ops->unmap) in xen_front_pgdir_shbuf_unmap()
119 return buf->ops->unmap(buf); in xen_front_pgdir_shbuf_unmap()
131 void xen_front_pgdir_shbuf_free(struct xen_front_pgdir_shbuf *buf) in xen_front_pgdir_shbuf_free() argument
133 if (buf->grefs) { in xen_front_pgdir_shbuf_free()
136 for (i = 0; i < buf->num_grefs; i++) in xen_front_pgdir_shbuf_free()
137 if (buf->grefs[i] != INVALID_GRANT_REF) in xen_front_pgdir_shbuf_free()
138 gnttab_end_foreign_access(buf->grefs[i], NULL); in xen_front_pgdir_shbuf_free()
140 kfree(buf->grefs); in xen_front_pgdir_shbuf_free()
141 kfree(buf->directory); in xen_front_pgdir_shbuf_free()
158 static int get_num_pages_dir(struct xen_front_pgdir_shbuf *buf) in get_num_pages_dir() argument
160 return DIV_ROUND_UP(buf->num_pages, XEN_NUM_GREFS_PER_PAGE); in get_num_pages_dir()
169 static void backend_calc_num_grefs(struct xen_front_pgdir_shbuf *buf) in backend_calc_num_grefs() argument
172 buf->num_grefs = get_num_pages_dir(buf); in backend_calc_num_grefs()
181 static void guest_calc_num_grefs(struct xen_front_pgdir_shbuf *buf) in guest_calc_num_grefs() argument
187 buf->num_grefs = get_num_pages_dir(buf) + buf->num_pages; in guest_calc_num_grefs()
200 static int backend_unmap(struct xen_front_pgdir_shbuf *buf) in backend_unmap() argument
205 if (!buf->pages || !buf->backend_map_handles || !buf->grefs) in backend_unmap()
208 unmap_ops = kcalloc(buf->num_pages, sizeof(*unmap_ops), in backend_unmap()
213 for (i = 0; i < buf->num_pages; i++) { in backend_unmap()
216 addr = xen_page_to_vaddr(buf->pages[i]); in backend_unmap()
218 buf->backend_map_handles[i]); in backend_unmap()
221 ret = gnttab_unmap_refs(unmap_ops, NULL, buf->pages, in backend_unmap()
222 buf->num_pages); in backend_unmap()
224 for (i = 0; i < buf->num_pages; i++) { in backend_unmap()
226 dev_err(&buf->xb_dev->dev, in backend_unmap()
232 dev_err(&buf->xb_dev->dev, in backend_unmap()
236 kfree(buf->backend_map_handles); in backend_unmap()
237 buf->backend_map_handles = NULL; in backend_unmap()
247 static int backend_map(struct xen_front_pgdir_shbuf *buf) in backend_map() argument
253 map_ops = kcalloc(buf->num_pages, sizeof(*map_ops), GFP_KERNEL); in backend_map()
257 buf->backend_map_handles = kcalloc(buf->num_pages, in backend_map()
258 sizeof(*buf->backend_map_handles), in backend_map()
260 if (!buf->backend_map_handles) { in backend_map()
270 ptr = buf->directory; in backend_map()
271 grefs_left = buf->num_pages; in backend_map()
273 for (cur_dir_page = 0; cur_dir_page < buf->num_grefs; cur_dir_page++) { in backend_map()
284 addr = xen_page_to_vaddr(buf->pages[cur_page]); in backend_map()
288 buf->xb_dev->otherend_id); in backend_map()
295 ret = gnttab_map_refs(map_ops, NULL, buf->pages, buf->num_pages); in backend_map()
298 for (cur_page = 0; cur_page < buf->num_pages; cur_page++) { in backend_map()
300 buf->backend_map_handles[cur_page] = in backend_map()
303 buf->backend_map_handles[cur_page] = in backend_map()
307 dev_err(&buf->xb_dev->dev, in backend_map()
314 dev_err(&buf->xb_dev->dev, in backend_map()
316 backend_unmap(buf); in backend_map()
332 static void backend_fill_page_dir(struct xen_front_pgdir_shbuf *buf) in backend_fill_page_dir() argument
338 ptr = buf->directory; in backend_fill_page_dir()
339 num_pages_dir = get_num_pages_dir(buf); in backend_fill_page_dir()
345 page_dir->gref_dir_next_page = buf->grefs[i + 1]; in backend_fill_page_dir()
359 static void guest_fill_page_dir(struct xen_front_pgdir_shbuf *buf) in guest_fill_page_dir() argument
364 ptr = buf->directory; in guest_fill_page_dir()
365 num_pages_dir = get_num_pages_dir(buf); in guest_fill_page_dir()
372 grefs_left = buf->num_pages; in guest_fill_page_dir()
382 page_dir->gref_dir_next_page = buf->grefs[i + 1]; in guest_fill_page_dir()
384 memcpy(&page_dir->gref, &buf->grefs[cur_gref], in guest_fill_page_dir()
401 static int guest_grant_refs_for_buffer(struct xen_front_pgdir_shbuf *buf, in guest_grant_refs_for_buffer() argument
407 otherend_id = buf->xb_dev->otherend_id; in guest_grant_refs_for_buffer()
408 for (i = 0; i < buf->num_pages; i++) { in guest_grant_refs_for_buffer()
414 xen_page_to_gfn(buf->pages[i]), in guest_grant_refs_for_buffer()
416 buf->grefs[gref_idx++] = cur_ref; in guest_grant_refs_for_buffer()
430 static int grant_references(struct xen_front_pgdir_shbuf *buf) in grant_references() argument
436 ret = gnttab_alloc_grant_references(buf->num_grefs, &priv_gref_head); in grant_references()
438 dev_err(&buf->xb_dev->dev, in grant_references()
443 otherend_id = buf->xb_dev->otherend_id; in grant_references()
445 num_pages_dir = get_num_pages_dir(buf); in grant_references()
453 frame = xen_page_to_gfn(virt_to_page(buf->directory + in grant_references()
456 buf->grefs[j++] = cur_ref; in grant_references()
459 if (buf->ops->grant_refs_for_buffer) { in grant_references()
460 ret = buf->ops->grant_refs_for_buffer(buf, &priv_gref_head, j); in grant_references()
475 static int alloc_storage(struct xen_front_pgdir_shbuf *buf) in alloc_storage() argument
477 buf->grefs = kcalloc(buf->num_grefs, sizeof(*buf->grefs), GFP_KERNEL); in alloc_storage()
478 if (!buf->grefs) in alloc_storage()
481 buf->directory = kcalloc(get_num_pages_dir(buf), PAGE_SIZE, GFP_KERNEL); in alloc_storage()
482 if (!buf->directory) in alloc_storage()
517 struct xen_front_pgdir_shbuf *buf = cfg->pgdir; in xen_front_pgdir_shbuf_alloc() local
521 buf->ops = &backend_ops; in xen_front_pgdir_shbuf_alloc()
523 buf->ops = &local_ops; in xen_front_pgdir_shbuf_alloc()
524 buf->xb_dev = cfg->xb_dev; in xen_front_pgdir_shbuf_alloc()
525 buf->num_pages = cfg->num_pages; in xen_front_pgdir_shbuf_alloc()
526 buf->pages = cfg->pages; in xen_front_pgdir_shbuf_alloc()
528 buf->ops->calc_num_grefs(buf); in xen_front_pgdir_shbuf_alloc()
530 ret = alloc_storage(buf); in xen_front_pgdir_shbuf_alloc()
534 ret = grant_references(buf); in xen_front_pgdir_shbuf_alloc()
538 buf->ops->fill_page_dir(buf); in xen_front_pgdir_shbuf_alloc()
543 xen_front_pgdir_shbuf_free(buf); in xen_front_pgdir_shbuf_alloc()