Lines Matching refs:ctor
37 static inline void z_erofs_pagevec_ctor_exit(struct z_erofs_pagevec_ctor *ctor, in z_erofs_pagevec_ctor_exit() argument
40 if (!ctor->curr) in z_erofs_pagevec_ctor_exit()
44 kunmap_atomic(ctor->pages); in z_erofs_pagevec_ctor_exit()
46 kunmap(ctor->curr); in z_erofs_pagevec_ctor_exit()
50 z_erofs_pagevec_ctor_next_page(struct z_erofs_pagevec_ctor *ctor, in z_erofs_pagevec_ctor_next_page() argument
56 if (ctor->next) in z_erofs_pagevec_ctor_next_page()
57 return ctor->next; in z_erofs_pagevec_ctor_next_page()
60 const erofs_vtptr_t t = ctor->pages[index]; in z_erofs_pagevec_ctor_next_page()
66 DBG_BUGON(nr >= ctor->nr); in z_erofs_pagevec_ctor_next_page()
71 z_erofs_pagevec_ctor_pagedown(struct z_erofs_pagevec_ctor *ctor, in z_erofs_pagevec_ctor_pagedown() argument
74 struct page *next = z_erofs_pagevec_ctor_next_page(ctor, ctor->nr); in z_erofs_pagevec_ctor_pagedown()
76 z_erofs_pagevec_ctor_exit(ctor, atomic); in z_erofs_pagevec_ctor_pagedown()
78 ctor->curr = next; in z_erofs_pagevec_ctor_pagedown()
79 ctor->next = NULL; in z_erofs_pagevec_ctor_pagedown()
80 ctor->pages = atomic ? in z_erofs_pagevec_ctor_pagedown()
81 kmap_atomic(ctor->curr) : kmap(ctor->curr); in z_erofs_pagevec_ctor_pagedown()
83 ctor->nr = PAGE_SIZE / sizeof(struct page *); in z_erofs_pagevec_ctor_pagedown()
84 ctor->index = 0; in z_erofs_pagevec_ctor_pagedown()
87 static inline void z_erofs_pagevec_ctor_init(struct z_erofs_pagevec_ctor *ctor, in z_erofs_pagevec_ctor_init() argument
92 ctor->nr = nr; in z_erofs_pagevec_ctor_init()
93 ctor->curr = ctor->next = NULL; in z_erofs_pagevec_ctor_init()
94 ctor->pages = pages; in z_erofs_pagevec_ctor_init()
98 z_erofs_pagevec_ctor_pagedown(ctor, false); in z_erofs_pagevec_ctor_init()
99 while (i > ctor->nr) { in z_erofs_pagevec_ctor_init()
100 i -= ctor->nr; in z_erofs_pagevec_ctor_init()
101 z_erofs_pagevec_ctor_pagedown(ctor, false); in z_erofs_pagevec_ctor_init()
104 ctor->next = z_erofs_pagevec_ctor_next_page(ctor, i); in z_erofs_pagevec_ctor_init()
105 ctor->index = i; in z_erofs_pagevec_ctor_init()
108 static inline bool z_erofs_pagevec_enqueue(struct z_erofs_pagevec_ctor *ctor, in z_erofs_pagevec_enqueue() argument
113 if (!ctor->next) { in z_erofs_pagevec_enqueue()
119 ctor->index + 1 == ctor->nr) in z_erofs_pagevec_enqueue()
123 if (ctor->index >= ctor->nr) in z_erofs_pagevec_enqueue()
124 z_erofs_pagevec_ctor_pagedown(ctor, false); in z_erofs_pagevec_enqueue()
131 if (type == (uintptr_t)ctor->next) { in z_erofs_pagevec_enqueue()
132 ctor->next = page; in z_erofs_pagevec_enqueue()
134 ctor->pages[ctor->index++] = tagptr_fold(erofs_vtptr_t, page, type); in z_erofs_pagevec_enqueue()
139 z_erofs_pagevec_dequeue(struct z_erofs_pagevec_ctor *ctor, in z_erofs_pagevec_dequeue() argument
144 if (ctor->index >= ctor->nr) { in z_erofs_pagevec_dequeue()
145 DBG_BUGON(!ctor->next); in z_erofs_pagevec_dequeue()
146 z_erofs_pagevec_ctor_pagedown(ctor, true); in z_erofs_pagevec_dequeue()
149 t = ctor->pages[ctor->index]; in z_erofs_pagevec_dequeue()
154 if (*type == (uintptr_t)ctor->next) in z_erofs_pagevec_dequeue()
155 ctor->next = tagptr_unfold_ptr(t); in z_erofs_pagevec_dequeue()
157 ctor->pages[ctor->index++] = tagptr_fold(erofs_vtptr_t, NULL, 0); in z_erofs_pagevec_dequeue()