memory_range_lock: Enable interrupt when trylock fails

Also use read-write-lock

Change-Id: I03150b7208325ec1fe422dcd5f931e4e41c8e40e
Refs: #452
This commit is contained in:
Tomoki Shirasawa
2019-07-29 14:12:50 +09:00
committed by Masamichi Takagi
parent 258156b57e
commit 0d3ef65092
13 changed files with 444 additions and 101 deletions

View File

@ -2097,6 +2097,7 @@ int do_process_vm_read_writev(int pid,
struct vm_range *range;
struct mcs_rwlock_node_irqsave lock;
struct mcs_rwlock_node update_lock;
unsigned long irqflags;
/* Sanity checks */
if (flags) {
@ -2108,7 +2109,7 @@ int do_process_vm_read_writev(int pid,
}
/* Check if parameters are okay */
ihk_mc_spinlock_lock_noirq(&lthread->vm->memory_range_lock);
memory_range_read_lock(lthread->vm, &irqflags);
range = lookup_process_memory_range(lthread->vm,
(uintptr_t)local_iov,
@ -2130,7 +2131,7 @@ int do_process_vm_read_writev(int pid,
ret = 0;
arg_out:
ihk_mc_spinlock_unlock_noirq(&lthread->vm->memory_range_lock);
memory_range_read_unlock(lthread->vm, &irqflags);
if (ret != 0) {
goto out;
@ -2199,7 +2200,7 @@ arg_out:
if (pli != li) {
struct vm_range *range;
ihk_mc_spinlock_lock_noirq(&lthread->vm->memory_range_lock);
memory_range_read_lock(lthread->vm, &irqflags);
/* Is base valid? */
range = lookup_process_memory_range(lthread->vm,
@ -2229,7 +2230,7 @@ arg_out:
ret = 0;
pli_out:
ihk_mc_spinlock_unlock_noirq(&lthread->vm->memory_range_lock);
memory_range_read_unlock(lthread->vm, &irqflags);
if (ret != 0) {
goto out;
@ -2242,7 +2243,7 @@ pli_out:
if (pri != ri) {
struct vm_range *range;
ihk_mc_spinlock_lock_noirq(&rvm->memory_range_lock);
memory_range_read_lock(rvm, &irqflags);
/* Is base valid? */
range = lookup_process_memory_range(rvm,
@ -2272,7 +2273,7 @@ pli_out:
ret = 0;
pri_out:
ihk_mc_spinlock_unlock_noirq(&rvm->memory_range_lock);
memory_range_read_unlock(rvm, &irqflags);
if (ret != 0) {
goto out;

View File

@ -2234,6 +2234,7 @@ int do_process_vm_read_writev(int pid,
struct vm_range *range;
struct mcs_rwlock_node_irqsave lock;
struct mcs_rwlock_node update_lock;
unsigned long irqflags;
/* Sanity checks */
if (flags) {
@ -2245,7 +2246,7 @@ int do_process_vm_read_writev(int pid,
}
/* Check if parameters are okay */
ihk_mc_spinlock_lock_noirq(&lthread->vm->memory_range_lock);
memory_range_read_lock(lthread->vm, &irqflags);
range = lookup_process_memory_range(lthread->vm,
(uintptr_t)local_iov,
@ -2267,7 +2268,7 @@ int do_process_vm_read_writev(int pid,
ret = 0;
arg_out:
ihk_mc_spinlock_unlock_noirq(&lthread->vm->memory_range_lock);
memory_range_read_unlock(lthread->vm, &irqflags);
if (ret != 0) {
goto out;
@ -2336,7 +2337,7 @@ arg_out:
if (pli != li) {
struct vm_range *range;
ihk_mc_spinlock_lock_noirq(&lthread->vm->memory_range_lock);
memory_range_read_lock(lthread->vm, &irqflags);
/* Is base valid? */
range = lookup_process_memory_range(lthread->vm,
@ -2366,7 +2367,7 @@ arg_out:
ret = 0;
pli_out:
ihk_mc_spinlock_unlock_noirq(&lthread->vm->memory_range_lock);
memory_range_read_unlock(lthread->vm, &irqflags);
if (ret != 0) {
goto out;
@ -2379,7 +2380,7 @@ pli_out:
if (pri != ri) {
struct vm_range *range;
ihk_mc_spinlock_lock_noirq(&rvm->memory_range_lock);
memory_range_read_lock(rvm, &irqflags);
/* Is base valid? */
range = lookup_process_memory_range(rvm,
@ -2409,7 +2410,7 @@ pli_out:
ret = 0;
pri_out:
ihk_mc_spinlock_unlock_noirq(&rvm->memory_range_lock);
memory_range_read_unlock(rvm, &irqflags);
if (ret != 0) {
goto out;