Lines Matching refs:glob
38 struct ttm_mem_global *glob; member
65 mtx_lock(&zone->glob->lock);
76 mtx_unlock(&zone->glob->lock);
83 static void ttm_check_swapping(struct ttm_mem_global *glob);
103 mtx_lock(&zone->glob->lock);
116 mtx_unlock(&zone->glob->lock);
118 ttm_check_swapping(zone->glob);
124 static void ttm_mem_global_kobj_release(struct ttm_mem_global *glob) in ttm_mem_global_kobj_release() argument
128 static bool ttm_zones_above_swap_target(struct ttm_mem_global *glob, in ttm_zones_above_swap_target() argument
135 for (i = 0; i < glob->num_zones; ++i) { in ttm_zones_above_swap_target()
136 zone = glob->zones[i]; in ttm_zones_above_swap_target()
160 static void ttm_shrink(struct ttm_mem_global *glob, bool from_wq, in ttm_shrink() argument
166 mtx_lock(&glob->lock); in ttm_shrink()
167 if (glob->shrink == NULL) in ttm_shrink()
170 while (ttm_zones_above_swap_target(glob, from_wq, extra)) { in ttm_shrink()
171 shrink = glob->shrink; in ttm_shrink()
172 mtx_unlock(&glob->lock); in ttm_shrink()
174 mtx_lock(&glob->lock); in ttm_shrink()
179 mtx_unlock(&glob->lock); in ttm_shrink()
186 struct ttm_mem_global *glob = arg; in ttm_shrink_work() local
188 ttm_shrink(glob, true, 0ULL); in ttm_shrink_work()
191 static int ttm_mem_init_kernel_zone(struct ttm_mem_global *glob, in ttm_mem_init_kernel_zone() argument
204 zone->glob = glob; in ttm_mem_init_kernel_zone()
205 glob->zone_kernel = zone; in ttm_mem_init_kernel_zone()
207 glob->zones[glob->num_zones++] = zone; in ttm_mem_init_kernel_zone()
211 static int ttm_mem_init_dma32_zone(struct ttm_mem_global *glob, in ttm_mem_init_dma32_zone() argument
240 zone->glob = glob; in ttm_mem_init_dma32_zone()
241 glob->zone_dma32 = zone; in ttm_mem_init_dma32_zone()
243 glob->zones[glob->num_zones++] = zone; in ttm_mem_init_dma32_zone()
247 int ttm_mem_global_init(struct ttm_mem_global *glob) in ttm_mem_global_init() argument
254 mtx_init(&glob->lock, "ttmgz", NULL, MTX_DEF); in ttm_mem_global_init()
255 glob->swap_queue = taskqueue_create("ttm_swap", M_WAITOK, in ttm_mem_global_init()
256 taskqueue_thread_enqueue, &glob->swap_queue); in ttm_mem_global_init()
257 taskqueue_start_threads(&glob->swap_queue, 1, PVM, "ttm swap"); in ttm_mem_global_init()
258 TASK_INIT(&glob->work, 0, ttm_shrink_work, glob); in ttm_mem_global_init()
260 refcount_init(&glob->kobj_ref, 1); in ttm_mem_global_init()
264 ret = ttm_mem_init_kernel_zone(glob, mem); in ttm_mem_global_init()
267 ret = ttm_mem_init_dma32_zone(glob, mem); in ttm_mem_global_init()
270 for (i = 0; i < glob->num_zones; ++i) { in ttm_mem_global_init()
271 zone = glob->zones[i]; in ttm_mem_global_init()
275 ttm_page_alloc_init(glob, glob->zone_kernel->max_mem/(2*PAGE_SIZE)); in ttm_mem_global_init()
276 ttm_dma_page_alloc_init(glob, glob->zone_kernel->max_mem/(2*PAGE_SIZE)); in ttm_mem_global_init()
279 ttm_mem_global_release(glob); in ttm_mem_global_init()
283 void ttm_mem_global_release(struct ttm_mem_global *glob) in ttm_mem_global_release() argument
292 taskqueue_drain(glob->swap_queue, &glob->work); in ttm_mem_global_release()
293 taskqueue_free(glob->swap_queue); in ttm_mem_global_release()
294 glob->swap_queue = NULL; in ttm_mem_global_release()
295 for (i = 0; i < glob->num_zones; ++i) { in ttm_mem_global_release()
296 zone = glob->zones[i]; in ttm_mem_global_release()
300 if (refcount_release(&glob->kobj_ref)) in ttm_mem_global_release()
301 ttm_mem_global_kobj_release(glob); in ttm_mem_global_release()
304 static void ttm_check_swapping(struct ttm_mem_global *glob) in ttm_check_swapping() argument
310 mtx_lock(&glob->lock); in ttm_check_swapping()
311 for (i = 0; i < glob->num_zones; ++i) { in ttm_check_swapping()
312 zone = glob->zones[i]; in ttm_check_swapping()
319 mtx_unlock(&glob->lock); in ttm_check_swapping()
322 taskqueue_enqueue(glob->swap_queue, &glob->work); in ttm_check_swapping()
326 static void ttm_mem_global_free_zone(struct ttm_mem_global *glob, in ttm_mem_global_free_zone() argument
333 mtx_lock(&glob->lock); in ttm_mem_global_free_zone()
334 for (i = 0; i < glob->num_zones; ++i) { in ttm_mem_global_free_zone()
335 zone = glob->zones[i]; in ttm_mem_global_free_zone()
340 mtx_unlock(&glob->lock); in ttm_mem_global_free_zone()
343 void ttm_mem_global_free(struct ttm_mem_global *glob, in ttm_mem_global_free() argument
346 return ttm_mem_global_free_zone(glob, NULL, amount); in ttm_mem_global_free()
349 static int ttm_mem_global_reserve(struct ttm_mem_global *glob, in ttm_mem_global_reserve() argument
358 mtx_lock(&glob->lock); in ttm_mem_global_reserve()
359 for (i = 0; i < glob->num_zones; ++i) { in ttm_mem_global_reserve()
360 zone = glob->zones[i]; in ttm_mem_global_reserve()
372 for (i = 0; i < glob->num_zones; ++i) { in ttm_mem_global_reserve()
373 zone = glob->zones[i]; in ttm_mem_global_reserve()
382 mtx_unlock(&glob->lock); in ttm_mem_global_reserve()
383 ttm_check_swapping(glob); in ttm_mem_global_reserve()
389 static int ttm_mem_global_alloc_zone(struct ttm_mem_global *glob, in ttm_mem_global_alloc_zone() argument
396 while (unlikely(ttm_mem_global_reserve(glob, in ttm_mem_global_alloc_zone()
404 ttm_shrink(glob, false, memory + (memory >> 2) + 16); in ttm_mem_global_alloc_zone()
410 int ttm_mem_global_alloc(struct ttm_mem_global *glob, uint64_t memory, in ttm_mem_global_alloc() argument
418 return ttm_mem_global_alloc_zone(glob, NULL, memory, no_wait, in ttm_mem_global_alloc()
424 int ttm_mem_global_alloc_page(struct ttm_mem_global *glob, in ttm_mem_global_alloc_page() argument
436 if (glob->zone_dma32 && page_to_pfn(page) > 0x00100000UL) in ttm_mem_global_alloc_page()
437 zone = glob->zone_kernel; in ttm_mem_global_alloc_page()
438 return ttm_mem_global_alloc_zone(glob, zone, PAGE_SIZE, no_wait, in ttm_mem_global_alloc_page()
442 void ttm_mem_global_free_page(struct ttm_mem_global *glob, struct vm_page *page) in ttm_mem_global_free_page() argument
446 if (glob->zone_dma32 && page_to_pfn(page) > 0x00100000UL) in ttm_mem_global_free_page()
447 zone = glob->zone_kernel; in ttm_mem_global_free_page()
448 ttm_mem_global_free_zone(glob, zone, PAGE_SIZE); in ttm_mem_global_free_page()