From d71a4d73b85ea9f0d97dbdd84125fad5e4e3447e Mon Sep 17 00:00:00 2001 From: Karol Herbst Date: Wed, 1 Jun 2022 01:03:57 +0200 Subject: [PATCH] novueau/bo: refcount it Part-of: --- src/nouveau/winsys/nouveau_bo.c | 4 ++++ src/nouveau/winsys/nouveau_bo.h | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/src/nouveau/winsys/nouveau_bo.c b/src/nouveau/winsys/nouveau_bo.c index 10e67cd7e65..d9b4044b26f 100644 --- a/src/nouveau/winsys/nouveau_bo.c +++ b/src/nouveau/winsys/nouveau_bo.c @@ -42,6 +42,7 @@ nouveau_ws_bo_new(struct nouveau_ws_device *dev, uint64_t size, uint64_t align, bo->map_handle = req.info.map_handle; bo->fd = pdev->fd; bo->flags = flags; + bo->refcnt = 1; return bo; } @@ -49,6 +50,9 @@ nouveau_ws_bo_new(struct nouveau_ws_device *dev, uint64_t size, uint64_t align, void nouveau_ws_bo_destroy(struct nouveau_ws_bo *bo) { + if (--bo->refcnt) + return; + drmCloseBufferHandle(bo->fd, bo->handle); FREE(bo); } diff --git a/src/nouveau/winsys/nouveau_bo.h b/src/nouveau/winsys/nouveau_bo.h index 9d62f7a44d9..55cca39b5a8 100644 --- a/src/nouveau/winsys/nouveau_bo.h +++ b/src/nouveau/winsys/nouveau_bo.h @@ -25,10 +25,17 @@ struct nouveau_ws_bo { int fd; uint32_t handle; enum nouveau_ws_bo_flags flags; + _Atomic uint32_t refcnt; }; struct nouveau_ws_bo *nouveau_ws_bo_new(struct nouveau_ws_device *, uint64_t size, uint64_t align, enum nouveau_ws_bo_flags); void nouveau_ws_bo_destroy(struct nouveau_ws_bo *); void *nouveau_ws_bo_map(struct nouveau_ws_bo *, enum nouveau_ws_bo_map_flags); +static inline void +nouveau_ws_bo_ref(struct nouveau_ws_bo *bo) +{ + bo->refcnt++; +} + #endif