If the vm_page_alloc_contig() failed in the ttm page allocators, do
what other callers of vm_page_alloc_contig() do, retry after vm_pageout_grow_cache(). Sponsored by: The FreeBSD Foundation
This commit is contained in:
parent
668259c84d
commit
98173b7fa7
@ -35,6 +35,7 @@ __FBSDID("$FreeBSD$");
|
|||||||
#include <dev/drm2/ttm/ttm_module.h>
|
#include <dev/drm2/ttm/ttm_module.h>
|
||||||
#include <dev/drm2/ttm/ttm_bo_driver.h>
|
#include <dev/drm2/ttm/ttm_bo_driver.h>
|
||||||
#include <dev/drm2/ttm/ttm_placement.h>
|
#include <dev/drm2/ttm/ttm_placement.h>
|
||||||
|
#include <vm/vm_pageout.h>
|
||||||
|
|
||||||
#define TTM_ASSERT_LOCKED(param)
|
#define TTM_ASSERT_LOCKED(param)
|
||||||
#define TTM_DEBUG(fmt, arg...)
|
#define TTM_DEBUG(fmt, arg...)
|
||||||
@ -1489,15 +1490,23 @@ int ttm_bo_global_init(struct drm_global_reference *ref)
|
|||||||
container_of(ref, struct ttm_bo_global_ref, ref);
|
container_of(ref, struct ttm_bo_global_ref, ref);
|
||||||
struct ttm_bo_global *glob = ref->object;
|
struct ttm_bo_global *glob = ref->object;
|
||||||
int ret;
|
int ret;
|
||||||
|
int tries;
|
||||||
|
|
||||||
sx_init(&glob->device_list_mutex, "ttmdlm");
|
sx_init(&glob->device_list_mutex, "ttmdlm");
|
||||||
mtx_init(&glob->lru_lock, "ttmlru", NULL, MTX_DEF);
|
mtx_init(&glob->lru_lock, "ttmlru", NULL, MTX_DEF);
|
||||||
glob->mem_glob = bo_ref->mem_glob;
|
glob->mem_glob = bo_ref->mem_glob;
|
||||||
|
tries = 0;
|
||||||
|
retry:
|
||||||
glob->dummy_read_page = vm_page_alloc_contig(NULL, 0,
|
glob->dummy_read_page = vm_page_alloc_contig(NULL, 0,
|
||||||
VM_ALLOC_NORMAL | VM_ALLOC_NOOBJ,
|
VM_ALLOC_NORMAL | VM_ALLOC_NOOBJ,
|
||||||
1, 0, VM_MAX_ADDRESS, PAGE_SIZE, 0, VM_MEMATTR_UNCACHEABLE);
|
1, 0, VM_MAX_ADDRESS, PAGE_SIZE, 0, VM_MEMATTR_UNCACHEABLE);
|
||||||
|
|
||||||
if (unlikely(glob->dummy_read_page == NULL)) {
|
if (unlikely(glob->dummy_read_page == NULL)) {
|
||||||
|
if (tries < 1) {
|
||||||
|
vm_pageout_grow_cache(tries, 0, VM_MAX_ADDRESS);
|
||||||
|
tries++;
|
||||||
|
goto retry;
|
||||||
|
}
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto out_no_drp;
|
goto out_no_drp;
|
||||||
}
|
}
|
||||||
|
@ -44,6 +44,7 @@ __FBSDID("$FreeBSD$");
|
|||||||
#include <dev/drm2/drmP.h>
|
#include <dev/drm2/drmP.h>
|
||||||
#include <dev/drm2/ttm/ttm_bo_driver.h>
|
#include <dev/drm2/ttm/ttm_bo_driver.h>
|
||||||
#include <dev/drm2/ttm/ttm_page_alloc.h>
|
#include <dev/drm2/ttm/ttm_page_alloc.h>
|
||||||
|
#include <vm/vm_pageout.h>
|
||||||
|
|
||||||
#define NUM_PAGES_TO_ALLOC (PAGE_SIZE/sizeof(vm_page_t))
|
#define NUM_PAGES_TO_ALLOC (PAGE_SIZE/sizeof(vm_page_t))
|
||||||
#define SMALL_ALLOCATION 16
|
#define SMALL_ALLOCATION 16
|
||||||
@ -460,6 +461,14 @@ static void ttm_handle_caching_state_failure(struct pglist *pages,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static vm_paddr_t
|
||||||
|
ttm_alloc_high_bound(int ttm_alloc_flags)
|
||||||
|
{
|
||||||
|
|
||||||
|
return ((ttm_alloc_flags & TTM_PAGE_FLAG_DMA32) ? 0xffffffff :
|
||||||
|
VM_MAX_ADDRESS);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allocate new pages with correct caching.
|
* Allocate new pages with correct caching.
|
||||||
*
|
*
|
||||||
@ -475,6 +484,7 @@ static int ttm_alloc_new_pages(struct pglist *pages, int ttm_alloc_flags,
|
|||||||
unsigned i, cpages, aflags;
|
unsigned i, cpages, aflags;
|
||||||
unsigned max_cpages = min(count,
|
unsigned max_cpages = min(count,
|
||||||
(unsigned)(PAGE_SIZE/sizeof(vm_page_t)));
|
(unsigned)(PAGE_SIZE/sizeof(vm_page_t)));
|
||||||
|
int tries;
|
||||||
|
|
||||||
aflags = VM_ALLOC_NORMAL | VM_ALLOC_WIRED | VM_ALLOC_NOOBJ |
|
aflags = VM_ALLOC_NORMAL | VM_ALLOC_WIRED | VM_ALLOC_NOOBJ |
|
||||||
((ttm_alloc_flags & TTM_PAGE_FLAG_ZERO_ALLOC) != 0 ?
|
((ttm_alloc_flags & TTM_PAGE_FLAG_ZERO_ALLOC) != 0 ?
|
||||||
@ -485,11 +495,18 @@ static int ttm_alloc_new_pages(struct pglist *pages, int ttm_alloc_flags,
|
|||||||
M_WAITOK | M_ZERO);
|
M_WAITOK | M_ZERO);
|
||||||
|
|
||||||
for (i = 0, cpages = 0; i < count; ++i) {
|
for (i = 0, cpages = 0; i < count; ++i) {
|
||||||
|
tries = 0;
|
||||||
|
retry:
|
||||||
p = vm_page_alloc_contig(NULL, 0, aflags, 1, 0,
|
p = vm_page_alloc_contig(NULL, 0, aflags, 1, 0,
|
||||||
(ttm_alloc_flags & TTM_PAGE_FLAG_DMA32) ? 0xffffffff :
|
ttm_alloc_high_bound(ttm_alloc_flags),
|
||||||
VM_MAX_ADDRESS, PAGE_SIZE, 0,
|
PAGE_SIZE, 0, ttm_caching_state_to_vm(cstate));
|
||||||
ttm_caching_state_to_vm(cstate));
|
|
||||||
if (!p) {
|
if (!p) {
|
||||||
|
if (tries < 3) {
|
||||||
|
vm_pageout_grow_cache(tries, 0,
|
||||||
|
ttm_alloc_high_bound(ttm_alloc_flags));
|
||||||
|
tries++;
|
||||||
|
goto retry;
|
||||||
|
}
|
||||||
printf("[TTM] Unable to get page %u\n", i);
|
printf("[TTM] Unable to get page %u\n", i);
|
||||||
|
|
||||||
/* store already allocated pages in the pool after
|
/* store already allocated pages in the pool after
|
||||||
@ -691,6 +708,7 @@ static int ttm_get_pages(vm_page_t *pages, unsigned npages, int flags,
|
|||||||
int gfp_flags, aflags;
|
int gfp_flags, aflags;
|
||||||
unsigned count;
|
unsigned count;
|
||||||
int r;
|
int r;
|
||||||
|
int tries;
|
||||||
|
|
||||||
aflags = VM_ALLOC_NORMAL | VM_ALLOC_NOOBJ | VM_ALLOC_WIRED |
|
aflags = VM_ALLOC_NORMAL | VM_ALLOC_NOOBJ | VM_ALLOC_WIRED |
|
||||||
((flags & TTM_PAGE_FLAG_ZERO_ALLOC) != 0 ? VM_ALLOC_ZERO : 0);
|
((flags & TTM_PAGE_FLAG_ZERO_ALLOC) != 0 ? VM_ALLOC_ZERO : 0);
|
||||||
@ -698,11 +716,18 @@ static int ttm_get_pages(vm_page_t *pages, unsigned npages, int flags,
|
|||||||
/* No pool for cached pages */
|
/* No pool for cached pages */
|
||||||
if (pool == NULL) {
|
if (pool == NULL) {
|
||||||
for (r = 0; r < npages; ++r) {
|
for (r = 0; r < npages; ++r) {
|
||||||
|
tries = 0;
|
||||||
|
retry:
|
||||||
p = vm_page_alloc_contig(NULL, 0, aflags, 1, 0,
|
p = vm_page_alloc_contig(NULL, 0, aflags, 1, 0,
|
||||||
(flags & TTM_PAGE_FLAG_DMA32) ? 0xffffffff :
|
ttm_alloc_high_bound(flags), PAGE_SIZE,
|
||||||
VM_MAX_ADDRESS, PAGE_SIZE,
|
|
||||||
0, ttm_caching_state_to_vm(cstate));
|
0, ttm_caching_state_to_vm(cstate));
|
||||||
if (!p) {
|
if (!p) {
|
||||||
|
if (tries < 3) {
|
||||||
|
vm_pageout_grow_cache(tries, 0,
|
||||||
|
ttm_alloc_high_bound(flags));
|
||||||
|
tries++;
|
||||||
|
goto retry;
|
||||||
|
}
|
||||||
printf("[TTM] Unable to allocate page\n");
|
printf("[TTM] Unable to allocate page\n");
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user