Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 134fdc1a authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau/core/mm: replace region list with next pointer



We never have any need for a double-linked list here, and as there's
generally a large number of these objects, replace it with a single-
linked list in order to save some memory.

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 04b88677
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -5,7 +5,7 @@
struct nvkm_mm_node {
	struct list_head nl_entry;
	struct list_head fl_entry;
	struct list_head rl_entry;
	struct nvkm_mm_node *next;

#define NVKM_MM_HEAP_ANY 0x00
	u8  heap;
@@ -38,4 +38,10 @@ int nvkm_mm_tail(struct nvkm_mm *, u8 heap, u8 type, u32 size_max,
		  u32 size_min, u32 align, struct nvkm_mm_node **);
void nvkm_mm_free(struct nvkm_mm *, struct nvkm_mm_node **);
void nvkm_mm_dump(struct nvkm_mm *, const char *);

static inline bool
nvkm_mm_contiguous(struct nvkm_mm_node *node)
{
	return !node->next;
}
#endif
+1 −1
Original line number Diff line number Diff line
@@ -29,7 +29,7 @@ struct nvkm_mem {
	u8  page_shift;

	struct nvkm_mm_node *tag;
	struct list_head regions;
	struct nvkm_mm_node *mem;
	dma_addr_t *pages;
	u32 memtype;
	u64 offset;
+1 −1
Original line number Diff line number Diff line
@@ -321,7 +321,7 @@ nouveau_bo_pin(struct nouveau_bo *nvbo, uint32_t memtype, bool contig)
		if (nvbo->tile_flags & NOUVEAU_GEM_TILE_NONCONTIG) {
			if (bo->mem.mem_type == TTM_PL_VRAM) {
				struct nvkm_mem *mem = bo->mem.mm_node;
				if (!list_is_singular(&mem->regions))
				if (!nvkm_mm_contiguous(mem->mem))
					evict = true;
			}
			nvbo->tile_flags &= ~NOUVEAU_GEM_TILE_NONCONTIG;
+2 −0
Original line number Diff line number Diff line
@@ -147,6 +147,7 @@ nvkm_mm_head(struct nvkm_mm *mm, u8 heap, u8 type, u32 size_max, u32 size_min,
		if (!this)
			return -ENOMEM;

		this->next = NULL;
		this->type = type;
		list_del(&this->fl_entry);
		*pnode = this;
@@ -225,6 +226,7 @@ nvkm_mm_tail(struct nvkm_mm *mm, u8 heap, u8 type, u32 size_max, u32 size_min,
		if (!this)
			return -ENOMEM;

		this->next = NULL;
		this->type = type;
		list_del(&this->fl_entry);
		*pnode = this;
+5 −5
Original line number Diff line number Diff line
@@ -445,7 +445,7 @@ gf100_ram_get(struct nvkm_ram *ram, u64 size, u32 align, u32 ncmin,
{
	struct nvkm_ltc *ltc = ram->fb->subdev.device->ltc;
	struct nvkm_mm *mm = &ram->vram;
	struct nvkm_mm_node *r;
	struct nvkm_mm_node **node, *r;
	struct nvkm_mem *mem;
	int type = (memtype & 0x0ff);
	int back = (memtype & 0x800);
@@ -462,7 +462,6 @@ gf100_ram_get(struct nvkm_ram *ram, u64 size, u32 align, u32 ncmin,
	if (!mem)
		return -ENOMEM;

	INIT_LIST_HEAD(&mem->regions);
	mem->size = size;

	mutex_lock(&ram->fb->subdev.mutex);
@@ -478,6 +477,7 @@ gf100_ram_get(struct nvkm_ram *ram, u64 size, u32 align, u32 ncmin,
	}
	mem->memtype = type;

	node = &mem->mem;
	do {
		if (back)
			ret = nvkm_mm_tail(mm, 0, 1, size, ncmin, align, &r);
@@ -489,13 +489,13 @@ gf100_ram_get(struct nvkm_ram *ram, u64 size, u32 align, u32 ncmin,
			return ret;
		}

		list_add_tail(&r->rl_entry, &mem->regions);
		*node = r;
		node = &r->next;
		size -= r->length;
	} while (size);
	mutex_unlock(&ram->fb->subdev.mutex);

	r = list_first_entry(&mem->regions, struct nvkm_mm_node, rl_entry);
	mem->offset = (u64)r->offset << NVKM_RAM_MM_SHIFT;
	mem->offset = (u64)mem->mem->offset << NVKM_RAM_MM_SHIFT;
	*pmem = mem;
	return 0;
}
Loading