persistent_gnt
static inline bool persistent_gnt_timeout(struct persistent_gnt *persistent_gnt)
return pgrant_timeout && (jiffies - persistent_gnt->last_used >=
struct persistent_gnt *persistent_gnt)
struct persistent_gnt *this;
this = container_of(*new, struct persistent_gnt, node);
if (persistent_gnt->gnt < this->gnt)
else if (persistent_gnt->gnt > this->gnt)
persistent_gnt->active = true;
rb_link_node(&(persistent_gnt->node), parent, new);
rb_insert_color(&(persistent_gnt->node), &ring->persistent_gnts);
static struct persistent_gnt *get_persistent_gnt(struct xen_blkif_ring *ring,
struct persistent_gnt *data;
data = container_of(node, struct persistent_gnt, node);
struct persistent_gnt *persistent_gnt)
if (!persistent_gnt->active)
persistent_gnt->last_used = jiffies;
persistent_gnt->active = false;
struct persistent_gnt *persistent_gnt;
foreach_grant_safe(persistent_gnt, n, root, node) {
BUG_ON(persistent_gnt->handle ==
persistent_gnt->page)),
persistent_gnt->handle);
pages[segs_to_unmap] = persistent_gnt->page;
!rb_next(&persistent_gnt->node)) {
rb_erase(&persistent_gnt->node, root);
kfree(persistent_gnt);
struct persistent_gnt *persistent_gnt;
persistent_gnt = list_first_entry(&ring->persistent_purge_list,
struct persistent_gnt,
list_del(&persistent_gnt->remove_node);
vaddr(persistent_gnt->page),
persistent_gnt->handle);
pages[segs_to_unmap] = persistent_gnt->page;
kfree(persistent_gnt);
struct persistent_gnt *persistent_gnt;
foreach_grant_safe(persistent_gnt, n, root, node) {
BUG_ON(persistent_gnt->handle ==
if (persistent_gnt->active)
if (!scan_used && !persistent_gnt_timeout(persistent_gnt))
rb_erase(&persistent_gnt->node, root);
list_add(&persistent_gnt->remove_node,
if (pages[i]->persistent_gnt != NULL) {
put_persistent_gnt(ring, pages[i]->persistent_gnt);
struct persistent_gnt *persistent_gnt = NULL;
persistent_gnt = get_persistent_gnt(
if (persistent_gnt) {
pages[i]->page = persistent_gnt->page;
pages[i]->persistent_gnt = persistent_gnt;
pages[i]->persistent_gnt = NULL;
if (!pages[seg_idx]->persistent_gnt) {
persistent_gnt = kmalloc_obj(struct persistent_gnt);
if (!persistent_gnt) {
persistent_gnt->gnt = map[new_map_idx].ref;
persistent_gnt->handle = map[new_map_idx].handle;
persistent_gnt->page = pages[seg_idx]->page;
persistent_gnt)) {
kfree(persistent_gnt);
persistent_gnt = NULL;
pages[seg_idx]->persistent_gnt = persistent_gnt;
persistent_gnt->gnt, ring->persistent_gnt_c,
pages[i]->persistent_gnt = NULL;
struct persistent_gnt *persistent_gnt;
struct grant *persistent_gnt, *n;
list_for_each_entry_safe(persistent_gnt, n,
list_del(&persistent_gnt->node);
if (persistent_gnt->gref != INVALID_GRANT_REF) {
gnttab_end_foreign_access(persistent_gnt->gref,
__free_page(persistent_gnt->page);
kfree(persistent_gnt);
persistent_gnt = rinfo->shadow[i].grants_used[j];
gnttab_end_foreign_access(persistent_gnt->gref, NULL);
__free_page(persistent_gnt->page);
kfree(persistent_gnt);
persistent_gnt = rinfo->shadow[i].indirect_grants[j];
gnttab_end_foreign_access(persistent_gnt->gref, NULL);
__free_page(persistent_gnt->page);
kfree(persistent_gnt);