blob: 97c4fc742cc325eb6fb21708524749b0aa67d429 [file] [log] [blame]
Nicholas Flintham1e3d3112013-04-10 10:48:38 +01001#ifndef LINUX_QUICKLIST_H
2#define LINUX_QUICKLIST_H
3#include <linux/kernel.h>
4#include <linux/gfp.h>
5#include <linux/percpu.h>
6
7#ifdef CONFIG_QUICKLIST
8
9struct quicklist {
10 void *page;
11 int nr_pages;
12};
13
14DECLARE_PER_CPU(struct quicklist, quicklist)[CONFIG_NR_QUICK];
15
16static inline void *quicklist_alloc(int nr, gfp_t flags, void (*ctor)(void *))
17{
18 struct quicklist *q;
19 void **p = NULL;
20
21 q =&get_cpu_var(quicklist)[nr];
22 p = q->page;
23 if (likely(p)) {
24 q->page = p[0];
25 p[0] = NULL;
26 q->nr_pages--;
27 }
28 put_cpu_var(quicklist);
29 if (likely(p))
30 return p;
31
32 p = (void *)__get_free_page(flags | __GFP_ZERO);
33 if (ctor && p)
34 ctor(p);
35 return p;
36}
37
38static inline void __quicklist_free(int nr, void (*dtor)(void *), void *p,
39 struct page *page)
40{
41 struct quicklist *q;
42
43 q = &get_cpu_var(quicklist)[nr];
44 *(void **)p = q->page;
45 q->page = p;
46 q->nr_pages++;
47 put_cpu_var(quicklist);
48}
49
50static inline void quicklist_free(int nr, void (*dtor)(void *), void *pp)
51{
52 __quicklist_free(nr, dtor, pp, virt_to_page(pp));
53}
54
55static inline void quicklist_free_page(int nr, void (*dtor)(void *),
56 struct page *page)
57{
58 __quicklist_free(nr, dtor, page_address(page), page);
59}
60
61void quicklist_trim(int nr, void (*dtor)(void *),
62 unsigned long min_pages, unsigned long max_free);
63
64unsigned long quicklist_total_size(void);
65
66#else
67
68static inline unsigned long quicklist_total_size(void)
69{
70 return 0;
71}
72
73#endif
74
75#endif
76