summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkettenis <kettenis@openbsd.org>2019-06-09 12:58:30 +0000
committerkettenis <kettenis@openbsd.org>2019-06-09 12:58:30 +0000
commit804f66499ed7f1bbdee115d5e61604e513a6050f (patch)
tree5cdc93dc96739eb614b608fc3d2c5bba098bfcbf
parentAllow memory that isn't (32-bit) DMA reachable when loading a map that was (diff)
downloadwireguard-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.c9
-rw-r--r--sys/dev/pci/drm/include/linux/gfp.h25
-rw-r--r--sys/dev/pci/drm/ttm/ttm_tt.c10
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);