595.71.05

This commit is contained in:
Andy Ritger
2026-04-28 08:55:30 -07:00
parent db0c4e65c8
commit 51edebee79
47 changed files with 48117 additions and 47816 deletions

View File

@@ -129,10 +129,8 @@ nvidia_vma_access(
nv_alloc_mapping_list_node_t **pfile_mapping_list = NULL;
nv_alloc_mapping_context_t *mmap_context = NULL;
NvU64 offsInVma = addr - vma->vm_start;
NvBool bIsNuma = NV_FALSE;
int ret = -EINVAL;
bIsNuma = pfn_valid(mmap_context->access_start >> PAGE_SHIFT);
NvBool has_pages;
pageIndex = (offsInVma >> PAGE_SHIFT);
pageOffset = (offsInVma & ~PAGE_MASK);
@@ -152,6 +150,8 @@ nvidia_vma_access(
mmap_context = &(*pfile_mapping_list)->context;
has_pages = (mmap_context->num_pages != 0);
if (write && !(mmap_context->prot & NV_PROTECT_WRITEABLE))
{
ret = -EACCES;
@@ -180,7 +180,7 @@ nvidia_vma_access(
pageIndex = nv_array_index_no_speculate(pageIndex, at->num_pages);
kernel_mapping = (void *)(at->page_table[pageIndex].virt_addr + pageOffset);
}
else if (bIsNuma)
else if (has_pages)
{
struct page *pPage = NV_GET_PAGE_STRUCT(mmap_context->page_array[pageIndex]);
NvU8 *pPagePtr = (NvU8 *) page_address(pPage);
@@ -230,7 +230,7 @@ found:
memcpy(buffer, kernel_mapping, length);
#endif // defined(NVCPU_AARCH64)
if (at == NULL && !bIsNuma)
if (at == NULL && !has_pages)
{
kernel_mapping = ((char *)kernel_mapping - pageOffset);
os_unmap_kernel_space(kernel_mapping, PAGE_SIZE);

View File

@@ -104,6 +104,11 @@ NV_STATUS NV_API_CALL nv_add_mapping_context_to_file(
if (*pfile_mapping_list == NULL)
{
*pfile_mapping_list = pNewNode;
if (NV_IS_CTL_DEVICE(nv))
{
nv_alloc_t *at = (nv_alloc_t *) nvamc->alloc;
atomic64_inc(&at->usage_count);
}
}
else
{

View File

@@ -121,6 +121,7 @@ MODULE_LICENSE("Dual MIT/GPL");
MODULE_INFO(supported, "external");
MODULE_VERSION(NV_VERSION_STRING);
MODULE_DESCRIPTION("NVIDIA core GPU kernel module");
MODULE_ALIAS_CHARDEV_MAJOR(NV_MAJOR_DEVICE_NUMBER);
/*
@@ -3213,6 +3214,20 @@ nvidia_ctl_close(
rm_cleanup_file_private(sp, nv, &nvlfp->nvfp);
// Populate free list from file nodes
{
nv_alloc_mapping_list_node_t *pNode = nvlfp->file_mapping_list;
while (pNode != NULL)
{
if (pNode->context.alloc != NULL)
{
nv_alloc_t *at = pNode->context.alloc;
nv_alloc_release(nvlfp, at);
}
pNode = pNode->pNext;
}
}
if (nvlfp->free_list != NULL)
{
at = nvlfp->free_list;