diff options
author | 2019-06-09 12:58:30 +0000 | |
---|---|---|
committer | 2019-06-09 12:58:30 +0000 | |
commit | 804f66499ed7f1bbdee115d5e61604e513a6050f (patch) | |
tree | 5cdc93dc96739eb614b608fc3d2c5bba098bfcbf | |
parent | Allow memory that isn't (32-bit) DMA reachable when loading a map that was (diff) | |
download | wireguard-openbsd-804f66499ed7f1bbdee115d5e61604e513a6050f.tar.xz wireguard-openbsd-804f66499ed7f1bbdee115d5e61604e513a6050f.zip |
Let drm(4) allocate memory without constraints if the hardware supports
64-bit DMA. Should reduce the pressure on DMA-reachable memory, which is
important since there are still cases where the pagedaemon ends up being
triggered continuously if we run out of DMA-reachable memory but have
plenty of memory left.
ok jsg@
-rw-r--r-- | sys/dev/pci/drm/drm_linux.c | 9 | ||||
-rw-r--r-- | sys/dev/pci/drm/include/linux/gfp.h | 25 | ||||
-rw-r--r-- | sys/dev/pci/drm/ttm/ttm_tt.c | 10 |
3 files changed, 27 insertions, 17 deletions
diff --git a/sys/dev/pci/drm/drm_linux.c b/sys/dev/pci/drm/drm_linux.c index f7a961c083d..0b86912cb72 100644 --- a/sys/dev/pci/drm/drm_linux.c +++ b/sys/dev/pci/drm/drm_linux.c @@ -1,4 +1,4 @@ -/* $OpenBSD: drm_linux.c,v 1.37 2019/06/04 12:08:22 jsg Exp $ */ +/* $OpenBSD: drm_linux.c,v 1.38 2019/06/09 12:58:30 kettenis Exp $ */ /* * Copyright (c) 2013 Jonathan Gray <jsg@openbsd.org> * Copyright (c) 2015, 2016 Mark Kettenis <kettenis@openbsd.org> @@ -293,16 +293,19 @@ struct vm_page * alloc_pages(unsigned int gfp_mask, unsigned int order) { int flags = (gfp_mask & M_NOWAIT) ? UVM_PLA_NOWAIT : UVM_PLA_WAITOK; + struct uvm_constraint_range *constraint = &no_constraint; struct pglist mlist; if (gfp_mask & M_CANFAIL) flags |= UVM_PLA_FAILOK; if (gfp_mask & M_ZERO) flags |= UVM_PLA_ZERO; + if (gfp_mask & __GFP_DMA32) + constraint = &dma_constraint; TAILQ_INIT(&mlist); - if (uvm_pglistalloc(PAGE_SIZE << order, dma_constraint.ucr_low, - dma_constraint.ucr_high, PAGE_SIZE, 0, &mlist, 1, flags)) + if (uvm_pglistalloc(PAGE_SIZE << order, constraint->ucr_low, + constraint->ucr_high, PAGE_SIZE, 0, &mlist, 1, flags)) return NULL; return TAILQ_FIRST(&mlist); } diff --git a/sys/dev/pci/drm/include/linux/gfp.h b/sys/dev/pci/drm/include/linux/gfp.h index d3dd930b285..dcffa2ef49d 100644 --- a/sys/dev/pci/drm/include/linux/gfp.h +++ b/sys/dev/pci/drm/include/linux/gfp.h @@ -7,24 +7,25 @@ #include <sys/malloc.h> #include <uvm/uvm_extern.h> -#define GFP_ATOMIC M_NOWAIT -#define GFP_NOWAIT M_NOWAIT -#define GFP_KERNEL (M_WAITOK | M_CANFAIL) -#define GFP_USER (M_WAITOK | M_CANFAIL) -#define GFP_TEMPORARY (M_WAITOK | M_CANFAIL) -#define GFP_HIGHUSER 0 -#define GFP_DMA32 0 -#define __GFP_NOWARN 0 -#define __GFP_NORETRY 0 -#define __GFP_ZERO M_ZERO +#define __GFP_ZERO M_ZERO +#define __GFP_DMA32 0x00010000 +#define __GFP_NOWARN 0 +#define __GFP_NORETRY 0 #define __GFP_RETRY_MAYFAIL 0 #define __GFP_MOVABLE 0 #define __GFP_COMP 0 -#define GFP_TRANSHUGE_LIGHT 0 #define __GFP_KSWAPD_RECLAIM 0 #define __GFP_HIGHMEM 0 #define __GFP_RECLAIMABLE 0 -#define __GFP_DMA32 0 + +#define GFP_ATOMIC M_NOWAIT +#define GFP_NOWAIT M_NOWAIT +#define GFP_KERNEL (M_WAITOK | M_CANFAIL) +#define GFP_USER (M_WAITOK | M_CANFAIL) +#define GFP_TEMPORARY (M_WAITOK | M_CANFAIL) +#define GFP_HIGHUSER 0 +#define GFP_DMA32 __GFP_DMA32 +#define GFP_TRANSHUGE_LIGHT 0 static inline bool gfpflags_allow_blocking(const unsigned int flags) diff --git a/sys/dev/pci/drm/ttm/ttm_tt.c b/sys/dev/pci/drm/ttm/ttm_tt.c index 4acb4ce5052..ece237259d8 100644 --- a/sys/dev/pci/drm/ttm/ttm_tt.c +++ b/sys/dev/pci/drm/ttm/ttm_tt.c @@ -261,6 +261,7 @@ int ttm_dma_tt_init(struct ttm_dma_tt *ttm_dma, struct ttm_buffer_object *bo, uint32_t page_flags) { struct ttm_tt *ttm = &ttm_dma->ttm; + int flags = BUS_DMA_WAITOK; ttm_tt_init_fields(ttm, bo, page_flags); @@ -276,8 +277,10 @@ int ttm_dma_tt_init(struct ttm_dma_tt *ttm_dma, struct ttm_buffer_object *bo, ttm_dma->dmat = bo->bdev->dmat; + if ((page_flags & TTM_PAGE_FLAG_DMA32) == 0) + flags |= BUS_DMA_64BIT; if (bus_dmamap_create(ttm_dma->dmat, ttm->num_pages << PAGE_SHIFT, - ttm->num_pages, ttm->num_pages << PAGE_SHIFT, 0, BUS_DMA_WAITOK, + ttm->num_pages, ttm->num_pages << PAGE_SHIFT, 0, flags, &ttm_dma->map)) { free(ttm_dma->segs, M_DRM, 0); ttm_tt_destroy(ttm); @@ -293,6 +296,7 @@ int ttm_sg_tt_init(struct ttm_dma_tt *ttm_dma, struct ttm_buffer_object *bo, uint32_t page_flags) { struct ttm_tt *ttm = &ttm_dma->ttm; + int flags = BUS_DMA_WAITOK; int ret; ttm_tt_init_fields(ttm, bo, page_flags); @@ -313,8 +317,10 @@ int ttm_sg_tt_init(struct ttm_dma_tt *ttm_dma, struct ttm_buffer_object *bo, ttm_dma->dmat = bo->bdev->dmat; + if ((page_flags & TTM_PAGE_FLAG_DMA32) == 0) + flags |= BUS_DMA_64BIT; if (bus_dmamap_create(ttm_dma->dmat, ttm->num_pages << PAGE_SHIFT, - ttm->num_pages, ttm->num_pages << PAGE_SHIFT, 0, BUS_DMA_WAITOK, + ttm->num_pages, ttm->num_pages << PAGE_SHIFT, 0, flags, &ttm_dma->map)) { free(ttm_dma->segs, M_DRM, 0); ttm_tt_destroy(ttm); |