Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
raspberrypi-kernel
提交
f2c716e4
R
raspberrypi-kernel
项目概览
openeuler
/
raspberrypi-kernel
通知
13
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
raspberrypi-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
f2c716e4
编写于
3月 16, 2017
作者:
I
Ingo Molnar
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'locking/urgent' into locking/core, to pick up fixes
Signed-off-by:
N
Ingo Molnar
<
mingo@kernel.org
>
上级
bd174169
17fcbd59
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
24 addition
and
14 deletion
+24
-14
kernel/futex.c
kernel/futex.c
+13
-9
kernel/locking/rwsem-spinlock.c
kernel/locking/rwsem-spinlock.c
+11
-5
未找到文件。
kernel/futex.c
浏览文件 @
f2c716e4
...
@@ -2815,7 +2815,6 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags,
...
@@ -2815,7 +2815,6 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags,
{
{
struct
hrtimer_sleeper
timeout
,
*
to
=
NULL
;
struct
hrtimer_sleeper
timeout
,
*
to
=
NULL
;
struct
rt_mutex_waiter
rt_waiter
;
struct
rt_mutex_waiter
rt_waiter
;
struct
rt_mutex
*
pi_mutex
=
NULL
;
struct
futex_hash_bucket
*
hb
;
struct
futex_hash_bucket
*
hb
;
union
futex_key
key2
=
FUTEX_KEY_INIT
;
union
futex_key
key2
=
FUTEX_KEY_INIT
;
struct
futex_q
q
=
futex_q_init
;
struct
futex_q
q
=
futex_q_init
;
...
@@ -2899,6 +2898,8 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags,
...
@@ -2899,6 +2898,8 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags,
if
(
q
.
pi_state
&&
(
q
.
pi_state
->
owner
!=
current
))
{
if
(
q
.
pi_state
&&
(
q
.
pi_state
->
owner
!=
current
))
{
spin_lock
(
q
.
lock_ptr
);
spin_lock
(
q
.
lock_ptr
);
ret
=
fixup_pi_state_owner
(
uaddr2
,
&
q
,
current
);
ret
=
fixup_pi_state_owner
(
uaddr2
,
&
q
,
current
);
if
(
ret
&&
rt_mutex_owner
(
&
q
.
pi_state
->
pi_mutex
)
==
current
)
rt_mutex_unlock
(
&
q
.
pi_state
->
pi_mutex
);
/*
/*
* Drop the reference to the pi state which
* Drop the reference to the pi state which
* the requeue_pi() code acquired for us.
* the requeue_pi() code acquired for us.
...
@@ -2907,6 +2908,8 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags,
...
@@ -2907,6 +2908,8 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags,
spin_unlock
(
q
.
lock_ptr
);
spin_unlock
(
q
.
lock_ptr
);
}
}
}
else
{
}
else
{
struct
rt_mutex
*
pi_mutex
;
/*
/*
* We have been woken up by futex_unlock_pi(), a timeout, or a
* We have been woken up by futex_unlock_pi(), a timeout, or a
* signal. futex_unlock_pi() will not destroy the lock_ptr nor
* signal. futex_unlock_pi() will not destroy the lock_ptr nor
...
@@ -2930,18 +2933,19 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags,
...
@@ -2930,18 +2933,19 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags,
if
(
res
)
if
(
res
)
ret
=
(
res
<
0
)
?
res
:
0
;
ret
=
(
res
<
0
)
?
res
:
0
;
/*
* If fixup_pi_state_owner() faulted and was unable to handle
* the fault, unlock the rt_mutex and return the fault to
* userspace.
*/
if
(
ret
&&
rt_mutex_owner
(
pi_mutex
)
==
current
)
rt_mutex_unlock
(
pi_mutex
);
/* Unqueue and drop the lock. */
/* Unqueue and drop the lock. */
unqueue_me_pi
(
&
q
);
unqueue_me_pi
(
&
q
);
}
}
/*
if
(
ret
==
-
EINTR
)
{
* If fixup_pi_state_owner() faulted and was unable to handle the
* fault, unlock the rt_mutex and return the fault to userspace.
*/
if
(
ret
==
-
EFAULT
)
{
if
(
pi_mutex
&&
rt_mutex_owner
(
pi_mutex
)
==
current
)
rt_mutex_unlock
(
pi_mutex
);
}
else
if
(
ret
==
-
EINTR
)
{
/*
/*
* We've already been requeued, but cannot restart by calling
* We've already been requeued, but cannot restart by calling
* futex_lock_pi() directly. We could restart this syscall, but
* futex_lock_pi() directly. We could restart this syscall, but
...
...
kernel/locking/rwsem-spinlock.c
浏览文件 @
f2c716e4
...
@@ -213,10 +213,9 @@ int __sched __down_write_common(struct rw_semaphore *sem, int state)
...
@@ -213,10 +213,9 @@ int __sched __down_write_common(struct rw_semaphore *sem, int state)
*/
*/
if
(
sem
->
count
==
0
)
if
(
sem
->
count
==
0
)
break
;
break
;
if
(
signal_pending_state
(
state
,
current
))
{
if
(
signal_pending_state
(
state
,
current
))
ret
=
-
EINTR
;
goto
out_nolock
;
goto
out
;
}
set_current_state
(
state
);
set_current_state
(
state
);
raw_spin_unlock_irqrestore
(
&
sem
->
wait_lock
,
flags
);
raw_spin_unlock_irqrestore
(
&
sem
->
wait_lock
,
flags
);
schedule
();
schedule
();
...
@@ -224,12 +223,19 @@ int __sched __down_write_common(struct rw_semaphore *sem, int state)
...
@@ -224,12 +223,19 @@ int __sched __down_write_common(struct rw_semaphore *sem, int state)
}
}
/* got the lock */
/* got the lock */
sem
->
count
=
-
1
;
sem
->
count
=
-
1
;
out:
list_del
(
&
waiter
.
list
);
list_del
(
&
waiter
.
list
);
raw_spin_unlock_irqrestore
(
&
sem
->
wait_lock
,
flags
);
raw_spin_unlock_irqrestore
(
&
sem
->
wait_lock
,
flags
);
return
ret
;
return
ret
;
out_nolock:
list_del
(
&
waiter
.
list
);
if
(
!
list_empty
(
&
sem
->
wait_list
))
__rwsem_do_wake
(
sem
,
1
);
raw_spin_unlock_irqrestore
(
&
sem
->
wait_lock
,
flags
);
return
-
EINTR
;
}
}
void
__sched
__down_write
(
struct
rw_semaphore
*
sem
)
void
__sched
__down_write
(
struct
rw_semaphore
*
sem
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录