Am 08.02.2018 um 10:05 schrieb Roger He: > set TTM_OPT_FLAG_FORCE_ALLOC when we are servicing for page > fault routine. > > for ttm_mem_global_reserve if in page fault routine, allow the gtt > pages reservation always. because page fault routing already grabbed > system memory and the allowance of this exception is harmless. > Otherwise, it will trigger OOM killer. > > the subsequent patche will use this. > > v2: keep original behavior except ttm bo with flag no_retry > > Signed-off-by: Roger He <Hongbo.He at amd.com> > --- > drivers/gpu/drm/ttm/ttm_bo_vm.c | 6 ++++-- > drivers/gpu/drm/ttm/ttm_page_alloc_dma.c | 1 - > include/drm/ttm/ttm_bo_api.h | 4 +++- > 3 files changed, 7 insertions(+), 4 deletions(-) > > diff --git a/drivers/gpu/drm/ttm/ttm_bo_vm.c b/drivers/gpu/drm/ttm/ttm_bo_vm.c > index 716e724..f10b8a0 100644 > --- a/drivers/gpu/drm/ttm/ttm_bo_vm.c > +++ b/drivers/gpu/drm/ttm/ttm_bo_vm.c > @@ -224,7 +224,7 @@ static int ttm_bo_vm_fault(struct vm_fault *vmf) > cvma.vm_page_prot = ttm_io_prot(bo->mem.placement, > cvma.vm_page_prot); > } else { > - struct ttm_operation_ctx ctx = { > + struct ttm_operation_ctx ttm_opt_ctx = { > .interruptible = false, > .no_wait_gpu = false > }; > @@ -233,8 +233,10 @@ static int ttm_bo_vm_fault(struct vm_fault *vmf) > cvma.vm_page_prot = ttm_io_prot(bo->mem.placement, > cvma.vm_page_prot); > > + if (ttm->page_flags & TTM_PAGE_FLAG_NO_RETRY) > + ttm_opt_ctx.flags |= TTM_OPT_FLAG_FORCE_ALLOC; Can't we always set the TTM_OPT_FLAG_FORCE_ALLOC flag here? I don't see a reason why we should ever not set it. Christian. > /* Allocate all page at once, most common usage */ > - if (ttm->bdev->driver->ttm_tt_populate(ttm, &ctx)) { > + if (ttm->bdev->driver->ttm_tt_populate(ttm, &ttm_opt_ctx)) { > ret = VM_FAULT_OOM; > goto out_io_unlock; > } > diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c > index b122f6e..354e0e1 100644 > --- a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c > +++ b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c > @@ -944,7 +944,6 @@ int ttm_dma_populate(struct ttm_dma_tt *ttm_dma, struct device *dev, > i = 0; > > type = ttm_to_type(ttm->page_flags, ttm->caching_state); > - > #ifdef CONFIG_TRANSPARENT_HUGEPAGE > if (ttm->page_flags & TTM_PAGE_FLAG_DMA32) > goto skip_huge; > diff --git a/include/drm/ttm/ttm_bo_api.h b/include/drm/ttm/ttm_bo_api.h > index 872ff6c..2142639 100644 > --- a/include/drm/ttm/ttm_bo_api.h > +++ b/include/drm/ttm/ttm_bo_api.h > @@ -278,7 +278,9 @@ struct ttm_operation_ctx { > }; > > /* Allow eviction of reserved BOs */ > -#define TTM_OPT_FLAG_ALLOW_RES_EVICT 0x1 > +#define TTM_OPT_FLAG_ALLOW_RES_EVICT 0x1 > +/* when serving page fault or suspend, allow alloc anyway */ > +#define TTM_OPT_FLAG_FORCE_ALLOC 0x2 > > /** > * ttm_bo_reference - reference a struct ttm_buffer_object