Lines Matching full:bitmap

14  * struct iova_bitmap_map - A bitmap representing an IOVA range
16 * Main data structure for tracking mapped user pages of bitmap data.
24 * The user does not need to exact location of the bits in the bitmap.
26 * records the IOVA *range* in the bitmap by setting the corresponding
29 * The bitmap is an array of u64 whereas each bit represents an IOVA of
30 * range of (1 << pgshift). Thus formula for the bitmap data to be set is:
50 /* pinned pages representing the bitmap data */
55 * struct iova_bitmap - The IOVA bitmap object
57 * Main data structure for iterating over the bitmap data.
60 * It uses a windowing scheme and pins the bitmap in relatively
63 * The bitmap object uses one base page to store all the pinned pages
64 * pointers related to the bitmap. For sizeof(struct page*) == 8 it stores
66 * 2M of bitmap data is pinned at a time. If the iova_bitmap page size is
75 * An example of the APIs on how to use/iterate over the IOVA bitmap:
77 * bitmap = iova_bitmap_alloc(iova, length, page_size, data);
78 * if (IS_ERR(bitmap))
79 * return PTR_ERR(bitmap);
81 * ret = iova_bitmap_for_each(bitmap, arg, dirty_reporter_fn);
83 * iova_bitmap_free(bitmap);
90 * iova_bitmap_set(bitmap, iova, iova_length);
93 * which u64 word of the bitmap is mapped, up to @mapped_total_index.
97 * The IOVA bitmap is usually located on what tracks DMA mapped ranges or
99 * bitmap.
102 /* IOVA range representing the currently mapped bitmap data */
105 /* userspace address of the bitmap */
106 u8 __user *bitmap; member
114 /* base IOVA of the whole bitmap */
117 /* length of the IOVA range for the whole bitmap */
122 * Converts a relative IOVA to a bitmap index.
123 * This function provides the index into the u64 array (bitmap::bitmap)
125 * Relative IOVA means relative to the bitmap::mapped base IOVA
130 static unsigned long iova_bitmap_offset_to_index(struct iova_bitmap *bitmap, in iova_bitmap_offset_to_index() argument
133 unsigned long pgsize = 1 << bitmap->mapped.pgshift; in iova_bitmap_offset_to_index()
135 return iova / (BITS_PER_TYPE(*bitmap->bitmap) * pgsize); in iova_bitmap_offset_to_index()
139 * Converts a bitmap index to a *relative* IOVA.
141 static unsigned long iova_bitmap_index_to_offset(struct iova_bitmap *bitmap, in iova_bitmap_index_to_offset() argument
144 unsigned long pgshift = bitmap->mapped.pgshift; in iova_bitmap_index_to_offset()
146 return (index * BITS_PER_TYPE(*bitmap->bitmap)) << pgshift; in iova_bitmap_index_to_offset()
152 static unsigned long iova_bitmap_mapped_iova(struct iova_bitmap *bitmap) in iova_bitmap_mapped_iova() argument
154 unsigned long skip = bitmap->mapped_base_index; in iova_bitmap_mapped_iova()
156 return bitmap->iova + iova_bitmap_index_to_offset(bitmap, skip); in iova_bitmap_mapped_iova()
159 static unsigned long iova_bitmap_mapped_length(struct iova_bitmap *bitmap);
162 * Pins the bitmap user pages for the current range window.
163 * This is internal to IOVA bitmap and called when advancing the
164 * index (@mapped_base_index) or allocating the bitmap.
166 static int iova_bitmap_get(struct iova_bitmap *bitmap) in iova_bitmap_get() argument
168 struct iova_bitmap_map *mapped = &bitmap->mapped; in iova_bitmap_get()
179 npages = DIV_ROUND_UP((bitmap->mapped_total_index - in iova_bitmap_get()
180 bitmap->mapped_base_index) * in iova_bitmap_get()
181 sizeof(*bitmap->bitmap), PAGE_SIZE); in iova_bitmap_get()
184 * Bitmap address to be pinned is calculated via pointer arithmetic in iova_bitmap_get()
185 * with bitmap u64 word index. in iova_bitmap_get()
187 addr = bitmap->bitmap + bitmap->mapped_base_index; in iova_bitmap_get()
191 * This is, for example, on x86 means 2M of bitmap data max. in iova_bitmap_get()
203 mapped->iova = iova_bitmap_mapped_iova(bitmap); in iova_bitmap_get()
207 * This handles the case where the bitmap is not PAGE_SIZE in iova_bitmap_get()
211 mapped->length = iova_bitmap_mapped_length(bitmap); in iova_bitmap_get()
216 * Unpins the bitmap user pages and clears @npages
218 * the index or freeing the bitmap.
220 static void iova_bitmap_put(struct iova_bitmap *bitmap) in iova_bitmap_put() argument
222 struct iova_bitmap_map *mapped = &bitmap->mapped; in iova_bitmap_put()
231 * iova_bitmap_alloc() - Allocates an IOVA bitmap object
234 * @page_size: Page size of the IOVA bitmap. It defines what each bit
236 * @data: Userspace address of the bitmap
248 struct iova_bitmap *bitmap; in iova_bitmap_alloc() local
251 bitmap = kzalloc(sizeof(*bitmap), GFP_KERNEL); in iova_bitmap_alloc()
252 if (!bitmap) in iova_bitmap_alloc()
255 mapped = &bitmap->mapped; in iova_bitmap_alloc()
257 bitmap->bitmap = (u8 __user *)data; in iova_bitmap_alloc()
258 bitmap->mapped_total_index = in iova_bitmap_alloc()
259 iova_bitmap_offset_to_index(bitmap, length - 1) + 1; in iova_bitmap_alloc()
260 bitmap->iova = iova; in iova_bitmap_alloc()
261 bitmap->length = length; in iova_bitmap_alloc()
269 return bitmap; in iova_bitmap_alloc()
272 iova_bitmap_free(bitmap); in iova_bitmap_alloc()
278 * iova_bitmap_free() - Frees an IOVA bitmap object
279 * @bitmap: IOVA bitmap to free
284 void iova_bitmap_free(struct iova_bitmap *bitmap) in iova_bitmap_free() argument
286 struct iova_bitmap_map *mapped = &bitmap->mapped; in iova_bitmap_free()
288 iova_bitmap_put(bitmap); in iova_bitmap_free()
295 kfree(bitmap); in iova_bitmap_free()
300 * Returns the remaining bitmap indexes from mapped_total_index to process for
301 * the currently pinned bitmap pages.
303 static unsigned long iova_bitmap_mapped_remaining(struct iova_bitmap *bitmap) in iova_bitmap_mapped_remaining() argument
307 bytes = (bitmap->mapped.npages << PAGE_SHIFT) - bitmap->mapped.pgoff; in iova_bitmap_mapped_remaining()
309 remaining = bitmap->mapped_total_index - bitmap->mapped_base_index; in iova_bitmap_mapped_remaining()
311 DIV_ROUND_UP(bytes, sizeof(*bitmap->bitmap))); in iova_bitmap_mapped_remaining()
319 static unsigned long iova_bitmap_mapped_length(struct iova_bitmap *bitmap) in iova_bitmap_mapped_length() argument
321 unsigned long max_iova = bitmap->iova + bitmap->length - 1; in iova_bitmap_mapped_length()
322 unsigned long iova = iova_bitmap_mapped_iova(bitmap); in iova_bitmap_mapped_length()
327 * when converted to IOVA gives us a max length that the bitmap in iova_bitmap_mapped_length()
329 * only cover the IOVA range in @bitmap::iova .. @bitmap::length. in iova_bitmap_mapped_length()
331 remaining = iova_bitmap_index_to_offset(bitmap, in iova_bitmap_mapped_length()
332 iova_bitmap_mapped_remaining(bitmap)); in iova_bitmap_mapped_length()
353 * pages and pins the next set of bitmap pages.
356 static int iova_bitmap_advance_to(struct iova_bitmap *bitmap, in iova_bitmap_advance_to() argument
361 index = iova_bitmap_offset_to_index(bitmap, iova - bitmap->iova); in iova_bitmap_advance_to()
362 if (index >= bitmap->mapped_total_index) in iova_bitmap_advance_to()
364 bitmap->mapped_base_index = index; in iova_bitmap_advance_to()
366 iova_bitmap_put(bitmap); in iova_bitmap_advance_to()
368 /* Pin the next set of bitmap pages */ in iova_bitmap_advance_to()
369 return iova_bitmap_get(bitmap); in iova_bitmap_advance_to()
373 * iova_bitmap_for_each() - Iterates over the bitmap
374 * @bitmap: IOVA bitmap to iterate
378 * Helper function to iterate over bitmap data representing a portion of IOVA
380 * mapped bitmap user pages into IOVA ranges to process.
385 int iova_bitmap_for_each(struct iova_bitmap *bitmap, void *opaque, in iova_bitmap_for_each() argument
388 return fn(bitmap, bitmap->iova, bitmap->length, opaque); in iova_bitmap_for_each()
393 * iova_bitmap_set() - Records an IOVA range in bitmap
394 * @bitmap: IOVA bitmap
399 * the user bitmap.
402 void iova_bitmap_set(struct iova_bitmap *bitmap, in iova_bitmap_set() argument
405 struct iova_bitmap_map *mapped = &bitmap->mapped; in iova_bitmap_set()
416 if (iova_bitmap_advance_to(bitmap, iova)) in iova_bitmap_set()