Lines Matching defs:bufmap

9 #include "orangefs-bufmap.h"
177 orangefs_bufmap_unmap(struct orangefs_bufmap *bufmap)
179 unpin_user_pages(bufmap->page_array, bufmap->page_count);
183 orangefs_bufmap_free(struct orangefs_bufmap *bufmap)
187 if (!bufmap)
190 for (i = 0; i < bufmap->desc_count; i++) {
191 kfree(bufmap->desc_array[i].folio_array);
192 kfree(bufmap->desc_array[i].folio_offsets);
193 bufmap->desc_array[i].folio_array = NULL;
194 bufmap->desc_array[i].folio_offsets = NULL;
196 kfree(bufmap->page_array);
197 kfree(bufmap->desc_array);
198 bitmap_free(bufmap->buffer_index_array);
199 kfree(bufmap);
209 struct orangefs_bufmap *bufmap;
212 bufmap = __orangefs_bufmap;
213 if (bufmap)
214 size = bufmap->desc_size;
225 struct orangefs_bufmap *bufmap;
227 bufmap = kzalloc_obj(*bufmap);
228 if (!bufmap)
231 bufmap->total_size = user_desc->total_size;
232 bufmap->desc_count = user_desc->count;
233 bufmap->desc_size = user_desc->size;
234 bufmap->desc_shift = ilog2(bufmap->desc_size);
235 bufmap->page_count = bufmap->total_size / PAGE_SIZE;
237 bufmap->buffer_index_array =
238 bitmap_zalloc(bufmap->desc_count, GFP_KERNEL);
239 if (!bufmap->buffer_index_array)
242 bufmap->desc_array =
243 kzalloc_objs(struct orangefs_bufmap_desc, bufmap->desc_count);
244 if (!bufmap->desc_array)
248 bufmap->page_array =
249 kzalloc_objs(struct page *, bufmap->page_count);
250 if (!bufmap->page_array)
254 bufmap->folio_array = kzalloc_objs(struct folio *, bufmap->page_count);
255 if (!bufmap->folio_array)
258 return bufmap;
261 kfree(bufmap->page_array);
263 kfree(bufmap->desc_array);
265 bitmap_free(bufmap->buffer_index_array);
267 kfree(bufmap);
272 static int orangefs_bufmap_group_folios(struct orangefs_bufmap *bufmap)
281 while (i < bufmap->page_count) {
282 page = bufmap->page_array[i];
289 if (bufmap->page_array[i + k] != folio_page(folio, k)) {
296 bufmap->folio_array[f++] = folio;
300 bufmap->folio_count = f;
303 bufmap->folio_count,
304 bufmap->page_count);
308 static int orangefs_bufmap_map(struct orangefs_bufmap *bufmap,
311 int pages_per_desc = bufmap->desc_size / PAGE_SIZE;
328 bufmap->page_count,
330 bufmap->page_array);
335 if (ret != bufmap->page_count) {
337 bufmap->page_count, ret);
339 unpin_user_page(bufmap->page_array[i]);
349 for (i = 0; i < bufmap->page_count; i++)
350 flush_dcache_page(bufmap->page_array[i]);
355 ret = orangefs_bufmap_group_folios(bufmap);
360 __func__, bufmap->desc_size, pages_per_desc,
361 bufmap->folio_count);
366 for (i = 0; i < bufmap->desc_count; i++) {
370 bufmap->desc_array[i].is_two_2mib_chunks = false;
377 bufmap->desc_array[i].folio_array =
379 if (!bufmap->desc_array[i].folio_array) {
384 bufmap->desc_array[i].folio_offsets =
386 if (!bufmap->desc_array[i].folio_offsets) {
388 kfree(bufmap->desc_array[i].folio_array);
389 bufmap->desc_array[i].folio_array = NULL;
393 bufmap->desc_array[i].uaddr =
394 user_desc->ptr + (size_t)i * bufmap->desc_size;
402 if (current_folio >= bufmap->folio_count) {
406 folio = bufmap->folio_array[current_folio++];
410 folio = bufmap->folio_array[current_folio - 1];
417 bufmap->desc_array[i].folio_array[desc_folio_count] =
419 bufmap->desc_array[i].folio_offsets[desc_folio_count] =
430 folio_nr_pages(bufmap->desc_array[i].folio_array[0]) == 512 &&
431 folio_nr_pages(bufmap->desc_array[i].folio_array[1]) == 512) {
432 bufmap->desc_array[i].is_two_2mib_chunks = true;
437 bufmap->desc_array[i].folio_count = desc_folio_count;
455 if (bufmap->desc_array[j].folio_array) {
456 kfree(bufmap->desc_array[j].folio_array);
457 bufmap->desc_array[j].folio_array = NULL;
459 if (bufmap->desc_array[j].folio_offsets) {
460 kfree(bufmap->desc_array[j].folio_offsets);
461 bufmap->desc_array[j].folio_offsets = NULL;
464 unpin_user_pages(bufmap->page_array, bufmap->page_count);
473 * user_desc is the parameters provided by userspace for the bufmap.
479 struct orangefs_bufmap *bufmap;
522 gossip_err("orangefs error: bufmap size not page size divisible (%d).\n",
528 bufmap = orangefs_bufmap_alloc(user_desc);
529 if (!bufmap)
532 ret = orangefs_bufmap_map(bufmap, user_desc);
540 gossip_err("orangefs: error: bufmap already initialized.\n");
544 __orangefs_bufmap = bufmap;
546 bufmap->desc_count,
547 bufmap->buffer_index_array);
550 bufmap->readdir_index_array);
558 orangefs_bufmap_unmap(bufmap);
560 orangefs_bufmap_free(bufmap);
575 struct orangefs_bufmap *bufmap = __orangefs_bufmap;
576 if (!bufmap)
587 struct orangefs_bufmap *bufmap = __orangefs_bufmap;
588 if (!bufmap)
595 orangefs_bufmap_unmap(bufmap);
596 orangefs_bufmap_free(bufmap);