i2c: Remove all i2c_set_clientdata(client, NULL) in drivers
[pandora-kernel.git] / drivers / gpu / drm / ttm / ttm_page_alloc.c
1 /*
2  * Copyright (c) Red Hat Inc.
3
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sub license,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the
12  * next paragraph) shall be included in all copies or substantial portions
13  * of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21  * DEALINGS IN THE SOFTWARE.
22  *
23  * Authors: Dave Airlie <airlied@redhat.com>
24  *          Jerome Glisse <jglisse@redhat.com>
25  *          Pauli Nieminen <suokkos@gmail.com>
26  */
27
28 /* simple list based uncached page pool
29  * - Pool collects resently freed pages for reuse
30  * - Use page->lru to keep a free list
31  * - doesn't track currently in use pages
32  */
33 #include <linux/list.h>
34 #include <linux/spinlock.h>
35 #include <linux/highmem.h>
36 #include <linux/mm_types.h>
37 #include <linux/module.h>
38 #include <linux/mm.h>
39 #include <linux/seq_file.h> /* for seq_printf */
40 #include <linux/slab.h>
41
42 #include <asm/atomic.h>
43 #include <asm/agp.h>
44
45 #include "ttm/ttm_bo_driver.h"
46 #include "ttm/ttm_page_alloc.h"
47
48
49 #define NUM_PAGES_TO_ALLOC              (PAGE_SIZE/sizeof(struct page *))
50 #define SMALL_ALLOCATION                16
51 #define FREE_ALL_PAGES                  (~0U)
52 /* times are in msecs */
53 #define PAGE_FREE_INTERVAL              1000
54
55 /**
56  * struct ttm_page_pool - Pool to reuse recently allocated uc/wc pages.
57  *
58  * @lock: Protects the shared pool from concurrnet access. Must be used with
59  * irqsave/irqrestore variants because pool allocator maybe called from
60  * delayed work.
61  * @fill_lock: Prevent concurrent calls to fill.
62  * @list: Pool of free uc/wc pages for fast reuse.
63  * @gfp_flags: Flags to pass for alloc_page.
64  * @npages: Number of pages in pool.
65  */
66 struct ttm_page_pool {
67         spinlock_t              lock;
68         bool                    fill_lock;
69         struct list_head        list;
70         int                     gfp_flags;
71         unsigned                npages;
72         char                    *name;
73         unsigned long           nfrees;
74         unsigned long           nrefills;
75 };
76
77 /**
78  * Limits for the pool. They are handled without locks because only place where
79  * they may change is in sysfs store. They won't have immediate effect anyway
80  * so forcing serialiazation to access them is pointless.
81  */
82
83 struct ttm_pool_opts {
84         unsigned        alloc_size;
85         unsigned        max_size;
86         unsigned        small;
87 };
88
89 #define NUM_POOLS 4
90
91 /**
92  * struct ttm_pool_manager - Holds memory pools for fst allocation
93  *
94  * Manager is read only object for pool code so it doesn't need locking.
95  *
96  * @free_interval: minimum number of jiffies between freeing pages from pool.
97  * @page_alloc_inited: reference counting for pool allocation.
98  * @work: Work that is used to shrink the pool. Work is only run when there is
99  * some pages to free.
100  * @small_allocation: Limit in number of pages what is small allocation.
101  *
102  * @pools: All pool objects in use.
103  **/
104 struct ttm_pool_manager {
105         struct kobject          kobj;
106         struct shrinker         mm_shrink;
107         atomic_t                page_alloc_inited;
108         struct ttm_pool_opts    options;
109
110         union {
111                 struct ttm_page_pool    pools[NUM_POOLS];
112                 struct {
113                         struct ttm_page_pool    wc_pool;
114                         struct ttm_page_pool    uc_pool;
115                         struct ttm_page_pool    wc_pool_dma32;
116                         struct ttm_page_pool    uc_pool_dma32;
117                 } ;
118         };
119 };
120
121 static struct attribute ttm_page_pool_max = {
122         .name = "pool_max_size",
123         .mode = S_IRUGO | S_IWUSR
124 };
125 static struct attribute ttm_page_pool_small = {
126         .name = "pool_small_allocation",
127         .mode = S_IRUGO | S_IWUSR
128 };
129 static struct attribute ttm_page_pool_alloc_size = {
130         .name = "pool_allocation_size",
131         .mode = S_IRUGO | S_IWUSR
132 };
133
134 static struct attribute *ttm_pool_attrs[] = {
135         &ttm_page_pool_max,
136         &ttm_page_pool_small,
137         &ttm_page_pool_alloc_size,
138         NULL
139 };
140
141 static void ttm_pool_kobj_release(struct kobject *kobj)
142 {
143         struct ttm_pool_manager *m =
144                 container_of(kobj, struct ttm_pool_manager, kobj);
145         (void)m;
146 }
147
148 static ssize_t ttm_pool_store(struct kobject *kobj,
149                 struct attribute *attr, const char *buffer, size_t size)
150 {
151         struct ttm_pool_manager *m =
152                 container_of(kobj, struct ttm_pool_manager, kobj);
153         int chars;
154         unsigned val;
155         chars = sscanf(buffer, "%u", &val);
156         if (chars == 0)
157                 return size;
158
159         /* Convert kb to number of pages */
160         val = val / (PAGE_SIZE >> 10);
161
162         if (attr == &ttm_page_pool_max)
163                 m->options.max_size = val;
164         else if (attr == &ttm_page_pool_small)
165                 m->options.small = val;
166         else if (attr == &ttm_page_pool_alloc_size) {
167                 if (val > NUM_PAGES_TO_ALLOC*8) {
168                         printk(KERN_ERR "[ttm] Setting allocation size to %lu "
169                                         "is not allowed. Recomended size is "
170                                         "%lu\n",
171                                         NUM_PAGES_TO_ALLOC*(PAGE_SIZE >> 7),
172                                         NUM_PAGES_TO_ALLOC*(PAGE_SIZE >> 10));
173                         return size;
174                 } else if (val > NUM_PAGES_TO_ALLOC) {
175                         printk(KERN_WARNING "[ttm] Setting allocation size to "
176                                         "larger than %lu is not recomended.\n",
177                                         NUM_PAGES_TO_ALLOC*(PAGE_SIZE >> 10));
178                 }
179                 m->options.alloc_size = val;
180         }
181
182         return size;
183 }
184
185 static ssize_t ttm_pool_show(struct kobject *kobj,
186                 struct attribute *attr, char *buffer)
187 {
188         struct ttm_pool_manager *m =
189                 container_of(kobj, struct ttm_pool_manager, kobj);
190         unsigned val = 0;
191
192         if (attr == &ttm_page_pool_max)
193                 val = m->options.max_size;
194         else if (attr == &ttm_page_pool_small)
195                 val = m->options.small;
196         else if (attr == &ttm_page_pool_alloc_size)
197                 val = m->options.alloc_size;
198
199         val = val * (PAGE_SIZE >> 10);
200
201         return snprintf(buffer, PAGE_SIZE, "%u\n", val);
202 }
203
204 static const struct sysfs_ops ttm_pool_sysfs_ops = {
205         .show = &ttm_pool_show,
206         .store = &ttm_pool_store,
207 };
208
209 static struct kobj_type ttm_pool_kobj_type = {
210         .release = &ttm_pool_kobj_release,
211         .sysfs_ops = &ttm_pool_sysfs_ops,
212         .default_attrs = ttm_pool_attrs,
213 };
214
215 static struct ttm_pool_manager _manager = {
216         .page_alloc_inited      = ATOMIC_INIT(0)
217 };
218
219 #ifndef CONFIG_X86
220 static int set_pages_array_wb(struct page **pages, int addrinarray)
221 {
222 #ifdef TTM_HAS_AGP
223         int i;
224
225         for (i = 0; i < addrinarray; i++)
226                 unmap_page_from_agp(pages[i]);
227 #endif
228         return 0;
229 }
230
231 static int set_pages_array_wc(struct page **pages, int addrinarray)
232 {
233 #ifdef TTM_HAS_AGP
234         int i;
235
236         for (i = 0; i < addrinarray; i++)
237                 map_page_into_agp(pages[i]);
238 #endif
239         return 0;
240 }
241
242 static int set_pages_array_uc(struct page **pages, int addrinarray)
243 {
244 #ifdef TTM_HAS_AGP
245         int i;
246
247         for (i = 0; i < addrinarray; i++)
248                 map_page_into_agp(pages[i]);
249 #endif
250         return 0;
251 }
252 #endif
253
254 /**
255  * Select the right pool or requested caching state and ttm flags. */
256 static struct ttm_page_pool *ttm_get_pool(int flags,
257                 enum ttm_caching_state cstate)
258 {
259         int pool_index;
260
261         if (cstate == tt_cached)
262                 return NULL;
263
264         if (cstate == tt_wc)
265                 pool_index = 0x0;
266         else
267                 pool_index = 0x1;
268
269         if (flags & TTM_PAGE_FLAG_DMA32)
270                 pool_index |= 0x2;
271
272         return &_manager.pools[pool_index];
273 }
274
275 /* set memory back to wb and free the pages. */
276 static void ttm_pages_put(struct page *pages[], unsigned npages)
277 {
278         unsigned i;
279         if (set_pages_array_wb(pages, npages))
280                 printk(KERN_ERR "[ttm] Failed to set %d pages to wb!\n",
281                                 npages);
282         for (i = 0; i < npages; ++i)
283                 __free_page(pages[i]);
284 }
285
286 static void ttm_pool_update_free_locked(struct ttm_page_pool *pool,
287                 unsigned freed_pages)
288 {
289         pool->npages -= freed_pages;
290         pool->nfrees += freed_pages;
291 }
292
293 /**
294  * Free pages from pool.
295  *
296  * To prevent hogging the ttm_swap process we only free NUM_PAGES_TO_ALLOC
297  * number of pages in one go.
298  *
299  * @pool: to free the pages from
300  * @free_all: If set to true will free all pages in pool
301  **/
302 static int ttm_page_pool_free(struct ttm_page_pool *pool, unsigned nr_free)
303 {
304         unsigned long irq_flags;
305         struct page *p;
306         struct page **pages_to_free;
307         unsigned freed_pages = 0,
308                  npages_to_free = nr_free;
309
310         if (NUM_PAGES_TO_ALLOC < nr_free)
311                 npages_to_free = NUM_PAGES_TO_ALLOC;
312
313         pages_to_free = kmalloc(npages_to_free * sizeof(struct page *),
314                         GFP_KERNEL);
315         if (!pages_to_free) {
316                 printk(KERN_ERR "Failed to allocate memory for pool free operation.\n");
317                 return 0;
318         }
319
320 restart:
321         spin_lock_irqsave(&pool->lock, irq_flags);
322
323         list_for_each_entry_reverse(p, &pool->list, lru) {
324                 if (freed_pages >= npages_to_free)
325                         break;
326
327                 pages_to_free[freed_pages++] = p;
328                 /* We can only remove NUM_PAGES_TO_ALLOC at a time. */
329                 if (freed_pages >= NUM_PAGES_TO_ALLOC) {
330                         /* remove range of pages from the pool */
331                         __list_del(p->lru.prev, &pool->list);
332
333                         ttm_pool_update_free_locked(pool, freed_pages);
334                         /**
335                          * Because changing page caching is costly
336                          * we unlock the pool to prevent stalling.
337                          */
338                         spin_unlock_irqrestore(&pool->lock, irq_flags);
339
340                         ttm_pages_put(pages_to_free, freed_pages);
341                         if (likely(nr_free != FREE_ALL_PAGES))
342                                 nr_free -= freed_pages;
343
344                         if (NUM_PAGES_TO_ALLOC >= nr_free)
345                                 npages_to_free = nr_free;
346                         else
347                                 npages_to_free = NUM_PAGES_TO_ALLOC;
348
349                         freed_pages = 0;
350
351                         /* free all so restart the processing */
352                         if (nr_free)
353                                 goto restart;
354
355                         /* Not allowed to fall tough or break because
356                          * following context is inside spinlock while we are
357                          * outside here.
358                          */
359                         goto out;
360
361                 }
362         }
363
364         /* remove range of pages from the pool */
365         if (freed_pages) {
366                 __list_del(&p->lru, &pool->list);
367
368                 ttm_pool_update_free_locked(pool, freed_pages);
369                 nr_free -= freed_pages;
370         }
371
372         spin_unlock_irqrestore(&pool->lock, irq_flags);
373
374         if (freed_pages)
375                 ttm_pages_put(pages_to_free, freed_pages);
376 out:
377         kfree(pages_to_free);
378         return nr_free;
379 }
380
381 /* Get good estimation how many pages are free in pools */
382 static int ttm_pool_get_num_unused_pages(void)
383 {
384         unsigned i;
385         int total = 0;
386         for (i = 0; i < NUM_POOLS; ++i)
387                 total += _manager.pools[i].npages;
388
389         return total;
390 }
391
392 /**
393  * Calback for mm to request pool to reduce number of page held.
394  */
395 static int ttm_pool_mm_shrink(int shrink_pages, gfp_t gfp_mask)
396 {
397         static atomic_t start_pool = ATOMIC_INIT(0);
398         unsigned i;
399         unsigned pool_offset = atomic_add_return(1, &start_pool);
400         struct ttm_page_pool *pool;
401
402         pool_offset = pool_offset % NUM_POOLS;
403         /* select start pool in round robin fashion */
404         for (i = 0; i < NUM_POOLS; ++i) {
405                 unsigned nr_free = shrink_pages;
406                 if (shrink_pages == 0)
407                         break;
408                 pool = &_manager.pools[(i + pool_offset)%NUM_POOLS];
409                 shrink_pages = ttm_page_pool_free(pool, nr_free);
410         }
411         /* return estimated number of unused pages in pool */
412         return ttm_pool_get_num_unused_pages();
413 }
414
415 static void ttm_pool_mm_shrink_init(struct ttm_pool_manager *manager)
416 {
417         manager->mm_shrink.shrink = &ttm_pool_mm_shrink;
418         manager->mm_shrink.seeks = 1;
419         register_shrinker(&manager->mm_shrink);
420 }
421
422 static void ttm_pool_mm_shrink_fini(struct ttm_pool_manager *manager)
423 {
424         unregister_shrinker(&manager->mm_shrink);
425 }
426
427 static int ttm_set_pages_caching(struct page **pages,
428                 enum ttm_caching_state cstate, unsigned cpages)
429 {
430         int r = 0;
431         /* Set page caching */
432         switch (cstate) {
433         case tt_uncached:
434                 r = set_pages_array_uc(pages, cpages);
435                 if (r)
436                         printk(KERN_ERR "[ttm] Failed to set %d pages to uc!\n",
437                                         cpages);
438                 break;
439         case tt_wc:
440                 r = set_pages_array_wc(pages, cpages);
441                 if (r)
442                         printk(KERN_ERR "[ttm] Failed to set %d pages to wc!\n",
443                                         cpages);
444                 break;
445         default:
446                 break;
447         }
448         return r;
449 }
450
451 /**
452  * Free pages the pages that failed to change the caching state. If there is
453  * any pages that have changed their caching state already put them to the
454  * pool.
455  */
456 static void ttm_handle_caching_state_failure(struct list_head *pages,
457                 int ttm_flags, enum ttm_caching_state cstate,
458                 struct page **failed_pages, unsigned cpages)
459 {
460         unsigned i;
461         /* Failed pages has to be reed */
462         for (i = 0; i < cpages; ++i) {
463                 list_del(&failed_pages[i]->lru);
464                 __free_page(failed_pages[i]);
465         }
466 }
467
468 /**
469  * Allocate new pages with correct caching.
470  *
471  * This function is reentrant if caller updates count depending on number of
472  * pages returned in pages array.
473  */
474 static int ttm_alloc_new_pages(struct list_head *pages, int gfp_flags,
475                 int ttm_flags, enum ttm_caching_state cstate, unsigned count)
476 {
477         struct page **caching_array;
478         struct page *p;
479         int r = 0;
480         unsigned i, cpages;
481         unsigned max_cpages = min(count,
482                         (unsigned)(PAGE_SIZE/sizeof(struct page *)));
483
484         /* allocate array for page caching change */
485         caching_array = kmalloc(max_cpages*sizeof(struct page *), GFP_KERNEL);
486
487         if (!caching_array) {
488                 printk(KERN_ERR "[ttm] unable to allocate table for new pages.");
489                 return -ENOMEM;
490         }
491
492         for (i = 0, cpages = 0; i < count; ++i) {
493                 p = alloc_page(gfp_flags);
494
495                 if (!p) {
496                         printk(KERN_ERR "[ttm] unable to get page %u\n", i);
497
498                         /* store already allocated pages in the pool after
499                          * setting the caching state */
500                         if (cpages) {
501                                 r = ttm_set_pages_caching(caching_array, cstate, cpages);
502                                 if (r)
503                                         ttm_handle_caching_state_failure(pages,
504                                                 ttm_flags, cstate,
505                                                 caching_array, cpages);
506                         }
507                         r = -ENOMEM;
508                         goto out;
509                 }
510
511 #ifdef CONFIG_HIGHMEM
512                 /* gfp flags of highmem page should never be dma32 so we
513                  * we should be fine in such case
514                  */
515                 if (!PageHighMem(p))
516 #endif
517                 {
518                         caching_array[cpages++] = p;
519                         if (cpages == max_cpages) {
520
521                                 r = ttm_set_pages_caching(caching_array,
522                                                 cstate, cpages);
523                                 if (r) {
524                                         ttm_handle_caching_state_failure(pages,
525                                                 ttm_flags, cstate,
526                                                 caching_array, cpages);
527                                         goto out;
528                                 }
529                                 cpages = 0;
530                         }
531                 }
532
533                 list_add(&p->lru, pages);
534         }
535
536         if (cpages) {
537                 r = ttm_set_pages_caching(caching_array, cstate, cpages);
538                 if (r)
539                         ttm_handle_caching_state_failure(pages,
540                                         ttm_flags, cstate,
541                                         caching_array, cpages);
542         }
543 out:
544         kfree(caching_array);
545
546         return r;
547 }
548
549 /**
550  * Fill the given pool if there isn't enough pages and requested number of
551  * pages is small.
552  */
553 static void ttm_page_pool_fill_locked(struct ttm_page_pool *pool,
554                 int ttm_flags, enum ttm_caching_state cstate, unsigned count,
555                 unsigned long *irq_flags)
556 {
557         struct page *p;
558         int r;
559         unsigned cpages = 0;
560         /**
561          * Only allow one pool fill operation at a time.
562          * If pool doesn't have enough pages for the allocation new pages are
563          * allocated from outside of pool.
564          */
565         if (pool->fill_lock)
566                 return;
567
568         pool->fill_lock = true;
569
570         /* If allocation request is small and there is not enough
571          * pages in pool we fill the pool first */
572         if (count < _manager.options.small
573                 && count > pool->npages) {
574                 struct list_head new_pages;
575                 unsigned alloc_size = _manager.options.alloc_size;
576
577                 /**
578                  * Can't change page caching if in irqsave context. We have to
579                  * drop the pool->lock.
580                  */
581                 spin_unlock_irqrestore(&pool->lock, *irq_flags);
582
583                 INIT_LIST_HEAD(&new_pages);
584                 r = ttm_alloc_new_pages(&new_pages, pool->gfp_flags, ttm_flags,
585                                 cstate, alloc_size);
586                 spin_lock_irqsave(&pool->lock, *irq_flags);
587
588                 if (!r) {
589                         list_splice(&new_pages, &pool->list);
590                         ++pool->nrefills;
591                         pool->npages += alloc_size;
592                 } else {
593                         printk(KERN_ERR "[ttm] Failed to fill pool (%p).", pool);
594                         /* If we have any pages left put them to the pool. */
595                         list_for_each_entry(p, &pool->list, lru) {
596                                 ++cpages;
597                         }
598                         list_splice(&new_pages, &pool->list);
599                         pool->npages += cpages;
600                 }
601
602         }
603         pool->fill_lock = false;
604 }
605
606 /**
607  * Cut count nubmer of pages from the pool and put them to return list
608  *
609  * @return count of pages still to allocate to fill the request.
610  */
611 static unsigned ttm_page_pool_get_pages(struct ttm_page_pool *pool,
612                 struct list_head *pages, int ttm_flags,
613                 enum ttm_caching_state cstate, unsigned count)
614 {
615         unsigned long irq_flags;
616         struct list_head *p;
617         unsigned i;
618
619         spin_lock_irqsave(&pool->lock, irq_flags);
620         ttm_page_pool_fill_locked(pool, ttm_flags, cstate, count, &irq_flags);
621
622         if (count >= pool->npages) {
623                 /* take all pages from the pool */
624                 list_splice_init(&pool->list, pages);
625                 count -= pool->npages;
626                 pool->npages = 0;
627                 goto out;
628         }
629         /* find the last pages to include for requested number of pages. Split
630          * pool to begin and halves to reduce search space. */
631         if (count <= pool->npages/2) {
632                 i = 0;
633                 list_for_each(p, &pool->list) {
634                         if (++i == count)
635                                 break;
636                 }
637         } else {
638                 i = pool->npages + 1;
639                 list_for_each_prev(p, &pool->list) {
640                         if (--i == count)
641                                 break;
642                 }
643         }
644         /* Cut count number of pages from pool */
645         list_cut_position(pages, &pool->list, p);
646         pool->npages -= count;
647         count = 0;
648 out:
649         spin_unlock_irqrestore(&pool->lock, irq_flags);
650         return count;
651 }
652
653 /*
654  * On success pages list will hold count number of correctly
655  * cached pages.
656  */
657 int ttm_get_pages(struct list_head *pages, int flags,
658                 enum ttm_caching_state cstate, unsigned count)
659 {
660         struct ttm_page_pool *pool = ttm_get_pool(flags, cstate);
661         struct page *p = NULL;
662         int gfp_flags = 0;
663         int r;
664
665         /* set zero flag for page allocation if required */
666         if (flags & TTM_PAGE_FLAG_ZERO_ALLOC)
667                 gfp_flags |= __GFP_ZERO;
668
669         /* No pool for cached pages */
670         if (pool == NULL) {
671                 if (flags & TTM_PAGE_FLAG_DMA32)
672                         gfp_flags |= GFP_DMA32;
673                 else
674                         gfp_flags |= __GFP_HIGHMEM;
675
676                 for (r = 0; r < count; ++r) {
677                         p = alloc_page(gfp_flags);
678                         if (!p) {
679
680                                 printk(KERN_ERR "[ttm] unable to allocate page.");
681                                 return -ENOMEM;
682                         }
683
684                         list_add(&p->lru, pages);
685                 }
686                 return 0;
687         }
688
689
690         /* combine zero flag to pool flags */
691         gfp_flags |= pool->gfp_flags;
692
693         /* First we take pages from the pool */
694         count = ttm_page_pool_get_pages(pool, pages, flags, cstate, count);
695
696         /* clear the pages coming from the pool if requested */
697         if (flags & TTM_PAGE_FLAG_ZERO_ALLOC) {
698                 list_for_each_entry(p, pages, lru) {
699                         clear_page(page_address(p));
700                 }
701         }
702
703         /* If pool didn't have enough pages allocate new one. */
704         if (count > 0) {
705                 /* ttm_alloc_new_pages doesn't reference pool so we can run
706                  * multiple requests in parallel.
707                  **/
708                 r = ttm_alloc_new_pages(pages, gfp_flags, flags, cstate, count);
709                 if (r) {
710                         /* If there is any pages in the list put them back to
711                          * the pool. */
712                         printk(KERN_ERR "[ttm] Failed to allocate extra pages "
713                                         "for large request.");
714                         ttm_put_pages(pages, 0, flags, cstate);
715                         return r;
716                 }
717         }
718
719
720         return 0;
721 }
722
723 /* Put all pages in pages list to correct pool to wait for reuse */
724 void ttm_put_pages(struct list_head *pages, unsigned page_count, int flags,
725                 enum ttm_caching_state cstate)
726 {
727         unsigned long irq_flags;
728         struct ttm_page_pool *pool = ttm_get_pool(flags, cstate);
729         struct page *p, *tmp;
730
731         if (pool == NULL) {
732                 /* No pool for this memory type so free the pages */
733
734                 list_for_each_entry_safe(p, tmp, pages, lru) {
735                         __free_page(p);
736                 }
737                 /* Make the pages list empty */
738                 INIT_LIST_HEAD(pages);
739                 return;
740         }
741         if (page_count == 0) {
742                 list_for_each_entry_safe(p, tmp, pages, lru) {
743                         ++page_count;
744                 }
745         }
746
747         spin_lock_irqsave(&pool->lock, irq_flags);
748         list_splice_init(pages, &pool->list);
749         pool->npages += page_count;
750         /* Check that we don't go over the pool limit */
751         page_count = 0;
752         if (pool->npages > _manager.options.max_size) {
753                 page_count = pool->npages - _manager.options.max_size;
754                 /* free at least NUM_PAGES_TO_ALLOC number of pages
755                  * to reduce calls to set_memory_wb */
756                 if (page_count < NUM_PAGES_TO_ALLOC)
757                         page_count = NUM_PAGES_TO_ALLOC;
758         }
759         spin_unlock_irqrestore(&pool->lock, irq_flags);
760         if (page_count)
761                 ttm_page_pool_free(pool, page_count);
762 }
763
764 static void ttm_page_pool_init_locked(struct ttm_page_pool *pool, int flags,
765                 char *name)
766 {
767         spin_lock_init(&pool->lock);
768         pool->fill_lock = false;
769         INIT_LIST_HEAD(&pool->list);
770         pool->npages = pool->nfrees = 0;
771         pool->gfp_flags = flags;
772         pool->name = name;
773 }
774
775 int ttm_page_alloc_init(struct ttm_mem_global *glob, unsigned max_pages)
776 {
777         int ret;
778         if (atomic_add_return(1, &_manager.page_alloc_inited) > 1)
779                 return 0;
780
781         printk(KERN_INFO "[ttm] Initializing pool allocator.\n");
782
783         ttm_page_pool_init_locked(&_manager.wc_pool, GFP_HIGHUSER, "wc");
784
785         ttm_page_pool_init_locked(&_manager.uc_pool, GFP_HIGHUSER, "uc");
786
787         ttm_page_pool_init_locked(&_manager.wc_pool_dma32, GFP_USER | GFP_DMA32,
788                         "wc dma");
789
790         ttm_page_pool_init_locked(&_manager.uc_pool_dma32, GFP_USER | GFP_DMA32,
791                         "uc dma");
792
793         _manager.options.max_size = max_pages;
794         _manager.options.small = SMALL_ALLOCATION;
795         _manager.options.alloc_size = NUM_PAGES_TO_ALLOC;
796
797         kobject_init(&_manager.kobj, &ttm_pool_kobj_type);
798         ret = kobject_add(&_manager.kobj, &glob->kobj, "pool");
799         if (unlikely(ret != 0)) {
800                 kobject_put(&_manager.kobj);
801                 return ret;
802         }
803
804         ttm_pool_mm_shrink_init(&_manager);
805
806         return 0;
807 }
808
809 void ttm_page_alloc_fini()
810 {
811         int i;
812
813         if (atomic_sub_return(1, &_manager.page_alloc_inited) > 0)
814                 return;
815
816         printk(KERN_INFO "[ttm] Finilizing pool allocator.\n");
817         ttm_pool_mm_shrink_fini(&_manager);
818
819         for (i = 0; i < NUM_POOLS; ++i)
820                 ttm_page_pool_free(&_manager.pools[i], FREE_ALL_PAGES);
821
822         kobject_put(&_manager.kobj);
823 }
824
825 int ttm_page_alloc_debugfs(struct seq_file *m, void *data)
826 {
827         struct ttm_page_pool *p;
828         unsigned i;
829         char *h[] = {"pool", "refills", "pages freed", "size"};
830         if (atomic_read(&_manager.page_alloc_inited) == 0) {
831                 seq_printf(m, "No pool allocator running.\n");
832                 return 0;
833         }
834         seq_printf(m, "%6s %12s %13s %8s\n",
835                         h[0], h[1], h[2], h[3]);
836         for (i = 0; i < NUM_POOLS; ++i) {
837                 p = &_manager.pools[i];
838
839                 seq_printf(m, "%6s %12ld %13ld %8d\n",
840                                 p->name, p->nrefills,
841                                 p->nfrees, p->npages);
842         }
843         return 0;
844 }
845 EXPORT_SYMBOL(ttm_page_alloc_debugfs);