Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
kernel_linux
提交
2031d0f5
K
kernel_linux
项目概览
OpenHarmony
/
kernel_linux
上一次同步 大约 4 年
通知
14
Star
8
Fork
2
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
kernel_linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
2031d0f5
编写于
6月 25, 2005
作者:
L
Linus Torvalds
浏览文件
操作
浏览文件
下载
差异文件
Merge Christoph's freeze cleanup patch
上级
98e7f294
3e1d1d28
变更
47
隐藏空白更改
内联
并排
Showing
47 changed file
with
126 addition
and
112 deletion
+126
-112
Documentation/power/kernel_threads.txt
Documentation/power/kernel_threads.txt
+1
-2
Documentation/power/swsusp.txt
Documentation/power/swsusp.txt
+1
-1
arch/frv/kernel/signal.c
arch/frv/kernel/signal.c
+1
-3
arch/h8300/kernel/signal.c
arch/h8300/kernel/signal.c
+1
-3
arch/i386/kernel/io_apic.c
arch/i386/kernel/io_apic.c
+1
-1
arch/i386/kernel/signal.c
arch/i386/kernel/signal.c
+1
-3
arch/m32r/kernel/signal.c
arch/m32r/kernel/signal.c
+1
-3
arch/ppc/kernel/signal.c
arch/ppc/kernel/signal.c
+1
-2
arch/x86_64/kernel/signal.c
arch/x86_64/kernel/signal.c
+1
-1
drivers/block/pktcdvd.c
drivers/block/pktcdvd.c
+1
-2
drivers/ieee1394/ieee1394_core.c
drivers/ieee1394/ieee1394_core.c
+1
-3
drivers/ieee1394/nodemgr.c
drivers/ieee1394/nodemgr.c
+1
-1
drivers/input/gameport/gameport.c
drivers/input/gameport/gameport.c
+1
-1
drivers/input/serio/serio.c
drivers/input/serio/serio.c
+1
-1
drivers/macintosh/therm_adt746x.c
drivers/macintosh/therm_adt746x.c
+1
-3
drivers/md/md.c
drivers/md/md.c
+1
-2
drivers/media/dvb/dvb-core/dvb_frontend.c
drivers/media/dvb/dvb-core/dvb_frontend.c
+1
-2
drivers/media/video/msp3400.c
drivers/media/video/msp3400.c
+1
-2
drivers/media/video/video-buf-dvb.c
drivers/media/video/video-buf-dvb.c
+1
-2
drivers/net/8139too.c
drivers/net/8139too.c
+1
-1
drivers/net/irda/sir_kthread.c
drivers/net/irda/sir_kthread.c
+1
-2
drivers/net/irda/stir4200.c
drivers/net/irda/stir4200.c
+2
-2
drivers/net/wireless/airo.c
drivers/net/wireless/airo.c
+1
-1
drivers/pcmcia/cs.c
drivers/pcmcia/cs.c
+1
-1
drivers/pnp/pnpbios/core.c
drivers/pnp/pnpbios/core.c
+1
-1
drivers/usb/core/hub.c
drivers/usb/core/hub.c
+1
-1
drivers/usb/gadget/file_storage.c
drivers/usb/gadget/file_storage.c
+1
-2
drivers/usb/storage/usb.c
drivers/usb/storage/usb.c
+1
-3
drivers/w1/w1.c
drivers/w1/w1.c
+2
-2
fs/afs/kafsasyncd.c
fs/afs/kafsasyncd.c
+1
-1
fs/afs/kafstimod.c
fs/afs/kafstimod.c
+1
-1
fs/jbd/journal.c
fs/jbd/journal.c
+2
-2
fs/jfs/jfs_logmgr.c
fs/jfs/jfs_logmgr.c
+2
-2
fs/jfs/jfs_txnmgr.c
fs/jfs/jfs_txnmgr.c
+4
-4
fs/lockd/clntproc.c
fs/lockd/clntproc.c
+1
-1
fs/xfs/linux-2.6/xfs_buf.c
fs/xfs/linux-2.6/xfs_buf.c
+2
-2
fs/xfs/linux-2.6/xfs_super.c
fs/xfs/linux-2.6/xfs_super.c
+1
-1
include/linux/sched.h
include/linux/sched.h
+59
-14
kernel/power/process.c
kernel/power/process.c
+10
-16
kernel/sched.c
kernel/sched.c
+1
-2
kernel/signal.c
kernel/signal.c
+2
-3
mm/pdflush.c
mm/pdflush.c
+1
-1
mm/vmscan.c
mm/vmscan.c
+2
-2
net/rxrpc/krxiod.c
net/rxrpc/krxiod.c
+1
-1
net/rxrpc/krxsecd.c
net/rxrpc/krxsecd.c
+1
-1
net/rxrpc/krxtimod.c
net/rxrpc/krxtimod.c
+1
-1
net/sunrpc/svcsock.c
net/sunrpc/svcsock.c
+3
-3
未找到文件。
Documentation/power/kernel_threads.txt
浏览文件 @
2031d0f5
...
...
@@ -12,8 +12,7 @@ refrigerator. Code to do this looks like this:
do {
hub_events();
wait_event_interruptible(khubd_wait, !list_empty(&hub_event_list));
if (current->flags & PF_FREEZE)
refrigerator(PF_FREEZE);
try_to_freeze();
} while (!signal_pending(current));
from drivers/usb/core/hub.c::hub_thread()
...
...
Documentation/power/swsusp.txt
浏览文件 @
2031d0f5
...
...
@@ -164,7 +164,7 @@ place where the thread is safe to be frozen (no kernel semaphores
should be held at that point and it must be safe to sleep there), and
add:
try_to_freeze(PF_FREEZE
);
try_to_freeze(
);
If the thread is needed for writing the image to storage, you should
instead set the PF_NOFREEZE process flag when creating the thread (and
...
...
arch/frv/kernel/signal.c
浏览文件 @
2031d0f5
...
...
@@ -536,10 +536,8 @@ int do_signal(struct pt_regs *regs, sigset_t *oldset)
if
(
!
user_mode
(
regs
))
return
1
;
if
(
current
->
flags
&
PF_FREEZE
)
{
refrigerator
(
0
);
if
(
try_to_freeze
())
goto
no_signal
;
}
if
(
!
oldset
)
oldset
=
&
current
->
blocked
;
...
...
arch/h8300/kernel/signal.c
浏览文件 @
2031d0f5
...
...
@@ -517,10 +517,8 @@ asmlinkage int do_signal(struct pt_regs *regs, sigset_t *oldset)
if
((
regs
->
ccr
&
0x10
))
return
1
;
if
(
current
->
flags
&
PF_FREEZE
)
{
refrigerator
(
0
);
if
(
try_to_freeze
())
goto
no_signal
;
}
current
->
thread
.
esp0
=
(
unsigned
long
)
regs
;
...
...
arch/i386/kernel/io_apic.c
浏览文件 @
2031d0f5
...
...
@@ -573,7 +573,7 @@ static int balanced_irq(void *unused)
for
(
;
;
)
{
set_current_state
(
TASK_INTERRUPTIBLE
);
time_remaining
=
schedule_timeout
(
time_remaining
);
try_to_freeze
(
PF_FREEZE
);
try_to_freeze
();
if
(
time_after
(
jiffies
,
prev_balance_time
+
balanced_irq_interval
))
{
preempt_disable
();
...
...
arch/i386/kernel/signal.c
浏览文件 @
2031d0f5
...
...
@@ -608,10 +608,8 @@ int fastcall do_signal(struct pt_regs *regs, sigset_t *oldset)
if
(
!
user_mode
(
regs
))
return
1
;
if
(
current
->
flags
&
PF_FREEZE
)
{
refrigerator
(
0
);
if
(
try_to_freeze
)
goto
no_signal
;
}
if
(
!
oldset
)
oldset
=
&
current
->
blocked
;
...
...
arch/m32r/kernel/signal.c
浏览文件 @
2031d0f5
...
...
@@ -371,10 +371,8 @@ int do_signal(struct pt_regs *regs, sigset_t *oldset)
if
(
!
user_mode
(
regs
))
return
1
;
if
(
current
->
flags
&
PF_FREEZE
)
{
refrigerator
(
0
);
if
(
try_to_freeze
())
goto
no_signal
;
}
if
(
!
oldset
)
oldset
=
&
current
->
blocked
;
...
...
arch/ppc/kernel/signal.c
浏览文件 @
2031d0f5
...
...
@@ -705,8 +705,7 @@ int do_signal(sigset_t *oldset, struct pt_regs *regs)
unsigned
long
frame
,
newsp
;
int
signr
,
ret
;
if
(
current
->
flags
&
PF_FREEZE
)
{
refrigerator
(
PF_FREEZE
);
if
(
try_to_freeze
())
{
signr
=
0
;
if
(
!
signal_pending
(
current
))
goto
no_signal
;
...
...
arch/x86_64/kernel/signal.c
浏览文件 @
2031d0f5
...
...
@@ -425,7 +425,7 @@ int do_signal(struct pt_regs *regs, sigset_t *oldset)
if
(
!
user_mode
(
regs
))
return
1
;
if
(
try_to_freeze
(
0
))
if
(
try_to_freeze
())
goto
no_signal
;
if
(
!
oldset
)
...
...
drivers/block/pktcdvd.c
浏览文件 @
2031d0f5
...
...
@@ -1251,8 +1251,7 @@ static int kcdrwd(void *foobar)
VPRINTK
(
"kcdrwd: wake up
\n
"
);
/* make swsusp happy with our thread */
if
(
current
->
flags
&
PF_FREEZE
)
refrigerator
(
PF_FREEZE
);
try_to_freeze
();
list_for_each_entry
(
pkt
,
&
pd
->
cdrw
.
pkt_active_list
,
list
)
{
if
(
!
pkt
->
sleep_time
)
...
...
drivers/ieee1394/ieee1394_core.c
浏览文件 @
2031d0f5
...
...
@@ -1041,10 +1041,8 @@ static int hpsbpkt_thread(void *__hi)
while
(
1
)
{
if
(
down_interruptible
(
&
khpsbpkt_sig
))
{
if
(
current
->
flags
&
PF_FREEZE
)
{
refrigerator
(
0
);
if
(
try_to_freeze
())
continue
;
}
printk
(
"khpsbpkt: received unexpected signal?!
\n
"
);
break
;
}
...
...
drivers/ieee1394/nodemgr.c
浏览文件 @
2031d0f5
...
...
@@ -1510,7 +1510,7 @@ static int nodemgr_host_thread(void *__hi)
if
(
down_interruptible
(
&
hi
->
reset_sem
)
||
down_interruptible
(
&
nodemgr_serialize
))
{
if
(
try_to_freeze
(
PF_FREEZE
))
if
(
try_to_freeze
())
continue
;
printk
(
"NodeMgr: received unexpected signal?!
\n
"
);
break
;
...
...
drivers/input/gameport/gameport.c
浏览文件 @
2031d0f5
...
...
@@ -439,7 +439,7 @@ static int gameport_thread(void *nothing)
do
{
gameport_handle_events
();
wait_event_interruptible
(
gameport_wait
,
!
list_empty
(
&
gameport_event_list
));
try_to_freeze
(
PF_FREEZE
);
try_to_freeze
();
}
while
(
!
signal_pending
(
current
));
printk
(
KERN_DEBUG
"gameport: kgameportd exiting
\n
"
);
...
...
drivers/input/serio/serio.c
浏览文件 @
2031d0f5
...
...
@@ -344,7 +344,7 @@ static int serio_thread(void *nothing)
do
{
serio_handle_events
();
wait_event_interruptible
(
serio_wait
,
!
list_empty
(
&
serio_event_list
));
try_to_freeze
(
PF_FREEZE
);
try_to_freeze
();
}
while
(
!
signal_pending
(
current
));
printk
(
KERN_DEBUG
"serio: kseriod exiting
\n
"
);
...
...
drivers/macintosh/therm_adt746x.c
浏览文件 @
2031d0f5
...
...
@@ -328,9 +328,7 @@ static int monitor_task(void *arg)
struct
thermostat
*
th
=
arg
;
while
(
!
kthread_should_stop
())
{
if
(
current
->
flags
&
PF_FREEZE
)
refrigerator
(
PF_FREEZE
);
try_to_freeze
();
msleep_interruptible
(
2000
);
#ifndef DEBUG
...
...
drivers/md/md.c
浏览文件 @
2031d0f5
...
...
@@ -2976,8 +2976,7 @@ static int md_thread(void * arg)
wait_event_interruptible_timeout
(
thread
->
wqueue
,
test_bit
(
THREAD_WAKEUP
,
&
thread
->
flags
),
thread
->
timeout
);
if
(
current
->
flags
&
PF_FREEZE
)
refrigerator
(
PF_FREEZE
);
try_to_freeze
();
clear_bit
(
THREAD_WAKEUP
,
&
thread
->
flags
);
...
...
drivers/media/dvb/dvb-core/dvb_frontend.c
浏览文件 @
2031d0f5
...
...
@@ -391,8 +391,7 @@ static int dvb_frontend_thread(void *data)
break
;
}
if
(
current
->
flags
&
PF_FREEZE
)
refrigerator
(
PF_FREEZE
);
try_to_freeze
();
if
(
down_interruptible
(
&
fepriv
->
sem
))
break
;
...
...
drivers/media/video/msp3400.c
浏览文件 @
2031d0f5
...
...
@@ -750,8 +750,7 @@ static int msp34xx_sleep(struct msp3400c *msp, int timeout)
#endif
}
}
if
(
current
->
flags
&
PF_FREEZE
)
refrigerator
(
PF_FREEZE
);
try_to_freeze
();
remove_wait_queue
(
&
msp
->
wq
,
&
wait
);
return
msp
->
restart
;
}
...
...
drivers/media/video/video-buf-dvb.c
浏览文件 @
2031d0f5
...
...
@@ -62,8 +62,7 @@ static int videobuf_dvb_thread(void *data)
break
;
if
(
kthread_should_stop
())
break
;
if
(
current
->
flags
&
PF_FREEZE
)
refrigerator
(
PF_FREEZE
);
try_to_freeze
();
/* feed buffer data to demux */
if
(
buf
->
state
==
STATE_DONE
)
...
...
drivers/net/8139too.c
浏览文件 @
2031d0f5
...
...
@@ -1606,7 +1606,7 @@ static int rtl8139_thread (void *data)
do
{
timeout
=
interruptible_sleep_on_timeout
(
&
tp
->
thr_wait
,
timeout
);
/* make swsusp happy with our thread */
try_to_freeze
(
PF_FREEZE
);
try_to_freeze
();
}
while
(
!
signal_pending
(
current
)
&&
(
timeout
>
0
));
if
(
signal_pending
(
current
))
{
...
...
drivers/net/irda/sir_kthread.c
浏览文件 @
2031d0f5
...
...
@@ -135,8 +135,7 @@ static int irda_thread(void *startup)
remove_wait_queue
(
&
irda_rq_queue
.
kick
,
&
wait
);
/* make swsusp happy with our thread */
if
(
current
->
flags
&
PF_FREEZE
)
refrigerator
(
PF_FREEZE
);
try_to_freeze
();
run_irda_queue
();
}
...
...
drivers/net/irda/stir4200.c
浏览文件 @
2031d0f5
...
...
@@ -763,7 +763,7 @@ static int stir_transmit_thread(void *arg)
{
#ifdef CONFIG_PM
/* if suspending, then power off and wait */
if
(
unlikely
(
current
->
flags
&
PF_FREEZE
))
{
if
(
unlikely
(
freezing
(
current
)
))
{
if
(
stir
->
receiving
)
receive_stop
(
stir
);
else
...
...
@@ -771,7 +771,7 @@ static int stir_transmit_thread(void *arg)
write_reg
(
stir
,
REG_CTRL1
,
CTRL1_TXPWD
|
CTRL1_RXPWD
);
refrigerator
(
PF_FREEZE
);
refrigerator
();
if
(
change_speed
(
stir
,
stir
->
speed
))
break
;
...
...
drivers/net/wireless/airo.c
浏览文件 @
2031d0f5
...
...
@@ -2918,7 +2918,7 @@ static int airo_thread(void *data) {
flush_signals
(
current
);
/* make swsusp happy with our thread */
try_to_freeze
(
PF_FREEZE
);
try_to_freeze
();
if
(
test_bit
(
JOB_DIE
,
&
ai
->
flags
))
break
;
...
...
drivers/pcmcia/cs.c
浏览文件 @
2031d0f5
...
...
@@ -718,7 +718,7 @@ static int pccardd(void *__skt)
}
schedule
();
try_to_freeze
(
PF_FREEZE
);
try_to_freeze
();
if
(
!
skt
->
thread
)
break
;
...
...
drivers/pnp/pnpbios/core.c
浏览文件 @
2031d0f5
...
...
@@ -182,7 +182,7 @@ static int pnp_dock_thread(void * unused)
msleep_interruptible
(
2000
);
if
(
signal_pending
(
current
))
{
if
(
try_to_freeze
(
PF_FREEZE
))
if
(
try_to_freeze
())
continue
;
break
;
}
...
...
drivers/usb/core/hub.c
浏览文件 @
2031d0f5
...
...
@@ -2808,7 +2808,7 @@ static int hub_thread(void *__unused)
do
{
hub_events
();
wait_event_interruptible
(
khubd_wait
,
!
list_empty
(
&
hub_event_list
));
try_to_freeze
(
PF_FREEZE
);
try_to_freeze
();
}
while
(
!
signal_pending
(
current
));
pr_debug
(
"%s: khubd exiting
\n
"
,
usbcore_name
);
...
...
drivers/usb/gadget/file_storage.c
浏览文件 @
2031d0f5
...
...
@@ -1554,8 +1554,7 @@ static int sleep_thread(struct fsg_dev *fsg)
rc
=
wait_event_interruptible
(
fsg
->
thread_wqh
,
fsg
->
thread_wakeup_needed
);
fsg
->
thread_wakeup_needed
=
0
;
if
(
current
->
flags
&
PF_FREEZE
)
refrigerator
(
PF_FREEZE
);
try_to_freeze
();
return
(
rc
?
-
EINTR
:
0
);
}
...
...
drivers/usb/storage/usb.c
浏览文件 @
2031d0f5
...
...
@@ -847,10 +847,8 @@ static int usb_stor_scan_thread(void * __us)
wait_event_interruptible_timeout
(
us
->
delay_wait
,
test_bit
(
US_FLIDX_DISCONNECTING
,
&
us
->
flags
),
delay_use
*
HZ
);
if
(
current
->
flags
&
PF_FREEZE
)
{
refrigerator
(
PF_FREEZE
);
if
(
try_to_freeze
())
goto
retry
;
}
}
/* If the device is still connected, perform the scanning */
...
...
drivers/w1/w1.c
浏览文件 @
2031d0f5
...
...
@@ -646,7 +646,7 @@ static int w1_control(void *data)
while
(
!
control_needs_exit
||
have_to_wait
)
{
have_to_wait
=
0
;
try_to_freeze
(
PF_FREEZE
);
try_to_freeze
();
msleep_interruptible
(
w1_timeout
*
1000
);
if
(
signal_pending
(
current
))
...
...
@@ -725,7 +725,7 @@ int w1_process(void *data)
allow_signal
(
SIGTERM
);
while
(
!
test_bit
(
W1_MASTER_NEED_EXIT
,
&
dev
->
flags
))
{
try_to_freeze
(
PF_FREEZE
);
try_to_freeze
();
msleep_interruptible
(
w1_timeout
*
1000
);
if
(
signal_pending
(
current
))
...
...
fs/afs/kafsasyncd.c
浏览文件 @
2031d0f5
...
...
@@ -116,7 +116,7 @@ static int kafsasyncd(void *arg)
remove_wait_queue
(
&
kafsasyncd_sleepq
,
&
myself
);
set_current_state
(
TASK_RUNNING
);
try_to_freeze
(
PF_FREEZE
);
try_to_freeze
();
/* discard pending signals */
afs_discard_my_signals
();
...
...
fs/afs/kafstimod.c
浏览文件 @
2031d0f5
...
...
@@ -91,7 +91,7 @@ static int kafstimod(void *arg)
complete_and_exit
(
&
kafstimod_dead
,
0
);
}
try_to_freeze
(
PF_FREEZE
);
try_to_freeze
();
/* discard pending signals */
afs_discard_my_signals
();
...
...
fs/jbd/journal.c
浏览文件 @
2031d0f5
...
...
@@ -167,7 +167,7 @@ int kjournald(void *arg)
}
wake_up
(
&
journal
->
j_wait_done_commit
);
if
(
current
->
flags
&
PF_FREEZE
)
{
if
(
freezing
(
current
)
)
{
/*
* The simpler the better. Flushing journal isn't a
* good idea, because that depends on threads that may
...
...
@@ -175,7 +175,7 @@ int kjournald(void *arg)
*/
jbd_debug
(
1
,
"Now suspending kjournald
\n
"
);
spin_unlock
(
&
journal
->
j_state_lock
);
refrigerator
(
PF_FREEZE
);
refrigerator
();
spin_lock
(
&
journal
->
j_state_lock
);
}
else
{
/*
...
...
fs/jfs/jfs_logmgr.c
浏览文件 @
2031d0f5
...
...
@@ -2359,9 +2359,9 @@ int jfsIOWait(void *arg)
lbmStartIO
(
bp
);
spin_lock_irq
(
&
log_redrive_lock
);
}
if
(
current
->
flags
&
PF_FREEZE
)
{
if
(
freezing
(
current
)
)
{
spin_unlock_irq
(
&
log_redrive_lock
);
refrigerator
(
PF_FREEZE
);
refrigerator
();
}
else
{
add_wait_queue
(
&
jfs_IO_thread_wait
,
&
wq
);
set_current_state
(
TASK_INTERRUPTIBLE
);
...
...
fs/jfs/jfs_txnmgr.c
浏览文件 @
2031d0f5
...
...
@@ -2788,9 +2788,9 @@ int jfs_lazycommit(void *arg)
/* In case a wakeup came while all threads were active */
jfs_commit_thread_waking
=
0
;
if
(
current
->
flags
&
PF_FREEZE
)
{
if
(
freezing
(
current
)
)
{
LAZY_UNLOCK
(
flags
);
refrigerator
(
PF_FREEZE
);
refrigerator
();
}
else
{
DECLARE_WAITQUEUE
(
wq
,
current
);
...
...
@@ -2987,9 +2987,9 @@ int jfs_sync(void *arg)
/* Add anon_list2 back to anon_list */
list_splice_init
(
&
TxAnchor
.
anon_list2
,
&
TxAnchor
.
anon_list
);
if
(
current
->
flags
&
PF_FREEZE
)
{
if
(
freezing
(
current
)
)
{
TXN_UNLOCK
();
refrigerator
(
PF_FREEZE
);
refrigerator
();
}
else
{
DECLARE_WAITQUEUE
(
wq
,
current
);
...
...
fs/lockd/clntproc.c
浏览文件 @
2031d0f5
...
...
@@ -313,7 +313,7 @@ static int nlm_wait_on_grace(wait_queue_head_t *queue)
prepare_to_wait
(
queue
,
&
wait
,
TASK_INTERRUPTIBLE
);
if
(
!
signalled
())
{
schedule_timeout
(
NLMCLNT_GRACE_WAIT
);
try_to_freeze
(
PF_FREEZE
);
try_to_freeze
();
if
(
!
signalled
())
status
=
0
;
}
...
...
fs/xfs/linux-2.6/xfs_buf.c
浏览文件 @
2031d0f5
...
...
@@ -1771,9 +1771,9 @@ xfsbufd(
INIT_LIST_HEAD
(
&
tmp
);
do
{
if
(
unlikely
(
current
->
flags
&
PF_FREEZE
))
{
if
(
unlikely
(
freezing
(
current
)
))
{
xfsbufd_force_sleep
=
1
;
refrigerator
(
PF_FREEZE
);
refrigerator
();
}
else
{
xfsbufd_force_sleep
=
0
;
}
...
...
fs/xfs/linux-2.6/xfs_super.c
浏览文件 @
2031d0f5
...
...
@@ -483,7 +483,7 @@ xfssyncd(
set_current_state
(
TASK_INTERRUPTIBLE
);
timeleft
=
schedule_timeout
(
timeleft
);
/* swsusp */
try_to_freeze
(
PF_FREEZE
);
try_to_freeze
();
if
(
vfsp
->
vfs_flag
&
VFS_UMOUNT
)
break
;
...
...
include/linux/sched.h
浏览文件 @
2031d0f5
...
...
@@ -1265,33 +1265,78 @@ extern void normalize_rt_tasks(void);
#endif
/* try_to_freeze
*
* Checks whether we need to enter the refrigerator
* and returns 1 if we did so.
*/
#ifdef CONFIG_PM
extern
void
refrigerator
(
unsigned
long
);
/*
* Check if a process has been frozen
*/
static
inline
int
frozen
(
struct
task_struct
*
p
)
{
return
p
->
flags
&
PF_FROZEN
;
}
/*
* Check if there is a request to freeze a process
*/
static
inline
int
freezing
(
struct
task_struct
*
p
)
{
return
p
->
flags
&
PF_FREEZE
;
}
/*
* Request that a process be frozen
* FIXME: SMP problem. We may not modify other process' flags!
*/
static
inline
void
freeze
(
struct
task_struct
*
p
)
{
p
->
flags
|=
PF_FREEZE
;
}
/*
* Wake up a frozen process
*/
static
inline
int
thaw_process
(
struct
task_struct
*
p
)
{
if
(
frozen
(
p
))
{
p
->
flags
&=
~
PF_FROZEN
;
wake_up_process
(
p
);
return
1
;
}
return
0
;
}
/*
* freezing is complete, mark process as frozen
*/
static
inline
void
frozen_process
(
struct
task_struct
*
p
)
{
p
->
flags
=
(
p
->
flags
&
~
PF_FREEZE
)
|
PF_FROZEN
;
}
extern
void
refrigerator
(
void
);
extern
int
freeze_processes
(
void
);
extern
void
thaw_processes
(
void
);
static
inline
int
try_to_freeze
(
unsigned
long
refrigerator_flags
)
static
inline
int
try_to_freeze
(
void
)
{
if
(
unlikely
(
current
->
flags
&
PF_FREEZE
))
{
refrigerator
(
refrigerator_flags
);
if
(
freezing
(
current
))
{
refrigerator
();
return
1
;
}
else
return
0
;
}
#else
static
inline
void
refrigerator
(
unsigned
long
flag
)
{}
static
inline
int
frozen
(
struct
task_struct
*
p
)
{
return
0
;
}
static
inline
int
freezing
(
struct
task_struct
*
p
)
{
return
0
;
}
static
inline
void
freeze
(
struct
task_struct
*
p
)
{
BUG
();
}
static
inline
int
thaw_process
(
struct
task_struct
*
p
)
{
return
1
;
}
static
inline
void
frozen_process
(
struct
task_struct
*
p
)
{
BUG
();
}
static
inline
void
refrigerator
(
void
)
{}
static
inline
int
freeze_processes
(
void
)
{
BUG
();
return
0
;
}
static
inline
void
thaw_processes
(
void
)
{}
static
inline
int
try_to_freeze
(
unsigned
long
refrigerator_flags
)
{
return
0
;
}
static
inline
int
try_to_freeze
(
void
)
{
return
0
;
}
#endif
/* CONFIG_PM */
#endif
/* __KERNEL__ */
...
...
kernel/power/process.c
浏览文件 @
2031d0f5
...
...
@@ -32,7 +32,7 @@ static inline int freezeable(struct task_struct * p)
}
/* Refrigerator is place where frozen processes are stored :-). */
void
refrigerator
(
unsigned
long
flag
)
void
refrigerator
(
void
)
{
/* Hmm, should we be allowed to suspend when there are realtime
processes around? */
...
...
@@ -41,14 +41,13 @@ void refrigerator(unsigned long flag)
current
->
state
=
TASK_UNINTERRUPTIBLE
;
pr_debug
(
"%s entered refrigerator
\n
"
,
current
->
comm
);
printk
(
"="
);
current
->
flags
&=
~
PF_FREEZE
;
frozen_process
(
current
);
spin_lock_irq
(
&
current
->
sighand
->
siglock
);
recalc_sigpending
();
/* We sent fake signal, clean it up */
spin_unlock_irq
(
&
current
->
sighand
->
siglock
);
current
->
flags
|=
PF_FROZEN
;
while
(
current
->
flags
&
PF_FROZEN
)
while
(
frozen
(
current
))
schedule
();
pr_debug
(
"%s left refrigerator
\n
"
,
current
->
comm
);
current
->
state
=
save
;
...
...
@@ -57,10 +56,10 @@ void refrigerator(unsigned long flag)
/* 0 = success, else # of processes that we failed to stop */
int
freeze_processes
(
void
)
{
int
todo
;
unsigned
long
start_time
;
int
todo
;
unsigned
long
start_time
;
struct
task_struct
*
g
,
*
p
;
printk
(
"Stopping tasks: "
);
start_time
=
jiffies
;
do
{
...
...
@@ -70,14 +69,12 @@ int freeze_processes(void)
unsigned
long
flags
;
if
(
!
freezeable
(
p
))
continue
;
if
((
p
->
flags
&
PF_FROZEN
)
||
if
((
frozen
(
p
)
)
||
(
p
->
state
==
TASK_TRACED
)
||
(
p
->
state
==
TASK_STOPPED
))
continue
;
/* FIXME: smp problem here: we may not access other process' flags
without locking */
p
->
flags
|=
PF_FREEZE
;
freeze
(
p
);
spin_lock_irqsave
(
&
p
->
sighand
->
siglock
,
flags
);
signal_wake_up
(
p
,
0
);
spin_unlock_irqrestore
(
&
p
->
sighand
->
siglock
,
flags
);
...
...
@@ -91,7 +88,7 @@ int freeze_processes(void)
return
todo
;
}
}
while
(
todo
);
printk
(
"|
\n
"
);
BUG_ON
(
in_atomic
());
return
0
;
...
...
@@ -106,10 +103,7 @@ void thaw_processes(void)
do_each_thread
(
g
,
p
)
{
if
(
!
freezeable
(
p
))
continue
;
if
(
p
->
flags
&
PF_FROZEN
)
{
p
->
flags
&=
~
PF_FROZEN
;
wake_up_process
(
p
);
}
else
if
(
!
thaw_process
(
p
))
printk
(
KERN_INFO
" Strange, %s not stopped
\n
"
,
p
->
comm
);
}
while_each_thread
(
g
,
p
);
...
...
kernel/sched.c
浏览文件 @
2031d0f5
...
...
@@ -4335,8 +4335,7 @@ static int migration_thread(void * data)
struct
list_head
*
head
;
migration_req_t
*
req
;
if
(
current
->
flags
&
PF_FREEZE
)
refrigerator
(
PF_FREEZE
);
try_to_freeze
();
spin_lock_irq
(
&
rq
->
lock
);
...
...
kernel/signal.c
浏览文件 @
2031d0f5
...
...
@@ -213,7 +213,7 @@ static inline int has_pending_signals(sigset_t *signal, sigset_t *blocked)
fastcall
void
recalc_sigpending_tsk
(
struct
task_struct
*
t
)
{
if
(
t
->
signal
->
group_stop_count
>
0
||
(
t
->
flags
&
PF_FREEZE
)
||
(
freezing
(
t
)
)
||
PENDING
(
&
t
->
pending
,
&
t
->
blocked
)
||
PENDING
(
&
t
->
signal
->
shared_pending
,
&
t
->
blocked
))
set_tsk_thread_flag
(
t
,
TIF_SIGPENDING
);
...
...
@@ -2231,8 +2231,7 @@ sys_rt_sigtimedwait(const sigset_t __user *uthese,
current
->
state
=
TASK_INTERRUPTIBLE
;
timeout
=
schedule_timeout
(
timeout
);
if
(
current
->
flags
&
PF_FREEZE
)
refrigerator
(
PF_FREEZE
);
try_to_freeze
();
spin_lock_irq
(
&
current
->
sighand
->
siglock
);
sig
=
dequeue_signal
(
current
,
&
these
,
&
info
);
current
->
blocked
=
current
->
real_blocked
;
...
...
mm/pdflush.c
浏览文件 @
2031d0f5
...
...
@@ -105,7 +105,7 @@ static int __pdflush(struct pdflush_work *my_work)
spin_unlock_irq
(
&
pdflush_lock
);
schedule
();
if
(
try_to_freeze
(
PF_FREEZE
))
{
if
(
try_to_freeze
())
{
spin_lock_irq
(
&
pdflush_lock
);
continue
;
}
...
...
mm/vmscan.c
浏览文件 @
2031d0f5
...
...
@@ -1216,8 +1216,8 @@ static int kswapd(void *p)
order
=
0
;
for
(
;
;
)
{
unsigned
long
new_order
;
if
(
current
->
flags
&
PF_FREEZE
)
refrigerator
(
PF_FREEZE
);
try_to_freeze
(
);
prepare_to_wait
(
&
pgdat
->
kswapd_wait
,
&
wait
,
TASK_INTERRUPTIBLE
);
new_order
=
pgdat
->
kswapd_max_order
;
...
...
net/rxrpc/krxiod.c
浏览文件 @
2031d0f5
...
...
@@ -138,7 +138,7 @@ static int rxrpc_krxiod(void *arg)
_debug
(
"### End Work"
);
try_to_freeze
(
PF_FREEZE
);
try_to_freeze
();
/* discard pending signals */
rxrpc_discard_my_signals
();
...
...
net/rxrpc/krxsecd.c
浏览文件 @
2031d0f5
...
...
@@ -107,7 +107,7 @@ static int rxrpc_krxsecd(void *arg)
_debug
(
"### End Inbound Calls"
);
try_to_freeze
(
PF_FREEZE
);
try_to_freeze
();
/* discard pending signals */
rxrpc_discard_my_signals
();
...
...
net/rxrpc/krxtimod.c
浏览文件 @
2031d0f5
...
...
@@ -90,7 +90,7 @@ static int krxtimod(void *arg)
complete_and_exit
(
&
krxtimod_dead
,
0
);
}
try_to_freeze
(
PF_FREEZE
);
try_to_freeze
();
/* discard pending signals */
rxrpc_discard_my_signals
();
...
...
net/sunrpc/svcsock.c
浏览文件 @
2031d0f5
...
...
@@ -1185,8 +1185,8 @@ svc_recv(struct svc_serv *serv, struct svc_rqst *rqstp, long timeout)
arg
->
page_len
=
(
pages
-
2
)
*
PAGE_SIZE
;
arg
->
len
=
(
pages
-
1
)
*
PAGE_SIZE
;
arg
->
tail
[
0
].
iov_len
=
0
;
try_to_freeze
(
PF_FREEZE
);
try_to_freeze
();
if
(
signalled
())
return
-
EINTR
;
...
...
@@ -1227,7 +1227,7 @@ svc_recv(struct svc_serv *serv, struct svc_rqst *rqstp, long timeout)
schedule_timeout
(
timeout
);
try_to_freeze
(
PF_FREEZE
);
try_to_freeze
();
spin_lock_bh
(
&
serv
->
sv_lock
);
remove_wait_queue
(
&
rqstp
->
rq_wait
,
&
wait
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录