luca020400

Untitled

Nov 7th, 2015
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.10 KB | None | 0 0
  1. static void dma_cache_maint_page(struct page *page, unsigned long offset,
  2. size_t size, enum dma_data_direction dir,
  3. void (*op)(const void *, size_t, int))
  4. {
  5. unsigned long pfn;
  6. size_t left = size;
  7. pfn = page_to_pfn(page) + offset / PAGE_SIZE;
  8. offset %= PAGE_SIZE;
  9. /*
  10. * A single sg entry may refer to multiple physically contiguous
  11. * pages. But we still need to process highmem pages individually.
  12. * If highmem is not configured then the bulk of this loop gets
  13. * optimized out.
  14. */
  15. do {
  16. size_t len = left;
  17. void *vaddr;
  18. page = pfn_to_page(pfn);
  19. if (PageHighMem(page)) {
  20. if (len + offset > PAGE_SIZE)
  21. len = PAGE_SIZE - offset;
  22. vaddr = kmap_high_get(page);
  23. if (vaddr) {
  24. vaddr += offset;
  25. op(vaddr, len, dir);
  26. kunmap_high(page);
  27. } else if (cache_is_vipt()) {
  28. /* unmapped pages might still be cached */
  29. vaddr = kmap_atomic(page);
  30. op(vaddr + offset, len, dir);
  31. kunmap_atomic(vaddr);
  32. }
  33. } else {
  34. vaddr = page_address(page) + offset;
  35. op(vaddr, len, dir);
  36. }
  37. offset = 0;
  38. pfn++;
  39. left -= len;
  40. } while (left);
  41. }
Advertisement
Add Comment
Please, Sign In to add comment