static int p9_get_mapped_pages(struct virtio_chan *chan, struct page **pages, char *data, int nr_pages, int write, int kern_buf) { int err; if (!kern_buf) { /* * We allow only p9_max_pages pinned. We wait for the * Other zc request to finish here */ if (atomic_read(&vp_pinned) >= chan->p9_max_pages) { err = wait_event_interruptible(vp_wq, (atomic_read(&vp_pinned) < chan->p9_max_pages)); if (err == -ERESTARTSYS) return err; } err = p9_payload_gup(data, &nr_pages, pages, write); if (err < 0) return err; atomic_add(nr_pages, &vp_pinned); } else { /* kernel buffer, no need to pin pages */ int s, index = 0; int count = nr_pages; while (nr_pages) { s = rest_of_page(data); pages[index++] = kmap_to_page(data); data += s; nr_pages--; } nr_pages = count; } return nr_pages; }
static void render_state_free(struct i915_render_state *so) { kunmap(kmap_to_page(so->batch)); i915_gem_object_ggtt_unpin(so->obj); drm_gem_object_unreference(&so->obj->base); kfree(so); }
/* * get_kernel_pages() - pin kernel pages in memory * @kiov: An array of struct kvec structures * @nr_segs: number of segments to pin * @write: pinning for read/write, currently ignored * @pages: array that receives pointers to the pages pinned. * Should be at least nr_segs long. * * Returns number of pages pinned. This may be fewer than the number * requested. If nr_pages is 0 or negative, returns 0. If no pages * were pinned, returns -errno. Each page returned must be released * with a put_page() call when it is finished with. */ int get_kernel_pages(const struct kvec *kiov, int nr_segs, int write, struct page **pages) { int seg; for (seg = 0; seg < nr_segs; seg++) { if (WARN_ON(kiov[seg].iov_len != PAGE_SIZE)) return seg; pages[seg] = kmap_to_page(kiov[seg].iov_base); page_cache_get(pages[seg]); } return seg; }