mirror of
https://github.com/NVIDIA/open-gpu-kernel-modules.git
synced 2026-05-13 17:26:11 +00:00
595.71.05
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user