Lines Matching refs:cache
906 static inline void cache_init(struct gnttab_page_cache *cache) in cache_init() argument
908 cache->pages = NULL; in cache_init()
911 static inline bool cache_empty(struct gnttab_page_cache *cache) in cache_empty() argument
913 return !cache->pages; in cache_empty()
916 static inline struct page *cache_deq(struct gnttab_page_cache *cache) in cache_deq() argument
920 page = cache->pages; in cache_deq()
921 cache->pages = page->zone_device_data; in cache_deq()
926 static inline void cache_enq(struct gnttab_page_cache *cache, struct page *page) in cache_enq() argument
928 page->zone_device_data = cache->pages; in cache_enq()
929 cache->pages = page; in cache_enq()
932 static inline void cache_init(struct gnttab_page_cache *cache) in cache_init() argument
934 INIT_LIST_HEAD(&cache->pages); in cache_init()
937 static inline bool cache_empty(struct gnttab_page_cache *cache) in cache_empty() argument
939 return list_empty(&cache->pages); in cache_empty()
942 static inline struct page *cache_deq(struct gnttab_page_cache *cache) in cache_deq() argument
946 page = list_first_entry(&cache->pages, struct page, lru); in cache_deq()
952 static inline void cache_enq(struct gnttab_page_cache *cache, struct page *page) in cache_enq() argument
954 list_add(&page->lru, &cache->pages); in cache_enq()
958 void gnttab_page_cache_init(struct gnttab_page_cache *cache) in gnttab_page_cache_init() argument
960 spin_lock_init(&cache->lock); in gnttab_page_cache_init()
961 cache_init(cache); in gnttab_page_cache_init()
962 cache->num_pages = 0; in gnttab_page_cache_init()
966 int gnttab_page_cache_get(struct gnttab_page_cache *cache, struct page **page) in gnttab_page_cache_get() argument
970 spin_lock_irqsave(&cache->lock, flags); in gnttab_page_cache_get()
972 if (cache_empty(cache)) { in gnttab_page_cache_get()
973 spin_unlock_irqrestore(&cache->lock, flags); in gnttab_page_cache_get()
977 page[0] = cache_deq(cache); in gnttab_page_cache_get()
978 cache->num_pages--; in gnttab_page_cache_get()
980 spin_unlock_irqrestore(&cache->lock, flags); in gnttab_page_cache_get()
986 void gnttab_page_cache_put(struct gnttab_page_cache *cache, struct page **page, in gnttab_page_cache_put() argument
992 spin_lock_irqsave(&cache->lock, flags); in gnttab_page_cache_put()
995 cache_enq(cache, page[i]); in gnttab_page_cache_put()
996 cache->num_pages += num; in gnttab_page_cache_put()
998 spin_unlock_irqrestore(&cache->lock, flags); in gnttab_page_cache_put()
1002 void gnttab_page_cache_shrink(struct gnttab_page_cache *cache, unsigned int num) in gnttab_page_cache_shrink() argument
1008 spin_lock_irqsave(&cache->lock, flags); in gnttab_page_cache_shrink()
1010 while (cache->num_pages > num) { in gnttab_page_cache_shrink()
1011 page[i] = cache_deq(cache); in gnttab_page_cache_shrink()
1012 cache->num_pages--; in gnttab_page_cache_shrink()
1014 spin_unlock_irqrestore(&cache->lock, flags); in gnttab_page_cache_shrink()
1017 spin_lock_irqsave(&cache->lock, flags); in gnttab_page_cache_shrink()
1021 spin_unlock_irqrestore(&cache->lock, flags); in gnttab_page_cache_shrink()