Spoko jedynie Nvidia grymasi - daj spokój ile tego trzeba "spaczować" aby zadziałały sterowniki Nvidi
... a zatem:
Kod: Zaznacz cały
diff -Naur a/nv.c b/nv.c
--- a/nv.c 2012-12-04 23:42:53.000000000 +0100
+++ b/nv.c 2012-12-04 20:57:00.000000000 +0100
@@ -577,10 +577,10 @@
nv_alloc_t *at
)
{
- down(&nvl->at_lock);
+ mutex_lock(&nvl->at_lock);
at->next = nvl->alloc_queue;
nvl->alloc_queue = at;
- up(&nvl->at_lock);
+ mutex_unlock(&nvl->at_lock);
return 0;
}
@@ -1388,7 +1388,7 @@
nv_printf(NV_DBG_INFO, "NVRM: nvidia_open on device "
"bearing minor number %d\n", minor_num);
- down(&nvl->ldata_lock);
+ mutex_lock(&nvl->ldata_lock);
NV_CHECK_PCI_CONFIG_SPACE(sp, nv, TRUE, TRUE, NV_MAY_SLEEP());
@@ -1558,7 +1558,7 @@
NV_ATOMIC_INC(nvl->usage_count);
failed:
- up(&nvl->ldata_lock);
+ mutex_unlock(&nvl->ldata_lock);
if (rc != 0)
{
@@ -1624,7 +1624,7 @@
rm_free_unused_clients(sp, nv, NV_GET_FILE_PRIVATE(file));
- down(&nvl->at_lock);
+ mutex_lock(&nvl->at_lock);
if (nvl->alloc_queue != NULL)
{
nv_alloc_t *at = nvl->alloc_queue, *next;
@@ -1636,22 +1636,22 @@
(at->file == file))
{
NV_ATOMIC_INC(at->usage_count);
- up(&nvl->at_lock);
+ mutex_unlock(&nvl->at_lock);
if (at->pid == os_get_current_process())
NV_PRINT_AT(NV_DBG_MEMINFO, at);
nv_free_pages(nv, at->num_pages,
NV_ALLOC_MAPPING_CONTIG(at->flags),
NV_ALLOC_MAPPING(at->flags),
(void *)at);
- down(&nvl->at_lock);
+ mutex_lock(&nvl->at_lock);
next = nvl->alloc_queue; /* start over */
}
at = next;
}
}
- up(&nvl->at_lock);
+ mutex_unlock(&nvl->at_lock);
- down(&nvl->ldata_lock);
+ mutex_lock(&nvl->ldata_lock);
if (NV_ATOMIC_DEC_AND_TEST(nvl->usage_count))
{
#if defined(NV_UVM_ENABLE) || defined(NV_UVM_NEXT_ENABLE)
@@ -1717,7 +1717,7 @@
/* leave INIT flag alone so we don't reinit every time */
nv->flags &= ~NV_FLAG_OPEN;
}
- up(&nvl->ldata_lock);
+ mutex_unlock(&nvl->ldata_lock);
for (i = 0; i < NV_FOPS_STACK_INDEX_COUNT; ++i)
{
@@ -1792,7 +1792,7 @@
nv_printf(NV_DBG_INFO, "NVRM: ioctl(0x%x, 0x%x, 0x%x)\n",
_IOC_NR(cmd), (unsigned int) i_arg, _IOC_SIZE(cmd));
- down(&nvfp->fops_sp_lock[NV_FOPS_STACK_INDEX_IOCTL]);
+ mutex_lock(&nvfp->fops_sp_lock[NV_FOPS_STACK_INDEX_IOCTL]);
sp = nvfp->fops_sp[NV_FOPS_STACK_INDEX_IOCTL];
NV_CHECK_PCI_CONFIG_SPACE(sp, nv, TRUE, TRUE, NV_MAY_SLEEP());
@@ -1945,7 +1945,7 @@
}
done:
- up(&nvfp->fops_sp_lock[NV_FOPS_STACK_INDEX_IOCTL]);
+ mutex_unlock(&nvfp->fops_sp_lock[NV_FOPS_STACK_INDEX_IOCTL]);
if (arg_copy != NULL)
{
if (status != -EFAULT)
@@ -2062,7 +2062,7 @@
nv_printf(NV_DBG_INFO, "NVRM: nvidia_ctl_open\n");
- down(&nvl->ldata_lock);
+ mutex_lock(&nvl->ldata_lock);
/* save the nv away in file->private_data */
nvfp->nvptr = nvl;
@@ -2082,7 +2082,7 @@
}
NV_ATOMIC_INC(nvl->usage_count);
- up(&nvl->ldata_lock);
+ mutex_unlock(&nvl->ldata_lock);
return 0;
}
@@ -2106,7 +2106,7 @@
nv_printf(NV_DBG_INFO, "NVRM: nvidia_ctl_close\n");
- down(&nvl->ldata_lock);
+ mutex_lock(&nvl->ldata_lock);
if (NV_ATOMIC_DEC_AND_TEST(nvl->usage_count))
{
nv->flags &= ~NV_FLAG_OPEN;
@@ -2118,7 +2118,7 @@
"NVRM: failed to unregister from the ACPI subsystem!\n");
}
}
- up(&nvl->ldata_lock);
+ mutex_unlock(&nvl->ldata_lock);
rm_free_unused_clients(sp, nv, NV_GET_FILE_PRIVATE(file));
@@ -2276,7 +2276,7 @@
nv_linux_state_t *nvl = NV_GET_NVL_FROM_NV_STATE(nv);
NvU32 i, offset, page_idx=0;
- down(&nvl->at_lock);
+ mutex_lock(&nvl->at_lock);
at = nv_find_alloc(nvl, address, NV_ALLOC_TYPE_PCI);
if (at != NULL)
{
@@ -2295,20 +2295,27 @@
if (i == at->num_pages) /* not found */
{
- up(&nvl->at_lock);
+ mutex_unlock(&nvl->at_lock);
return NULL;
}
}
else
{
+ mutex_unlock(&nvl->at_lock);
+ return NULL;
+ }
+ if (at->page_table[i]->virt_addr == 0)
+ {
up(&nvl->at_lock);
+ mutex_unlock(&nvl->at_lock);
return NULL;
}
- up(&nvl->at_lock);
+ mutex_unlock(&nvl->at_lock);
if (((size + offset) <= PAGE_SIZE) && !NV_ALLOC_MAPPING_GUEST(at->flags))
{
*priv_data = NULL;
+ mutex_unlock(&nvl->at_lock);
return (void *)(at->page_table[i]->virt_addr + offset);
}
else
@@ -2476,7 +2483,7 @@
"NVRM: VM: nv_free_pages: 0x%llx 0x%x\n", at->key, page_count);
/* only lock ldata while removing 'at' from the list */
- down(&nvl->at_lock);
+ mutex_lock(&nvl->at_lock);
NV_PRINT_AT(NV_DBG_MEMINFO, at);
@@ -2491,12 +2498,12 @@
*/
if (!NV_ATOMIC_DEC_AND_TEST(at->usage_count))
{
- up(&nvl->at_lock);
+ mutex_unlock(&nvl->at_lock);
return RM_OK;
}
nvl_remove_alloc(nvl, at);
- up(&nvl->at_lock);
+ mutex_unlock(&nvl->at_lock);
if (!NV_ALLOC_MAPPING_GUEST(at->flags))
{
@@ -2561,9 +2568,9 @@
}
nvfp->event_pending = TRUE;
- wake_up_interruptible(&nvfp->waitqueue);
-
NV_SPIN_UNLOCK_IRQRESTORE(&nvfp->fp_lock, eflags);
+
+ wake_up_interruptible(&nvfp->waitqueue);
}
int NV_API_CALL nv_get_event(
diff -Naur a/nv-linux.h b/nv-linux.h
--- a/nv-linux.h 2013-12-04 23:42:53.000000000 +0100
+++ b/nv-linux.h 2013-12-04 20:57:00.000000000 +0100
@@ -139,11 +139,6 @@
#endif
#include <linux/spinlock.h>
-#if defined(NV_LINUX_SEMAPHORE_H_PRESENT)
-#include <linux/semaphore.h>
-#else
-#include <asm/semaphore.h>
-#endif
#include <linux/completion.h>
#include <linux/highmem.h>
@@ -944,19 +939,7 @@
return ret;
}
-#if defined(CONFIG_PREEMPT_RT_FULL)
-#define NV_INIT_MUTEX(mutex) sema_init(mutex,1)
-#else
-#if !defined(__SEMAPHORE_INITIALIZER) && defined(__COMPAT_SEMAPHORE_INITIALIZER)
-#define __SEMAPHORE_INITIALIZER __COMPAT_SEMAPHORE_INITIALIZER
-#endif
-#define NV_INIT_MUTEX(mutex) \
- { \
- struct semaphore __mutex = \
- __SEMAPHORE_INITIALIZER(*(mutex), 1); \
- *(mutex) = __mutex; \
- }
-#endif
+#define NV_INIT_MUTEX(mutex) mutex_init(mutex)
#if !defined(NV_VMWARE)
#if defined(NV_GET_NUM_PHYSPAGES_PRESENT)
@@ -1508,10 +1491,10 @@
struct timer_list rc_timer;
/* lock for linux-specific data, not used by core rm */
- struct semaphore ldata_lock;
+ struct mutex ldata_lock;
/* lock for linux-specific alloc queue */
- struct semaphore at_lock;
+ struct mutex at_lock;
NvU32 minor_num;
struct nv_linux_state_s *next;
@@ -1574,7 +1557,7 @@
{
nv_stack_t *sp;
nv_stack_t *fops_sp[NV_FOPS_STACK_INDEX_COUNT];
- struct semaphore fops_sp_lock[NV_FOPS_STACK_INDEX_COUNT];
+ struct mutex fops_sp_lock[NV_FOPS_STACK_INDEX_COUNT];
void *nvptr;
void *proc_data;
void *data;
diff -Naur a/nv-mmap.c b/nv-mmap.c
--- a/nv-mmap.c 2013-12-04 23:42:53.000000000 +0100
+++ b/nv-mmap.c 2013-03-04 20:57:00.000000000 +0100
@@ -227,7 +227,7 @@
NV_PRINT_VMA(NV_DBG_MEMINFO, vma);
- down(&nvfp->fops_sp_lock[NV_FOPS_STACK_INDEX_MMAP]);
+ mutex_lock(&nvfp->fops_sp_lock[NV_FOPS_STACK_INDEX_MMAP]);
sp = nvfp->fops_sp[NV_FOPS_STACK_INDEX_MMAP];
NV_CHECK_PCI_CONFIG_SPACE(sp, nv, TRUE, TRUE, NV_MAY_SLEEP());
@@ -312,13 +312,13 @@
unsigned long start = 0;
unsigned int i, j;
- down(&nvl->at_lock);
+ mutex_lock(&nvl->at_lock);
at = nv_find_alloc(nvl, NV_VMA_OFFSET(vma), NV_ALLOC_TYPE_PCI);
if (at == NULL)
{
static int count = 0;
- up(&nvl->at_lock);
+ mutex_unlock(&nvl->at_lock);;
if (count++ < NV_MAX_RECURRING_WARNING_MESSAGES)
{
nv_printf(NV_DBG_ERRORS,
@@ -341,7 +341,7 @@
if (i == at->num_pages)
{
- up(&nvl->at_lock);
+ mutex_unlock(&nvl->at_lock);;
status = -EINVAL;
goto done;
}
@@ -350,7 +350,7 @@
{
nv_printf(NV_DBG_ERRORS,
"NVRM: requested mapping exceeds allocation's boundary!\n");
- up(&nvl->at_lock);
+ mutex_unlock(&nvl->at_lock);;
status = -EINVAL;
goto done;
}
@@ -359,14 +359,14 @@
NV_ALLOC_MAPPING(at->flags),
NV_MEMORY_TYPE_SYSTEM))
{
- up(&nvl->at_lock);
+ mutex_unlock(&nvl->at_lock);
status = -ENXIO;
goto done;
}
NV_VMA_PRIVATE(vma) = at;
NV_ATOMIC_INC(at->usage_count);
- up(&nvl->at_lock);
+ mutex_unlock(&nvl->at_lock);
start = vma->vm_start;
for (j = i; j < (i + pages); j++)
@@ -396,6 +396,6 @@
NV_VMA_FILE(vma) = file;
done:
- up(&nvfp->fops_sp_lock[NV_FOPS_STACK_INDEX_MMAP]);
+ mutex_unlock(&nvfp->fops_sp_lock[NV_FOPS_STACK_INDEX_MMAP]);
return status;
}
diff -Naur a/os-interface.c b/os-interface.c
--- a/os-interface.c 2012-03-19 23:42:53.000000000 +0100
+++ b/os-interface.c 2012-03-20 21:06:25.000000000 +0100
@@ -247,7 +247,7 @@
}
-typedef struct semaphore os_mutex_t;
+typedef struct mutex os_mutex_t;
//
// os_alloc_mutex - Allocate the RM mutex
@@ -308,7 +308,7 @@
{
return RM_ERR_INVALID_REQUEST;
}
- down(os_mutex);
+ mutex_lock(os_mutex);
return RM_OK;
}
@@ -324,7 +324,7 @@
return RM_ERR_INVALID_REQUEST;
}
- if (down_trylock(os_mutex))
+ if (mutex_trylock(os_mutex))
{
return RM_ERR_TIMEOUT_RETRY;
}
@@ -339,7 +339,7 @@
)
{
os_mutex_t *os_mutex = (os_mutex_t *)pMutex;
- up(os_mutex);
+ mutex_unlock(os_mutex);
}
typedef struct os_semaphore_s
--- a/nv-frontend.c 2013-12-03 23:27:15.289577015 -0500
+++ b/nv-frontend.c 2013-12-03 23:26:58.658576157 -0500
@@ -31,7 +31,7 @@
static NvU32 nv_num_instances;
// lock required to protect table.
-struct semaphore nv_module_table_lock;
+struct mutex nv_module_table_lock;
// minor number table
nvidia_module_t *nv_minor_num_table[NV_FRONTEND_CONTROL_DEVICE_MINOR_MAX + 1];
@@ -83,7 +83,7 @@
NvU32 i, ctrl_minor_num;
nv_linux_state_t *device = NULL;
- down(&nv_module_table_lock);
+ mutex_lock(&nv_module_table_lock);
if (module->instance >= NV_MAX_MODULE_INSTANCES)
{
@@ -111,7 +111,7 @@
nv_num_instances++;
rc = 0;
done:
- up(&nv_module_table_lock);
+ mutex_unlock(&nv_module_table_lock);
return rc;
}
@@ -122,7 +122,7 @@
NvU32 ctrl_minor_num;
nv_linux_state_t *device = module->nv_linux_devices;
- down(&nv_module_table_lock);
+ mutex_lock(&nv_module_table_lock);
ctrl_minor_num = NV_FRONTEND_CONTROL_DEVICE_MINOR_MAX - module->instance;
if (nv_minor_num_table[ctrl_minor_num] == NULL)
@@ -146,7 +146,7 @@
nv_num_instances--;
}
- up(&nv_module_table_lock);
+ mutex_unlock(&nv_module_table_lock);
return rc;
}
@@ -164,7 +164,7 @@
NvU32 minor_num = NV_FRONTEND_MINOR_NUMBER(inode);
- down(&nv_module_table_lock);
+ mutex_lock(&nv_module_table_lock);
module = nv_minor_num_table[minor_num];
if ((module != NULL) && (module->open != NULL))
@@ -173,7 +173,7 @@
// nvidia-frontend.ko does not get unloaded before the nvidiaN.ko modules.
if (NV_BUILD_MODULE_INSTANCES != 0 && !try_module_get(module->owner))
{
- up(&nv_module_table_lock);
+ mutex_unlock(&nv_module_table_lock);
return -ENODEV;
}
rc = module->open(inode, file);
@@ -182,7 +182,7 @@
__FUNCTION__, minor_num, rc);
}
- up(&nv_module_table_lock);
+ mutex_unlock(&nv_module_table_lock);
return rc;
}
@@ -196,7 +196,7 @@
NvU32 minor_num = NV_FRONTEND_MINOR_NUMBER(inode);
- down(&nv_module_table_lock);
+ mutex_lock(&nv_module_table_lock);
module = nv_minor_num_table[minor_num];
if ((module != NULL) && (module->close != NULL))
@@ -213,7 +213,7 @@
}
}
- up(&nv_module_table_lock);
+ mutex_unlock(&nv_module_table_lock);
return rc;
}
--- a/nv-procfs.c 2013-10-30 20:15:05.000000000 -0400
+++ b/nv-procfs.c 2013-12-04 11:56:03.067894803 -0500
@@ -354,7 +354,7 @@
char *proc_buffer;
unsigned long bytes_left;
- down(&nvfp->fops_sp_lock[NV_FOPS_STACK_INDEX_PROCFS]);
+ mutex_lock(&nvfp->fops_sp_lock[NV_FOPS_STACK_INDEX_PROCFS]);
bytes_left = (NV_PROC_WRITE_BUFFER_SIZE - nvfp->off - 1);
@@ -384,7 +384,7 @@
*pos = nvfp->off;
done:
- up(&nvfp->fops_sp_lock[NV_FOPS_STACK_INDEX_PROCFS]);
+ mutex_unlock(&nvfp->fops_sp_lock[NV_FOPS_STACK_INDEX_PROCFS]);
return ((status < 0) ? status : (int)count);
}