pagevec.h 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /*
  2. * include/linux/pagevec.h
  3. *
  4. * In many places it is efficient to batch an operation up against multiple
  5. * pages. A pagevec is a multipage container which is used for that.
  6. */
  7. #ifndef _LINUX_PAGEVEC_H
  8. #define _LINUX_PAGEVEC_H
  9. /* 14 pointers + two long's align the pagevec structure to a power of two */
  10. #define PAGEVEC_SIZE 14
  11. struct page;
  12. struct address_space;
  13. struct pagevec {
  14. unsigned long nr;
  15. unsigned long cold;
  16. struct page *pages[PAGEVEC_SIZE];
  17. };
  18. void __pagevec_release(struct pagevec *pvec);
  19. void __pagevec_lru_add(struct pagevec *pvec);
  20. unsigned pagevec_lookup_entries(struct pagevec *pvec,
  21. struct address_space *mapping,
  22. pgoff_t start, unsigned nr_entries,
  23. pgoff_t *indices);
  24. void pagevec_remove_exceptionals(struct pagevec *pvec);
  25. unsigned pagevec_lookup_range(struct pagevec *pvec,
  26. struct address_space *mapping,
  27. pgoff_t *start, pgoff_t end);
  28. static inline unsigned pagevec_lookup(struct pagevec *pvec,
  29. struct address_space *mapping,
  30. pgoff_t *start)
  31. {
  32. return pagevec_lookup_range(pvec, mapping, start, (pgoff_t)-1);
  33. }
  34. unsigned pagevec_lookup_tag(struct pagevec *pvec,
  35. struct address_space *mapping, pgoff_t *index, int tag,
  36. unsigned nr_pages);
  37. static inline void pagevec_init(struct pagevec *pvec, int cold)
  38. {
  39. pvec->nr = 0;
  40. pvec->cold = cold;
  41. }
  42. static inline void pagevec_reinit(struct pagevec *pvec)
  43. {
  44. pvec->nr = 0;
  45. }
  46. static inline unsigned pagevec_count(struct pagevec *pvec)
  47. {
  48. return pvec->nr;
  49. }
  50. static inline unsigned pagevec_space(struct pagevec *pvec)
  51. {
  52. return PAGEVEC_SIZE - pvec->nr;
  53. }
  54. /*
  55. * Add a page to a pagevec. Returns the number of slots still available.
  56. */
  57. static inline unsigned pagevec_add(struct pagevec *pvec, struct page *page)
  58. {
  59. pvec->pages[pvec->nr++] = page;
  60. return pagevec_space(pvec);
  61. }
  62. static inline void pagevec_release(struct pagevec *pvec)
  63. {
  64. if (pagevec_count(pvec))
  65. __pagevec_release(pvec);
  66. }
  67. #endif /* _LINUX_PAGEVEC_H */