diff --git a/drivers/video/tegra/nvmap/nvmap_dmabuf.c b/drivers/video/tegra/nvmap/nvmap_dmabuf.c index b979e46f..bd0c5c11 100644 --- a/drivers/video/tegra/nvmap/nvmap_dmabuf.c +++ b/drivers/video/tegra/nvmap/nvmap_dmabuf.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * SPDX-FileCopyrightText: Copyright (c) 2012-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2012-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. * * dma_buf exporter for nvmap */ @@ -410,6 +410,7 @@ static int __nvmap_map(struct nvmap_handle *h, struct vm_area_struct *vma) nvmap_handle_put(h); return -ENOMEM; } + mutex_init(&priv->vma_lock); priv->handle = h; #if defined(NV_VM_AREA_STRUCT_HAS_CONST_VM_FLAGS) /* Linux v6.3 */ diff --git a/drivers/video/tegra/nvmap/nvmap_dmabuf.h b/drivers/video/tegra/nvmap/nvmap_dmabuf.h index 86d38e4a..2d48e258 100644 --- a/drivers/video/tegra/nvmap/nvmap_dmabuf.h +++ b/drivers/video/tegra/nvmap/nvmap_dmabuf.h @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: GPL-2.0-only */ -/* SPDX-FileCopyrightText: Copyright (c) 2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. */ +/* SPDX-FileCopyrightText: Copyright (c) 2024-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. */ #ifndef __NVMAP_DMABUF_H #define __NVMAP_DMABUF_H @@ -54,6 +54,9 @@ struct nvmap_vma_priv { struct nvmap_handle *handle; size_t offs; atomic_t count; /* number of processes cloning the VMA */ + u64 map_rss_count; + struct mm_struct *mm; + struct mutex vma_lock; }; int is_nvmap_vma(struct vm_area_struct *vma); diff --git a/drivers/video/tegra/nvmap/nvmap_fault.c b/drivers/video/tegra/nvmap/nvmap_fault.c index 78710da2..dc06f9f4 100644 --- a/drivers/video/tegra/nvmap/nvmap_fault.c +++ b/drivers/video/tegra/nvmap/nvmap_fault.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * SPDX-FileCopyrightText: Copyright (c) 2011-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2011-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. */ #define pr_fmt(fmt) "%s: " fmt, __func__ @@ -145,6 +145,14 @@ static void nvmap_vma_close(struct vm_area_struct *vma) BUG_ON(!vma_found); nvmap_umaps_dec(h); + mutex_lock(&priv->vma_lock); + if (priv->mm != NULL && h->anon_count != 0) { + nvmap_add_mm_counter(priv->mm, MM_ANONPAGES, priv->map_rss_count); + priv->map_rss_count = 0; + priv->mm = NULL; + } + mutex_unlock(&priv->vma_lock); + if (__atomic_add_unless(&priv->count, -1, 0) == 1) { if (h->heap_pgalloc) { for (i = 0; i < nr_page; i++) { @@ -220,6 +228,14 @@ static vm_fault_t nvmap_vma_fault(struct vm_fault *vmf) return VM_FAULT_SIGSEGV; } + mutex_lock(&priv->vma_lock); + if (priv->handle->anon_count != 0 && current->mm != NULL) { + nvmap_add_mm_counter(current->mm, MM_ANONPAGES, -1); + priv->map_rss_count++; + priv->mm = current->mm; + } + mutex_unlock(&priv->vma_lock); + if (!nvmap_handle_track_dirty(priv->handle)) goto finish; mutex_lock(&priv->handle->lock);