* [Patch] Per kthread freezer flags
@ 2004-07-28 7:22 Nigel Cunningham
2004-07-28 21:20 ` Andrew Morton
2004-07-29 19:04 ` Pavel Machek
0 siblings, 2 replies; 24+ messages in thread
From: Nigel Cunningham @ 2004-07-28 7:22 UTC (permalink / raw)
To: Andrew Morton; +Cc: Linux Kernel Mailing List
Hi Andrew et al.
At the moment, all kthreads have PF_NOFREEZE set, meaning that they're
not refrigerated during a suspend. This isn't right for some threads.
They should be frozen while suspending. The attached patch implements
per-kthread freezer flags. It does this by adding a new parameter to the
create_workqueue call and its siblings. The new parameter contains the
process flags relevant to suspending to be set. At the moment, this only
means PF_FREEZE, but when I send the freezer improvements, a
PF_SYNCTHREAD flag will also be valid here. The new parameter is passed
down through the calls and applied (after masking invalid bits) once the
thread is created.
Pavel has seen the code and requested that I send it.
Regards,
Nigel
diff -ruN linux-2.6.8-rc1-mm1/drivers/acpi/osl.c linux-2.6.8-rc1-mm1-kthread_refrigerator/drivers/acpi/osl.c
--- linux-2.6.8-rc1-mm1/drivers/acpi/osl.c 2004-07-28 16:37:46.000000000 +1000
+++ linux-2.6.8-rc1-mm1-kthread_refrigerator/drivers/acpi/osl.c 2004-07-28 16:43:48.000000000 +1000
@@ -81,7 +81,7 @@
return AE_NULL_ENTRY;
}
#endif
- kacpid_wq = create_singlethread_workqueue("kacpid");
+ kacpid_wq = create_singlethread_workqueue("kacpid", 0);
BUG_ON(!kacpid_wq);
return AE_OK;
diff -ruN linux-2.6.8-rc1-mm1/drivers/block/ll_rw_blk.c linux-2.6.8-rc1-mm1-kthread_refrigerator/drivers/block/ll_rw_blk.c
--- linux-2.6.8-rc1-mm1/drivers/block/ll_rw_blk.c 2004-07-28 16:37:46.000000000 +1000
+++ linux-2.6.8-rc1-mm1-kthread_refrigerator/drivers/block/ll_rw_blk.c 2004-07-28 16:43:48.000000000 +1000
@@ -2982,7 +2982,7 @@
int __init blk_dev_init(void)
{
- kblockd_workqueue = create_workqueue("kblockd");
+ kblockd_workqueue = create_workqueue("kblockd", PF_NOFREEZE);
if (!kblockd_workqueue)
panic("Failed to create kblockd\n");
diff -ruN linux-2.6.8-rc1-mm1/drivers/block/pktcdvd.c linux-2.6.8-rc1-mm1-kthread_refrigerator/drivers/block/pktcdvd.c
--- linux-2.6.8-rc1-mm1/drivers/block/pktcdvd.c 2004-07-28 16:37:46.000000000 +1000
+++ linux-2.6.8-rc1-mm1-kthread_refrigerator/drivers/block/pktcdvd.c 2004-07-28 16:59:22.000000000 +1000
@@ -2372,7 +2372,7 @@
pkt_init_queue(pd);
- pd->cdrw.thread = kthread_run(kcdrwd, pd, "%s", pd->name);
+ pd->cdrw.thread = kthread_run(kcdrwd, pd, "%s", 0, pd->name);
if (IS_ERR(pd->cdrw.thread)) {
printk("pktcdvd: can't start kernel thread\n");
ret = -ENOMEM;
diff -ruN linux-2.6.8-rc1-mm1/drivers/md/dm-crypt.c linux-2.6.8-rc1-mm1-kthread_refrigerator/drivers/md/dm-crypt.c
--- linux-2.6.8-rc1-mm1/drivers/md/dm-crypt.c 2004-05-19 22:10:27.000000000 +1000
+++ linux-2.6.8-rc1-mm1-kthread_refrigerator/drivers/md/dm-crypt.c 2004-07-28 16:43:48.000000000 +1000
@@ -758,7 +758,7 @@
if (!_crypt_io_pool)
return -ENOMEM;
- _kcryptd_workqueue = create_workqueue("kcryptd");
+ _kcryptd_workqueue = create_workqueue("kcryptd", PF_NOFREEZE);
if (!_kcryptd_workqueue) {
r = -ENOMEM;
DMERR(PFX "couldn't create kcryptd");
diff -ruN linux-2.6.8-rc1-mm1/drivers/md/dm-raid1.c linux-2.6.8-rc1-mm1-kthread_refrigerator/drivers/md/dm-raid1.c
--- linux-2.6.8-rc1-mm1/drivers/md/dm-raid1.c 2004-07-28 16:35:51.000000000 +1000
+++ linux-2.6.8-rc1-mm1-kthread_refrigerator/drivers/md/dm-raid1.c 2004-07-28 16:48:44.000000000 +1000
@@ -1238,7 +1238,7 @@
if (r)
return r;
- _kmirrord_wq = create_workqueue("kmirrord");
+ _kmirrord_wq = create_workqueue("kmirrord", PF_NOFREEZE);
if (!_kmirrord_wq) {
DMERR("couldn't start kmirrord");
dm_dirty_log_exit();
diff -ruN linux-2.6.8-rc1-mm1/drivers/md/kcopyd.c linux-2.6.8-rc1-mm1-kthread_refrigerator/drivers/md/kcopyd.c
--- linux-2.6.8-rc1-mm1/drivers/md/kcopyd.c 2004-07-28 16:37:50.000000000 +1000
+++ linux-2.6.8-rc1-mm1-kthread_refrigerator/drivers/md/kcopyd.c 2004-07-28 16:49:27.000000000 +1000
@@ -609,7 +609,7 @@
return r;
}
- _kcopyd_wq = create_singlethread_workqueue("kcopyd");
+ _kcopyd_wq = create_singlethread_workqueue("kcopyd", 0);
if (!_kcopyd_wq) {
jobs_exit();
up(&kcopyd_init_lock);
diff -ruN linux-2.6.8-rc1-mm1/drivers/net/wan/sdlamain.c linux-2.6.8-rc1-mm1-kthread_refrigerator/drivers/net/wan/sdlamain.c
--- linux-2.6.8-rc1-mm1/drivers/net/wan/sdlamain.c 2004-03-16 09:20:04.000000000 +1100
+++ linux-2.6.8-rc1-mm1-kthread_refrigerator/drivers/net/wan/sdlamain.c 2004-07-28 16:43:48.000000000 +1000
@@ -240,7 +240,7 @@
printk(KERN_INFO "%s v%u.%u %s\n",
fullname, DRV_VERSION, DRV_RELEASE, copyright);
- wanpipe_wq = create_workqueue("wanpipe_wq");
+ wanpipe_wq = create_workqueue("wanpipe_wq", 0);
if (!wanpipe_wq)
return -ENOMEM;
diff -ruN linux-2.6.8-rc1-mm1/drivers/s390/cio/device.c linux-2.6.8-rc1-mm1-kthread_refrigerator/drivers/s390/cio/device.c
--- linux-2.6.8-rc1-mm1/drivers/s390/cio/device.c 2004-06-18 12:44:07.000000000 +1000
+++ linux-2.6.8-rc1-mm1-kthread_refrigerator/drivers/s390/cio/device.c 2004-07-28 16:43:48.000000000 +1000
@@ -151,15 +151,16 @@
init_waitqueue_head(&ccw_device_init_wq);
atomic_set(&ccw_device_init_count, 0);
- ccw_device_work = create_singlethread_workqueue("cio");
+ ccw_device_work = create_singlethread_workqueue("cio", 0);
if (!ccw_device_work)
return -ENOMEM; /* FIXME: better errno ? */
- ccw_device_notify_work = create_singlethread_workqueue("cio_notify");
+ ccw_device_notify_work = create_singlethread_workqueue("cio_notify",
+ 0);
if (!ccw_device_notify_work) {
ret = -ENOMEM; /* FIXME: better errno ? */
goto out_err;
}
- slow_path_wq = create_singlethread_workqueue("kslowcrw");
+ slow_path_wq = create_singlethread_workqueue("kslowcrw", 0);
if (!slow_path_wq) {
ret = -ENOMEM; /* FIXME: better errno ? */
goto out_err;
diff -ruN linux-2.6.8-rc1-mm1/drivers/scsi/libata-core.c linux-2.6.8-rc1-mm1-kthread_refrigerator/drivers/scsi/libata-core.c
--- linux-2.6.8-rc1-mm1/drivers/scsi/libata-core.c 2004-07-28 16:37:54.000000000 +1000
+++ linux-2.6.8-rc1-mm1-kthread_refrigerator/drivers/scsi/libata-core.c 2004-07-28 16:43:48.000000000 +1000
@@ -3438,7 +3438,7 @@
static int __init ata_init(void)
{
- ata_wq = create_workqueue("ata");
+ ata_wq = create_workqueue("ata", PF_NOFREEZE);
if (!ata_wq)
return -ENOMEM;
diff -ruN linux-2.6.8-rc1-mm1/fs/aio.c linux-2.6.8-rc1-mm1-kthread_refrigerator/fs/aio.c
--- linux-2.6.8-rc1-mm1/fs/aio.c 2004-07-28 16:36:03.000000000 +1000
+++ linux-2.6.8-rc1-mm1-kthread_refrigerator/fs/aio.c 2004-07-28 16:43:48.000000000 +1000
@@ -69,7 +69,7 @@
kioctx_cachep = kmem_cache_create("kioctx", sizeof(struct kioctx),
0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL);
- aio_wq = create_workqueue("aio");
+ aio_wq = create_workqueue("aio", PF_NOFREEZE);
pr_debug("aio_setup: sizeof(struct page) = %d\n", (int)sizeof(struct page));
diff -ruN linux-2.6.8-rc1-mm1/fs/reiserfs/journal.c linux-2.6.8-rc1-mm1-kthread_refrigerator/fs/reiserfs/journal.c
--- linux-2.6.8-rc1-mm1/fs/reiserfs/journal.c 2004-07-28 16:37:59.000000000 +1000
+++ linux-2.6.8-rc1-mm1-kthread_refrigerator/fs/reiserfs/journal.c 2004-07-28 16:43:48.000000000 +1000
@@ -2483,7 +2483,7 @@
reiserfs_mounted_fs_count++ ;
if (reiserfs_mounted_fs_count <= 1)
- commit_wq = create_workqueue("reiserfs");
+ commit_wq = create_workqueue("reiserfs", 0);
INIT_WORK(&journal->j_work, flush_async_commits, p_s_sb);
return 0 ;
diff -ruN linux-2.6.8-rc1-mm1/fs/xfs/linux-2.6/xfs_buf.c linux-2.6.8-rc1-mm1-kthread_refrigerator/fs/xfs/linux-2.6/xfs_buf.c
--- linux-2.6.8-rc1-mm1/fs/xfs/linux-2.6/xfs_buf.c 2004-07-28 16:36:09.000000000 +1000
+++ linux-2.6.8-rc1-mm1-kthread_refrigerator/fs/xfs/linux-2.6/xfs_buf.c 2004-07-28 16:43:48.000000000 +1000
@@ -1746,11 +1746,11 @@
{
int rval;
- pagebuf_logio_workqueue = create_workqueue("xfslogd");
+ pagebuf_logio_workqueue = create_workqueue("xfslogd", 0);
if (!pagebuf_logio_workqueue)
return -ENOMEM;
- pagebuf_dataio_workqueue = create_workqueue("xfsdatad");
+ pagebuf_dataio_workqueue = create_workqueue("xfsdatad", 0);
if (!pagebuf_dataio_workqueue) {
destroy_workqueue(pagebuf_logio_workqueue);
return -ENOMEM;
diff -ruN linux-2.6.8-rc1-mm1/include/linux/kthread.h linux-2.6.8-rc1-mm1-kthread_refrigerator/include/linux/kthread.h
--- linux-2.6.8-rc1-mm1/include/linux/kthread.h 2004-07-08 12:03:28.000000000 +1000
+++ linux-2.6.8-rc1-mm1-kthread_refrigerator/include/linux/kthread.h 2004-07-28 16:56:38.000000000 +1000
@@ -25,20 +25,25 @@
*/
struct task_struct *kthread_create(int (*threadfn)(void *data),
void *data,
+ unsigned long freezer_flags,
const char namefmt[], ...);
/**
* kthread_run: create and wake a thread.
* @threadfn: the function to run until signal_pending(current).
* @data: data ptr for @threadfn.
+ * @freezer_flags: process flags that should be used for freezing.
+ * PF_NOFREEZE if also needed for writing the image.
+ * 0 otherwise.
* @namefmt: printf-style name for the thread.
*
* Description: Convenient wrapper for kthread_create() followed by
* wake_up_process(). Returns the kthread, or ERR_PTR(-ENOMEM). */
-#define kthread_run(threadfn, data, namefmt, ...) \
+#define kthread_run(threadfn, data, freezer_flags, namefmt, ...) \
({ \
struct task_struct *__k \
- = kthread_create(threadfn, data, namefmt, ## __VA_ARGS__); \
+ = kthread_create(threadfn, data, freezer_flags, \
+ namefmt, ## __VA_ARGS__); \
if (!IS_ERR(__k)) \
wake_up_process(__k); \
__k; \
diff -ruN linux-2.6.8-rc1-mm1/include/linux/workqueue.h linux-2.6.8-rc1-mm1-kthread_refrigerator/include/linux/workqueue.h
--- linux-2.6.8-rc1-mm1/include/linux/workqueue.h 2004-05-19 22:10:47.000000000 +1000
+++ linux-2.6.8-rc1-mm1-kthread_refrigerator/include/linux/workqueue.h 2004-07-28 16:43:48.000000000 +1000
@@ -51,9 +51,10 @@
} while (0)
extern struct workqueue_struct *__create_workqueue(const char *name,
- int singlethread);
-#define create_workqueue(name) __create_workqueue((name), 0)
-#define create_singlethread_workqueue(name) __create_workqueue((name), 1)
+ int singlethread,
+ unsigned long freezer_flag);
+#define create_workqueue(name, flags) __create_workqueue((name), 0, flags)
+#define create_singlethread_workqueue(name, flags) __create_workqueue((name), 1, flags)
extern void destroy_workqueue(struct workqueue_struct *wq);
diff -ruN linux-2.6.8-rc1-mm1/kernel/kmod.c linux-2.6.8-rc1-mm1-kthread_refrigerator/kernel/kmod.c
--- linux-2.6.8-rc1-mm1/kernel/kmod.c 2004-07-28 16:36:14.000000000 +1000
+++ linux-2.6.8-rc1-mm1-kthread_refrigerator/kernel/kmod.c 2004-07-28 16:43:48.000000000 +1000
@@ -274,7 +274,7 @@
static __init int usermodehelper_init(void)
{
- khelper_wq = create_singlethread_workqueue("khelper");
+ khelper_wq = create_singlethread_workqueue("khelper", 0);
BUG_ON(!khelper_wq);
return 0;
}
diff -ruN linux-2.6.8-rc1-mm1/kernel/kthread.c linux-2.6.8-rc1-mm1-kthread_refrigerator/kernel/kthread.c
--- linux-2.6.8-rc1-mm1/kernel/kthread.c 2004-07-28 16:36:14.000000000 +1000
+++ linux-2.6.8-rc1-mm1-kthread_refrigerator/kernel/kthread.c 2004-07-28 16:57:19.000000000 +1000
@@ -19,6 +19,7 @@
/* Information passed to kthread() from keventd. */
int (*threadfn)(void *data);
void *data;
+ unsigned long freezer_flags;
struct completion started;
/* Result passed back to kthread_create() from keventd. */
@@ -65,6 +66,7 @@
void *data;
sigset_t blocked;
int ret = -EINTR;
+ unsigned long flags_used;
kthread_exit_files();
@@ -80,6 +82,10 @@
/* By default we can run anywhere, unlike keventd. */
set_cpus_allowed(current, CPU_MASK_ALL);
+ /* Validate and set our freezer flags */
+ flags_used = create->freezer_flags & PF_NOFREEZE;
+ current->flags |= flags_used;
+
/* OK, tell user we're spawned, wait for stop or wakeup */
__set_current_state(TASK_INTERRUPTIBLE);
complete(&create->started);
@@ -115,6 +121,7 @@
struct task_struct *kthread_create(int (*threadfn)(void *data),
void *data,
+ unsigned long freezer_flags,
const char namefmt[],
...)
{
@@ -123,6 +130,7 @@
create.threadfn = threadfn;
create.data = data;
+ create.freezer_flags = freezer_flags;
init_completion(&create.started);
init_completion(&create.done);
diff -ruN linux-2.6.8-rc1-mm1/kernel/sched.c linux-2.6.8-rc1-mm1-kthread_refrigerator/kernel/sched.c
--- linux-2.6.8-rc1-mm1/kernel/sched.c 2004-07-28 16:38:05.000000000 +1000
+++ linux-2.6.8-rc1-mm1-kthread_refrigerator/kernel/sched.c 2004-07-28 16:43:48.000000000 +1000
@@ -3550,7 +3550,8 @@
switch (action) {
case CPU_UP_PREPARE:
- p = kthread_create(migration_thread, hcpu, "migration/%d",cpu);
+ p = kthread_create(migration_thread, hcpu, 0,
+ "migration/%d",cpu);
if (IS_ERR(p))
return NOTIFY_BAD;
p->flags |= PF_NOFREEZE;
diff -ruN linux-2.6.8-rc1-mm1/kernel/softirq.c linux-2.6.8-rc1-mm1-kthread_refrigerator/kernel/softirq.c
--- linux-2.6.8-rc1-mm1/kernel/softirq.c 2004-05-19 22:10:48.000000000 +1000
+++ linux-2.6.8-rc1-mm1-kthread_refrigerator/kernel/softirq.c 2004-07-28 16:43:48.000000000 +1000
@@ -425,7 +425,7 @@
case CPU_UP_PREPARE:
BUG_ON(per_cpu(tasklet_vec, hotcpu).list);
BUG_ON(per_cpu(tasklet_hi_vec, hotcpu).list);
- p = kthread_create(ksoftirqd, hcpu, "ksoftirqd/%d", hotcpu);
+ p = kthread_create(ksoftirqd, hcpu, 0, "ksoftirqd/%d", hotcpu);
if (IS_ERR(p)) {
printk("ksoftirqd for %i failed\n", hotcpu);
return NOTIFY_BAD;
diff -ruN linux-2.6.8-rc1-mm1/kernel/stop_machine.c linux-2.6.8-rc1-mm1-kthread_refrigerator/kernel/stop_machine.c
--- linux-2.6.8-rc1-mm1/kernel/stop_machine.c 2004-05-19 22:10:48.000000000 +1000
+++ linux-2.6.8-rc1-mm1-kthread_refrigerator/kernel/stop_machine.c 2004-07-28 16:43:48.000000000 +1000
@@ -174,7 +174,7 @@
if (cpu == NR_CPUS)
cpu = smp_processor_id();
- p = kthread_create(do_stop, &smdata, "kstopmachine");
+ p = kthread_create(do_stop, &smdata, 0, "kstopmachine");
if (!IS_ERR(p)) {
kthread_bind(p, cpu);
wake_up_process(p);
diff -ruN linux-2.6.8-rc1-mm1/kernel/workqueue.c linux-2.6.8-rc1-mm1-kthread_refrigerator/kernel/workqueue.c
--- linux-2.6.8-rc1-mm1/kernel/workqueue.c 2004-06-18 12:44:22.000000000 +1000
+++ linux-2.6.8-rc1-mm1-kthread_refrigerator/kernel/workqueue.c 2004-07-28 16:43:48.000000000 +1000
@@ -25,6 +25,7 @@
#include <linux/cpu.h>
#include <linux/notifier.h>
#include <linux/kthread.h>
+#include <linux/suspend.h>
/*
* The per-CPU workqueue (if single thread, we always use cpu 0's).
@@ -186,8 +187,6 @@
struct k_sigaction sa;
sigset_t blocked;
- current->flags |= PF_NOFREEZE;
-
set_user_nice(current, -10);
/* Block and flush all signals */
@@ -208,6 +207,8 @@
schedule();
else
__set_current_state(TASK_RUNNING);
+ if (current->flags & PF_FREEZE)
+ refrigerator(PF_FREEZE);
remove_wait_queue(&cwq->more_work, &wait);
if (!list_empty(&cwq->worklist))
@@ -277,7 +278,8 @@
}
static struct task_struct *create_workqueue_thread(struct workqueue_struct *wq,
- int cpu)
+ int cpu,
+ unsigned long freezer_flags)
{
struct cpu_workqueue_struct *cwq = wq->cpu_wq + cpu;
struct task_struct *p;
@@ -292,9 +294,11 @@
init_waitqueue_head(&cwq->work_done);
if (is_single_threaded(wq))
- p = kthread_create(worker_thread, cwq, "%s", wq->name);
+ p = kthread_create(worker_thread, cwq, freezer_flags,
+ "%s", wq->name);
else
- p = kthread_create(worker_thread, cwq, "%s/%d", wq->name, cpu);
+ p = kthread_create(worker_thread, cwq, freezer_flags,
+ "%s/%d", wq->name, cpu);
if (IS_ERR(p))
return NULL;
cwq->thread = p;
@@ -302,7 +306,8 @@
}
struct workqueue_struct *__create_workqueue(const char *name,
- int singlethread)
+ int singlethread,
+ unsigned long freezer_flags)
{
int cpu, destroy = 0;
struct workqueue_struct *wq;
@@ -320,7 +325,7 @@
lock_cpu_hotplug();
if (singlethread) {
INIT_LIST_HEAD(&wq->list);
- p = create_workqueue_thread(wq, 0);
+ p = create_workqueue_thread(wq, 0, freezer_flags);
if (!p)
destroy = 1;
else
@@ -330,7 +335,7 @@
list_add(&wq->list, &workqueues);
spin_unlock(&workqueue_lock);
for_each_online_cpu(cpu) {
- p = create_workqueue_thread(wq, cpu);
+ p = create_workqueue_thread(wq, cpu, freezer_flags);
if (p) {
kthread_bind(p, cpu);
wake_up_process(p);
@@ -493,7 +498,7 @@
void init_workqueues(void)
{
hotcpu_notifier(workqueue_cpu_callback, 0);
- keventd_wq = create_workqueue("events");
+ keventd_wq = create_workqueue("events", 0);
BUG_ON(!keventd_wq);
}
diff -ruN linux-2.6.8-rc1-mm1/mm/pdflush.c linux-2.6.8-rc1-mm1-kthread_refrigerator/mm/pdflush.c
--- linux-2.6.8-rc1-mm1/mm/pdflush.c 2004-05-19 22:10:48.000000000 +1000
+++ linux-2.6.8-rc1-mm1-kthread_refrigerator/mm/pdflush.c 2004-07-28 16:43:48.000000000 +1000
@@ -215,7 +215,7 @@
static void start_one_pdflush_thread(void)
{
- kthread_run(pdflush, NULL, "pdflush");
+ kthread_run(pdflush, NULL, 0, "pdflush");
}
static int __init pdflush_init(void)
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Patch] Per kthread freezer flags
2004-07-28 7:22 [Patch] Per kthread freezer flags Nigel Cunningham
@ 2004-07-28 21:20 ` Andrew Morton
2004-07-28 22:25 ` Nigel Cunningham
2004-07-28 22:30 ` Felipe Alfaro Solana
2004-07-29 19:04 ` Pavel Machek
1 sibling, 2 replies; 24+ messages in thread
From: Andrew Morton @ 2004-07-28 21:20 UTC (permalink / raw)
To: ncunningham; +Cc: linux-kernel
Nigel Cunningham <ncunningham@linuxmail.org> wrote:
>
> At the moment, all kthreads have PF_NOFREEZE set, meaning that they're
> not refrigerated during a suspend. This isn't right for some threads.
> They should be frozen while suspending. The attached patch implements
> per-kthread freezer flags. It does this by adding a new parameter to the
> create_workqueue call and its siblings. The new parameter contains the
> process flags relevant to suspending to be set. At the moment, this only
> means PF_FREEZE, but when I send the freezer improvements, a
> PF_SYNCTHREAD flag will also be valid here. The new parameter is passed
> down through the calls and applied (after masking invalid bits) once the
> thread is created.
>
> Pavel has seen the code and requested that I send it.
>
> Regards,
>
> Nigel
>
> diff -ruN linux-2.6.8-rc1-mm1/drivers/acpi/osl.c linux-2.6.8-rc1-mm1-kthread_refrigerator/drivers/acpi/osl.c
> --- linux-2.6.8-rc1-mm1/drivers/acpi/osl.c 2004-07-28 16:37:46.000000000 +1000
> +++ linux-2.6.8-rc1-mm1-kthread_refrigerator/drivers/acpi/osl.c 2004-07-28 16:43:48.000000000 +1000
> @@ -81,7 +81,7 @@
> return AE_NULL_ENTRY;
> }
> #endif
> - kacpid_wq = create_singlethread_workqueue("kacpid");
> + kacpid_wq = create_singlethread_workqueue("kacpid", 0);
hm. In some ways I'd prefer to see new
create_singlethread_workqueue_freezer(char *) or whatever, rather than
adding an extra argument. That's neater, smaller code and
forward-compatible.
But then again, the advantage of breaking the build for unconverted code is
that it makes people think about what their threads should be doing, so
let's go your way.
The one concern I'd have is that $RANDOM_KERNEL_DEVELOPER probably doesn't
have a clue whether or not his kernel thread should be setting PF_NOFREEZE.
What are the guidelines here?
wrt your "Add missing refrigerator support" patch: I'll suck that up, but
be aware that there's a big i2o patch in -mm which basically rips out the
driver which you just fixed up. Perhaps you can send Markus Lidel
<Markus.Lidel@shadowconnect.com> and I a fix for that version of the driver
sometime?
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Patch] Per kthread freezer flags
2004-07-28 21:20 ` Andrew Morton
@ 2004-07-28 22:25 ` Nigel Cunningham
2004-07-28 22:30 ` Felipe Alfaro Solana
1 sibling, 0 replies; 24+ messages in thread
From: Nigel Cunningham @ 2004-07-28 22:25 UTC (permalink / raw)
To: Andrew Morton; +Cc: Linux Kernel Mailing List
Hi.
On Thu, 2004-07-29 at 07:20, Andrew Morton wrote:
> hm. In some ways I'd prefer to see new
> create_singlethread_workqueue_freezer(char *) or whatever, rather than
> adding an extra argument. That's neater, smaller code and
> forward-compatible.
>
> But then again, the advantage of breaking the build for unconverted code is
> that it makes people think about what their threads should be doing, so
> let's go your way.
>
> The one concern I'd have is that $RANDOM_KERNEL_DEVELOPER probably doesn't
> have a clue whether or not his kernel thread should be setting PF_NOFREEZE.
> What are the guidelines here?
If a process might be/is needed to get the image to the storage device,
it should be NOFREEZE. (Thus, USB threads might be NOFREEZE to allow for
USB storage, likewise for SCSI). When I get an NFS writer done, the
threads for network cards could probably be made NOFREEZE too. Things
like kjournald don't need to run during suspend (even if we're writing
to a swapfile in an ext3 partition), so can be 0 for now (SYNCTHREAD
later).
> wrt your "Add missing refrigerator support" patch: I'll suck that up, but
> be aware that there's a big i2o patch in -mm which basically rips out the
> driver which you just fixed up. Perhaps you can send Markus Lidel
> <Markus.Lidel@shadowconnect.com> and I a fix for that version of the driver
> sometime?
I've just started following your mm patches, and will do updates for
last nights release shortly.
Regards,
Nigel
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Patch] Per kthread freezer flags
2004-07-28 22:30 ` Felipe Alfaro Solana
@ 2004-07-28 22:27 ` Nigel Cunningham
2004-07-28 22:36 ` Nigel Cunningham
1 sibling, 0 replies; 24+ messages in thread
From: Nigel Cunningham @ 2004-07-28 22:27 UTC (permalink / raw)
To: Felipe Alfaro Solana; +Cc: Andrew Morton, Linux Kernel Mailing List
Hi.
On Thu, 2004-07-29 at 08:30, Felipe Alfaro Solana wrote:
> On Wed, 2004-07-28 at 14:20 -0700, Andrew Morton wrote:
>
> > wrt your "Add missing refrigerator support" patch: I'll suck that up, but
> > be aware that there's a big i2o patch in -mm which basically rips out the
> > driver which you just fixed up. Perhaps you can send Markus Lidel
> > <Markus.Lidel@shadowconnect.com> and I a fix for that version of the driver
> > sometime?
>
> BTW, the "Add missing refrigerator support" breaks ACPI S3 and S4
> support for me (2.6.8-rc2-bk7) and my laptop (NEC Chrom@). When
> resuming, my 3c59x CardBus NIC is not powered up forcing me to eject it,
> then plug it again.
Hmm. I'll take a look. Those patches are straight out of current
suspend2 and have been in there for some time. Perhaps I just don't have
any users who have that config.
Regards,
Nigel
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Patch] Per kthread freezer flags
2004-07-28 21:20 ` Andrew Morton
2004-07-28 22:25 ` Nigel Cunningham
@ 2004-07-28 22:30 ` Felipe Alfaro Solana
2004-07-28 22:27 ` Nigel Cunningham
2004-07-28 22:36 ` Nigel Cunningham
1 sibling, 2 replies; 24+ messages in thread
From: Felipe Alfaro Solana @ 2004-07-28 22:30 UTC (permalink / raw)
To: Andrew Morton; +Cc: ncunningham, linux-kernel
On Wed, 2004-07-28 at 14:20 -0700, Andrew Morton wrote:
> wrt your "Add missing refrigerator support" patch: I'll suck that up, but
> be aware that there's a big i2o patch in -mm which basically rips out the
> driver which you just fixed up. Perhaps you can send Markus Lidel
> <Markus.Lidel@shadowconnect.com> and I a fix for that version of the driver
> sometime?
BTW, the "Add missing refrigerator support" breaks ACPI S3 and S4
support for me (2.6.8-rc2-bk7) and my laptop (NEC Chrom@). When
resuming, my 3c59x CardBus NIC is not powered up forcing me to eject it,
then plug it again.
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Patch] Per kthread freezer flags
2004-07-28 22:30 ` Felipe Alfaro Solana
2004-07-28 22:27 ` Nigel Cunningham
@ 2004-07-28 22:36 ` Nigel Cunningham
2004-07-28 23:21 ` Felipe Alfaro Solana
1 sibling, 1 reply; 24+ messages in thread
From: Nigel Cunningham @ 2004-07-28 22:36 UTC (permalink / raw)
To: Felipe Alfaro Solana; +Cc: Andrew Morton, Linux Kernel Mailing List
Hi again.
On Thu, 2004-07-29 at 08:30, Felipe Alfaro Solana wrote:
> On Wed, 2004-07-28 at 14:20 -0700, Andrew Morton wrote:
>
> > wrt your "Add missing refrigerator support" patch: I'll suck that up, but
> > be aware that there's a big i2o patch in -mm which basically rips out the
> > driver which you just fixed up. Perhaps you can send Markus Lidel
> > <Markus.Lidel@shadowconnect.com> and I a fix for that version of the driver
> > sometime?
>
> BTW, the "Add missing refrigerator support" breaks ACPI S3 and S4
> support for me (2.6.8-rc2-bk7) and my laptop (NEC Chrom@). When
> resuming, my 3c59x CardBus NIC is not powered up forcing me to eject it,
> then plug it again.
Looking again at the patch, I'm not sure which diff would be relevant to
you. When the card is running, do you have a kIrDAd thread?
Regards,
Nigel
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Patch] Per kthread freezer flags
2004-07-28 22:36 ` Nigel Cunningham
@ 2004-07-28 23:21 ` Felipe Alfaro Solana
2004-07-29 0:46 ` Nigel Cunningham
0 siblings, 1 reply; 24+ messages in thread
From: Felipe Alfaro Solana @ 2004-07-28 23:21 UTC (permalink / raw)
To: ncunningham; +Cc: Andrew Morton, Linux Kernel Mailing List
On Thu, 2004-07-29 at 08:36 +1000, Nigel Cunningham wrote:
> Hi again.
>
> On Thu, 2004-07-29 at 08:30, Felipe Alfaro Solana wrote:
> > On Wed, 2004-07-28 at 14:20 -0700, Andrew Morton wrote:
> >
> > > wrt your "Add missing refrigerator support" patch: I'll suck that up, but
> > > be aware that there's a big i2o patch in -mm which basically rips out the
> > > driver which you just fixed up. Perhaps you can send Markus Lidel
> > > <Markus.Lidel@shadowconnect.com> and I a fix for that version of the driver
> > > sometime?
> >
> > BTW, the "Add missing refrigerator support" breaks ACPI S3 and S4
> > support for me (2.6.8-rc2-bk7) and my laptop (NEC Chrom@). When
> > resuming, my 3c59x CardBus NIC is not powered up forcing me to eject it,
> > then plug it again.
>
> Looking again at the patch, I'm not sure which diff would be relevant to
> you. When the card is running, do you have a kIrDAd thread?
kirdad? No... That sounds like Infrared which my laptop does not have.
Here is a digest of ps -axf:
PID TTY STAT TIME COMMAND
1 ? S 0:00 init [5]
2 ? S< 0:03 [irqd/0]
3 ? S< 0:00 [events/0]
4 ? S< 0:00 \_ [khelper]
5 ? S< 0:00 \_ [kacpid]
22 ? S< 0:00 \_ [kblockd/0]
32 ? S 0:00 \_ [pdflush]
33 ? S 0:00 \_ [pdflush]
35 ? S< 0:00 \_ [aio/0]
36 ? S< 0:00 \_ [xfslogd/0]
37 ? S< 0:00 \_ [xfsdatad/0]
34 ? S 0:00 [kswapd0]
38 ? S 0:00 [xfsbufd]
120 ? S 0:00 [kseriod]
125 ? S 0:00 [xfssyncd]
273 ? Ss 0:00 minilogd
286 ? S 0:00 [xfssyncd]
287 ? S 0:00 [xfssyncd]
567 ? S 0:00 [khubd]
871 ? S 0:00 [pccardd]
877 ? S 0:00 [pccardd]
Anything else? :-)
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Patch] Per kthread freezer flags
2004-07-28 23:21 ` Felipe Alfaro Solana
@ 2004-07-29 0:46 ` Nigel Cunningham
2004-07-29 10:02 ` Felipe Alfaro Solana
2004-07-29 22:57 ` Felipe Alfaro Solana
0 siblings, 2 replies; 24+ messages in thread
From: Nigel Cunningham @ 2004-07-29 0:46 UTC (permalink / raw)
To: Felipe Alfaro Solana; +Cc: Andrew Morton, Linux Kernel Mailing List
Hi.
On Thu, 2004-07-29 at 09:21, Felipe Alfaro Solana wrote:
> kirdad? No... That sounds like Infrared which my laptop does not have.
Did to me too. I was clutching at straws. :>
> Here is a digest of ps -axf:
>
> PID TTY STAT TIME COMMAND
> 1 ? S 0:00 init [5]
> 2 ? S< 0:03 [irqd/0]
> 3 ? S< 0:00 [events/0]
> 4 ? S< 0:00 \_ [khelper]
> 5 ? S< 0:00 \_ [kacpid]
> 22 ? S< 0:00 \_ [kblockd/0]
> 32 ? S 0:00 \_ [pdflush]
> 33 ? S 0:00 \_ [pdflush]
> 35 ? S< 0:00 \_ [aio/0]
> 36 ? S< 0:00 \_ [xfslogd/0]
> 37 ? S< 0:00 \_ [xfsdatad/0]
> 34 ? S 0:00 [kswapd0]
> 38 ? S 0:00 [xfsbufd]
> 120 ? S 0:00 [kseriod]
> 125 ? S 0:00 [xfssyncd]
> 273 ? Ss 0:00 minilogd
> 286 ? S 0:00 [xfssyncd]
> 287 ? S 0:00 [xfssyncd]
> 567 ? S 0:00 [khubd]
> 871 ? S 0:00 [pccardd]
> 877 ? S 0:00 [pccardd]
It doesn't look like I've touched any of those threads. I have doubts
about irqd/0 (is that kirqd reworked?), so you might try making setting
PF_NOFREEZE and seeing if it makes a difference. I haven't done the
switch to rc2-mm1 yet, so haven't gotten to those issues.
Nigel
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Patch] Per kthread freezer flags
2004-07-29 0:46 ` Nigel Cunningham
@ 2004-07-29 10:02 ` Felipe Alfaro Solana
2004-07-29 12:11 ` Nigel Cunningham
2004-07-29 22:57 ` Felipe Alfaro Solana
1 sibling, 1 reply; 24+ messages in thread
From: Felipe Alfaro Solana @ 2004-07-29 10:02 UTC (permalink / raw)
To: ncunningham; +Cc: Andrew Morton, Linux Kernel Mailing List
On Thu, 2004-07-29 at 10:46 +1000, Nigel Cunningham wrote:
> Hi.
>
> On Thu, 2004-07-29 at 09:21, Felipe Alfaro Solana wrote:
> > kirdad? No... That sounds like Infrared which my laptop does not have.
>
> Did to me too. I was clutching at straws. :>
>
> > Here is a digest of ps -axf:
> >
> > PID TTY STAT TIME COMMAND
> > 1 ? S 0:00 init [5]
> > 2 ? S< 0:03 [irqd/0]
> > 3 ? S< 0:00 [events/0]
> > 4 ? S< 0:00 \_ [khelper]
> > 5 ? S< 0:00 \_ [kacpid]
> > 22 ? S< 0:00 \_ [kblockd/0]
> > 32 ? S 0:00 \_ [pdflush]
> > 33 ? S 0:00 \_ [pdflush]
> > 35 ? S< 0:00 \_ [aio/0]
> > 36 ? S< 0:00 \_ [xfslogd/0]
> > 37 ? S< 0:00 \_ [xfsdatad/0]
> > 34 ? S 0:00 [kswapd0]
> > 38 ? S 0:00 [xfsbufd]
> > 120 ? S 0:00 [kseriod]
> > 125 ? S 0:00 [xfssyncd]
> > 273 ? Ss 0:00 minilogd
> > 286 ? S 0:00 [xfssyncd]
> > 287 ? S 0:00 [xfssyncd]
> > 567 ? S 0:00 [khubd]
> > 871 ? S 0:00 [pccardd]
> > 877 ? S 0:00 [pccardd]
>
> It doesn't look like I've touched any of those threads. I have doubts
> about irqd/0 (is that kirqd reworked?), so you might try making setting
> PF_NOFREEZE and seeing if it makes a difference. I haven't done the
> switch to rc2-mm1 yet, so haven't gotten to those issues.
kirqd is voluntary-preempt patch by Ingo Molnar. I have also applied
several other patches, like Con's Staircase scheduler policy and some
latency fixes.
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Patch] Per kthread freezer flags
2004-07-29 10:02 ` Felipe Alfaro Solana
@ 2004-07-29 12:11 ` Nigel Cunningham
2004-07-29 16:10 ` Felipe Alfaro Solana
0 siblings, 1 reply; 24+ messages in thread
From: Nigel Cunningham @ 2004-07-29 12:11 UTC (permalink / raw)
To: Felipe Alfaro Solana; +Cc: Andrew Morton, Linux Kernel Mailing List
Hi.
On Thu, 2004-07-29 at 20:02, Felipe Alfaro Solana wrote:
> > It doesn't look like I've touched any of those threads. I have doubts
> > about irqd/0 (is that kirqd reworked?), so you might try making setting
> > PF_NOFREEZE and seeing if it makes a difference. I haven't done the
> > switch to rc2-mm1 yet, so haven't gotten to those issues.
>
> kirqd is voluntary-preempt patch by Ingo Molnar. I have also applied
> several other patches, like Con's Staircase scheduler policy and some
> latency fixes.
Okay. So, just to make sure I understand you correctly, suspending works
fine with all of these other patches added and adding the extra
refrigerator calls breaks it. Are you at all able to narrow it down to a
particular change?
Regards,
Nigel
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Patch] Per kthread freezer flags
2004-07-29 12:11 ` Nigel Cunningham
@ 2004-07-29 16:10 ` Felipe Alfaro Solana
2004-07-29 22:39 ` Nigel Cunningham
0 siblings, 1 reply; 24+ messages in thread
From: Felipe Alfaro Solana @ 2004-07-29 16:10 UTC (permalink / raw)
To: ncunningham; +Cc: Andrew Morton, Linux Kernel Mailing List
On Thu, 2004-07-29 at 22:11 +1000, Nigel Cunningham wrote:
> Hi.
>
> On Thu, 2004-07-29 at 20:02, Felipe Alfaro Solana wrote:
> > > It doesn't look like I've touched any of those threads. I have doubts
> > > about irqd/0 (is that kirqd reworked?), so you might try making setting
> > > PF_NOFREEZE and seeing if it makes a difference. I haven't done the
> > > switch to rc2-mm1 yet, so haven't gotten to those issues.
> >
> > kirqd is voluntary-preempt patch by Ingo Molnar. I have also applied
> > several other patches, like Con's Staircase scheduler policy and some
> > latency fixes.
>
> Okay. So, just to make sure I understand you correctly, suspending works
> fine with all of these other patches added and adding the extra
> refrigerator calls breaks it. Are you at all able to narrow it down to a
> particular change?
Exactly! I'm currently running a highly patched kernel based on 2.6.8-
rc2-bk7 plus Con's work and Ingo's voluntary preempt. They work fine
when suspending to memory (S3) and to disk (S4 via swsusp), but adding
your kthread freezer flags to the mix keeps my CardBus NIC from being
recognized when resuming from S3: I need to unplug it, then plug it to
make it functional again.
However, I'm not sure what causes this behavior.
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Patch] Per kthread freezer flags
2004-07-28 7:22 [Patch] Per kthread freezer flags Nigel Cunningham
2004-07-28 21:20 ` Andrew Morton
@ 2004-07-29 19:04 ` Pavel Machek
2004-07-29 22:24 ` Nigel Cunningham
1 sibling, 1 reply; 24+ messages in thread
From: Pavel Machek @ 2004-07-29 19:04 UTC (permalink / raw)
To: Nigel Cunningham; +Cc: Andrew Morton, Linux Kernel Mailing List
Hi!
> At the moment, all kthreads have PF_NOFREEZE set, meaning that they're
> not refrigerated during a suspend. This isn't right for some threads.
Looks good, but see comments below.
> --- linux-2.6.8-rc1-mm1/drivers/block/pktcdvd.c 2004-07-28 16:37:46.000000000 +1000
> +++ linux-2.6.8-rc1-mm1-kthread_refrigerator/drivers/block/pktcdvd.c 2004-07-28 16:59:22.000000000 +1000
> @@ -2372,7 +2372,7 @@
>
> pkt_init_queue(pd);
>
> - pd->cdrw.thread = kthread_run(kcdrwd, pd, "%s", pd->name);
> + pd->cdrw.thread = kthread_run(kcdrwd, pd, "%s", 0, pd->name);
> if (IS_ERR(pd->cdrw.thread)) {
> printk("pktcdvd: can't start kernel thread\n");
> ret = -ENOMEM;
What if someone does swapon /dev/pktdvd0?
> +++ linux-2.6.8-rc1-mm1-kthread_refrigerator/drivers/md/dm-raid1.c 2004-07-28 16:48:44.000000000 +1000
> @@ -1238,7 +1238,7 @@
> if (r)
> return r;
>
> - _kmirrord_wq = create_workqueue("kmirrord");
> + _kmirrord_wq = create_workqueue("kmirrord", PF_NOFREEZE);
> if (!_kmirrord_wq) {
> DMERR("couldn't start kmirrord");
> dm_dirty_log_exit();
I'm not 100% certain what kmirrord does, but we certainly do not
want raid array to be reconstructed while suspending.
linux-2.6.8-rc1-mm1-kthread_refrigerator/fs/aio.c
> --- linux-2.6.8-rc1-mm1/fs/aio.c 2004-07-28 16:36:03.000000000 +1000
> +++ linux-2.6.8-rc1-mm1-kthread_refrigerator/fs/aio.c 2004-07-28 16:43:48.000000000 +1000
> @@ -69,7 +69,7 @@
> kioctx_cachep = kmem_cache_create("kioctx", sizeof(struct kioctx),
> 0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL);
>
> - aio_wq = create_workqueue("aio");
> + aio_wq = create_workqueue("aio", PF_NOFREEZE);
>
> pr_debug("aio_setup: sizeof(struct page) = %d\n", (int)sizeof(struct page));
>
Are you sure? Unless swsusp itself uses aio, we want this to freeze.
linux-2.6.8-rc1-mm1-kthread_refrigerator/kernel/sched.c 2004-07-28 16:43:48.000000000 +1000
> @@ -3550,7 +3550,8 @@
>
> switch (action) {
> case CPU_UP_PREPARE:
> - p = kthread_create(migration_thread, hcpu, "migration/%d",cpu);
> + p = kthread_create(migration_thread, hcpu, 0,
> + "migration/%d",cpu);
> if (IS_ERR(p))
> return NOTIFY_BAD;
> p->flags |= PF_NOFREEZE;
Ugh, creating thread normally only to add PF_NOFREEZE 2 lines later
looks bad.
> +++ linux-2.6.8-rc1-mm1-kthread_refrigerator/kernel/softirq.c 2004-07-28 16:43:48.000000000 +1000
> @@ -425,7 +425,7 @@
> case CPU_UP_PREPARE:
> BUG_ON(per_cpu(tasklet_vec, hotcpu).list);
> BUG_ON(per_cpu(tasklet_hi_vec, hotcpu).list);
> - p = kthread_create(ksoftirqd, hcpu, "ksoftirqd/%d", hotcpu);
> + p = kthread_create(ksoftirqd, hcpu, 0, "ksoftirqd/%d", hotcpu);
> if (IS_ERR(p)) {
> printk("ksoftirqd for %i failed\n", hotcpu);
> return NOTIFY_BAD;
I guess softinterrupts may be neccessary for suspend... Random drivers may use
them, right?
Pavel
--
64 bytes from 195.113.31.123: icmp_seq=28 ttl=51 time=448769.1 ms
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Patch] Per kthread freezer flags
2004-07-29 19:04 ` Pavel Machek
@ 2004-07-29 22:24 ` Nigel Cunningham
2004-07-29 22:44 ` Pavel Machek
0 siblings, 1 reply; 24+ messages in thread
From: Nigel Cunningham @ 2004-07-29 22:24 UTC (permalink / raw)
To: Pavel Machek; +Cc: Andrew Morton, Linux Kernel Mailing List
Hi.
On Fri, 2004-07-30 at 05:04, Pavel Machek wrote:
> Hi!
>
> > At the moment, all kthreads have PF_NOFREEZE set, meaning that they're
> > not refrigerated during a suspend. This isn't right for some threads.
>
> Looks good, but see comments below.
> > --- linux-2.6.8-rc1-mm1/drivers/block/pktcdvd.c 2004-07-28 16:37:46.000000000 +1000
> > +++ linux-2.6.8-rc1-mm1-kthread_refrigerator/drivers/block/pktcdvd.c 2004-07-28 16:59:22.000000000 +1000
> > @@ -2372,7 +2372,7 @@
> >
> > pkt_init_queue(pd);
> >
> > - pd->cdrw.thread = kthread_run(kcdrwd, pd, "%s", pd->name);
> > + pd->cdrw.thread = kthread_run(kcdrwd, pd, "%s", 0, pd->name);
> > if (IS_ERR(pd->cdrw.thread)) {
> > printk("pktcdvd: can't start kernel thread\n");
> > ret = -ENOMEM;
>
> What if someone does swapon /dev/pktdvd0?
Sorry. That's my ignorance. I thought the packet writer was only for
writing :>
> > +++ linux-2.6.8-rc1-mm1-kthread_refrigerator/drivers/md/dm-raid1.c 2004-07-28 16:48:44.000000000 +1000
> > @@ -1238,7 +1238,7 @@
> > if (r)
> > return r;
> >
> > - _kmirrord_wq = create_workqueue("kmirrord");
> > + _kmirrord_wq = create_workqueue("kmirrord", PF_NOFREEZE);
> > if (!_kmirrord_wq) {
> > DMERR("couldn't start kmirrord");
> > dm_dirty_log_exit();
>
>
> I'm not 100% certain what kmirrord does, but we certainly do not
> want raid array to be reconstructed while suspending.
Mmm. Again, I plead picking it based on what I thought the code did. Can
we get an author to say which it should be?
> linux-2.6.8-rc1-mm1-kthread_refrigerator/fs/aio.c
> > --- linux-2.6.8-rc1-mm1/fs/aio.c 2004-07-28 16:36:03.000000000 +1000
> > +++ linux-2.6.8-rc1-mm1-kthread_refrigerator/fs/aio.c 2004-07-28 16:43:48.000000000 +1000
> > @@ -69,7 +69,7 @@
> > kioctx_cachep = kmem_cache_create("kioctx", sizeof(struct kioctx),
> > 0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL);
> >
> > - aio_wq = create_workqueue("aio");
> > + aio_wq = create_workqueue("aio", PF_NOFREEZE);
> >
> > pr_debug("aio_setup: sizeof(struct page) = %d\n", (int)sizeof(struct page));
> >
>
> Are you sure? Unless swsusp itself uses aio, we want this to freeze.
I think it was needed to get the writes happening. Even if its wrong, it
shouldn't matter as the only I/O pending should be what we're doing.
> linux-2.6.8-rc1-mm1-kthread_refrigerator/kernel/sched.c 2004-07-28 16:43:48.000000000 +1000
> > @@ -3550,7 +3550,8 @@
> >
> > switch (action) {
> > case CPU_UP_PREPARE:
> > - p = kthread_create(migration_thread, hcpu, "migration/%d",cpu);
> > + p = kthread_create(migration_thread, hcpu, 0,
> > + "migration/%d",cpu);
> > if (IS_ERR(p))
> > return NOTIFY_BAD;
> > p->flags |= PF_NOFREEZE;
>
> Ugh, creating thread normally only to add PF_NOFREEZE 2 lines later
> looks bad.
Yes. Tunnel vision! Humble apologies.
> > +++ linux-2.6.8-rc1-mm1-kthread_refrigerator/kernel/softirq.c 2004-07-28 16:43:48.000000000 +1000
> > @@ -425,7 +425,7 @@
> > case CPU_UP_PREPARE:
> > BUG_ON(per_cpu(tasklet_vec, hotcpu).list);
> > BUG_ON(per_cpu(tasklet_hi_vec, hotcpu).list);
> > - p = kthread_create(ksoftirqd, hcpu, "ksoftirqd/%d", hotcpu);
> > + p = kthread_create(ksoftirqd, hcpu, 0, "ksoftirqd/%d", hotcpu);
> > if (IS_ERR(p)) {
> > printk("ksoftirqd for %i failed\n", hotcpu);
> > return NOTIFY_BAD;
>
> I guess softinterrupts may be neccessary for suspend... Random drivers may use
> them, right?
I made this change at least a month ago and no one using suspend2 has
had any problems since, so perhaps not. Then again, with the voluntary
preemption (from what I've seen of comments about it) this would be a
definite yes.
Nigel
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Patch] Per kthread freezer flags
2004-07-29 16:10 ` Felipe Alfaro Solana
@ 2004-07-29 22:39 ` Nigel Cunningham
2004-07-30 8:12 ` Felipe Alfaro Solana
0 siblings, 1 reply; 24+ messages in thread
From: Nigel Cunningham @ 2004-07-29 22:39 UTC (permalink / raw)
To: Felipe Alfaro Solana; +Cc: Andrew Morton, Linux Kernel Mailing List
Hi.
On Fri, 2004-07-30 at 02:10, Felipe Alfaro Solana wrote:
> > Okay. So, just to make sure I understand you correctly, suspending works
> > fine with all of these other patches added and adding the extra
> > refrigerator calls breaks it. Are you at all able to narrow it down to a
> > particular change?
>
> Exactly! I'm currently running a highly patched kernel based on 2.6.8-
> rc2-bk7 plus Con's work and Ingo's voluntary preempt. They work fine
> when suspending to memory (S3) and to disk (S4 via swsusp), but adding
> your kthread freezer flags to the mix keeps my CardBus NIC from being
> recognized when resuming from S3: I need to unplug it, then plug it to
> make it functional again.
>
> However, I'm not sure what causes this behavior.
Could you please try reversing each of the changes in my patch until it
starts working? The NFS ones could be done all at once - they should be
irrelevant to you anyway IIRC.
Regards,
Nigel
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Patch] Per kthread freezer flags
2004-07-29 22:24 ` Nigel Cunningham
@ 2004-07-29 22:44 ` Pavel Machek
2004-07-29 22:46 ` Nigel Cunningham
` (2 more replies)
0 siblings, 3 replies; 24+ messages in thread
From: Pavel Machek @ 2004-07-29 22:44 UTC (permalink / raw)
To: Nigel Cunningham; +Cc: Andrew Morton, Linux Kernel Mailing List
Hi!
> > > - pd->cdrw.thread = kthread_run(kcdrwd, pd, "%s", pd->name);
> > > + pd->cdrw.thread = kthread_run(kcdrwd, pd, "%s", 0, pd->name);
> > > if (IS_ERR(pd->cdrw.thread)) {
> > > printk("pktcdvd: can't start kernel thread\n");
> > > ret = -ENOMEM;
> >
> > What if someone does swapon /dev/pktdvd0?
>
> Sorry. That's my ignorance. I thought the packet writer was only for
> writing :>
Well, swapon /dev/pktdvd would be *very* bad idea as optical drives
are very slow, but PF_NOFREEZE is more correct here.
> > > +++ linux-2.6.8-rc1-mm1-kthread_refrigerator/drivers/md/dm-raid1.c 2004-07-28 16:48:44.000000000 +1000
> > > @@ -1238,7 +1238,7 @@
> > > if (r)
> > > return r;
> > >
> > > - _kmirrord_wq = create_workqueue("kmirrord");
> > > + _kmirrord_wq = create_workqueue("kmirrord", PF_NOFREEZE);
> > > if (!_kmirrord_wq) {
> > > DMERR("couldn't start kmirrord");
> > > dm_dirty_log_exit();
> >
> >
> > I'm not 100% certain what kmirrord does, but we certainly do not
> > want raid array to be reconstructed while suspending.
>
> Mmm. Again, I plead picking it based on what I thought the code did. Can
> we get an author to say which it should be?
I'd make it stop to be safe, and see what happens ;-).
> > linux-2.6.8-rc1-mm1-kthread_refrigerator/fs/aio.c
> > > --- linux-2.6.8-rc1-mm1/fs/aio.c 2004-07-28 16:36:03.000000000 +1000
> > > +++ linux-2.6.8-rc1-mm1-kthread_refrigerator/fs/aio.c 2004-07-28 16:43:48.000000000 +1000
> > > @@ -69,7 +69,7 @@
> > > kioctx_cachep = kmem_cache_create("kioctx", sizeof(struct kioctx),
> > > 0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL);
> > >
> > > - aio_wq = create_workqueue("aio");
> > > + aio_wq = create_workqueue("aio", PF_NOFREEZE);
> > >
> > > pr_debug("aio_setup: sizeof(struct page) = %d\n", (int)sizeof(struct page));
> > >
> >
> > Are you sure? Unless swsusp itself uses aio, we want this to freeze.
>
> I think it was needed to get the writes happening. Even if its wrong, it
> shouldn't matter as the only I/O pending should be what we're doing.
I'm little bit nervous about this one. I'd make it stop, and see if it
breaks... From quick look at aio.c it really does *not* seem we need this.
> > > +++ linux-2.6.8-rc1-mm1-kthread_refrigerator/kernel/softirq.c 2004-07-28 16:43:48.000000000 +1000
> > > @@ -425,7 +425,7 @@
> > > case CPU_UP_PREPARE:
> > > BUG_ON(per_cpu(tasklet_vec, hotcpu).list);
> > > BUG_ON(per_cpu(tasklet_hi_vec, hotcpu).list);
> > > - p = kthread_create(ksoftirqd, hcpu, "ksoftirqd/%d", hotcpu);
> > > + p = kthread_create(ksoftirqd, hcpu, 0, "ksoftirqd/%d", hotcpu);
> > > if (IS_ERR(p)) {
> > > printk("ksoftirqd for %i failed\n", hotcpu);
> > > return NOTIFY_BAD;
> >
> > I guess softinterrupts may be neccessary for suspend... Random drivers may use
> > them, right?
>
> I made this change at least a month ago and no one using suspend2 has
> had any problems since, so perhaps not. Then again, with the voluntary
> preemption (from what I've seen of comments about it) this would be a
> definite yes.
Ok.
Pavel
--
People were complaining that M$ turns users into beta-testers...
...jr ghea gurz vagb qrirybcref, naq gurl frrz gb yvxr vg gung jnl!
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Patch] Per kthread freezer flags
2004-07-29 22:44 ` Pavel Machek
@ 2004-07-29 22:46 ` Nigel Cunningham
2004-07-29 23:25 ` [Patch] Per kthread freezer flags (Version 2) Nigel Cunningham
2004-07-30 12:11 ` [Patch] Per kthread freezer flags Peter Osterlund
2 siblings, 0 replies; 24+ messages in thread
From: Nigel Cunningham @ 2004-07-29 22:46 UTC (permalink / raw)
To: Pavel Machek; +Cc: Andrew Morton, Linux Kernel Mailing List
Hi.
On Fri, 2004-07-30 at 08:44, Pavel Machek wrote:
> Hi!
>
> > > > - pd->cdrw.thread = kthread_run(kcdrwd, pd, "%s", pd->name);
> > > > + pd->cdrw.thread = kthread_run(kcdrwd, pd, "%s", 0, pd->name);
> > > > if (IS_ERR(pd->cdrw.thread)) {
> > > > printk("pktcdvd: can't start kernel thread\n");
> > > > ret = -ENOMEM;
> > >
> > > What if someone does swapon /dev/pktdvd0?
> >
> > Sorry. That's my ignorance. I thought the packet writer was only for
> > writing :>
>
> Well, swapon /dev/pktdvd would be *very* bad idea as optical drives
> are very slow, but PF_NOFREEZE is more correct here.
Okay. I'll do a new patch for Andrew for this and the following
corrections.
[...]
> > >
> > > I guess softinterrupts may be neccessary for suspend... Random drivers may use
> > > them, right?
> >
> > I made this change at least a month ago and no one using suspend2 has
> > had any problems since, so perhaps not. Then again, with the voluntary
> > preemption (from what I've seen of comments about it) this would be a
> > definite yes.
>
> Ok.
Just in case I wasn't clear, by 'a definite yes', I mean you're
absolutely right - it should be NOFREEZE.
Regards,
Nigel
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Patch] Per kthread freezer flags
2004-07-29 0:46 ` Nigel Cunningham
2004-07-29 10:02 ` Felipe Alfaro Solana
@ 2004-07-29 22:57 ` Felipe Alfaro Solana
2004-07-29 23:01 ` Nigel Cunningham
1 sibling, 1 reply; 24+ messages in thread
From: Felipe Alfaro Solana @ 2004-07-29 22:57 UTC (permalink / raw)
To: ncunningham; +Cc: Andrew Morton, Linux Kernel Mailing List
On Thu, 2004-07-29 at 10:46 +1000, Nigel Cunningham wrote:
> Hi.
>
> On Thu, 2004-07-29 at 09:21, Felipe Alfaro Solana wrote:
> > kirdad? No... That sounds like Infrared which my laptop does not have.
>
> Did to me too. I was clutching at straws. :>
>
> > Here is a digest of ps -axf:
> >
> > PID TTY STAT TIME COMMAND
> > 1 ? S 0:00 init [5]
> > 2 ? S< 0:03 [irqd/0]
> > 3 ? S< 0:00 [events/0]
> > 4 ? S< 0:00 \_ [khelper]
> > 5 ? S< 0:00 \_ [kacpid]
> > 22 ? S< 0:00 \_ [kblockd/0]
> > 32 ? S 0:00 \_ [pdflush]
> > 33 ? S 0:00 \_ [pdflush]
> > 35 ? S< 0:00 \_ [aio/0]
> > 36 ? S< 0:00 \_ [xfslogd/0]
> > 37 ? S< 0:00 \_ [xfsdatad/0]
> > 34 ? S 0:00 [kswapd0]
> > 38 ? S 0:00 [xfsbufd]
> > 120 ? S 0:00 [kseriod]
> > 125 ? S 0:00 [xfssyncd]
> > 273 ? Ss 0:00 minilogd
> > 286 ? S 0:00 [xfssyncd]
> > 287 ? S 0:00 [xfssyncd]
> > 567 ? S 0:00 [khubd]
> > 871 ? S 0:00 [pccardd]
> > 877 ? S 0:00 [pccardd]
>
> It doesn't look like I've touched any of those threads. I have doubts
> about irqd/0 (is that kirqd reworked?), so you might try making setting
> PF_NOFREEZE and seeing if it makes a difference. I haven't done the
> switch to rc2-mm1 yet, so haven't gotten to those issues.
Well, I've tried the kthread freezer patch against 2.6.8-rc2-mm1 and it
works fine. However, with kthread freezer applied, suspending and
resuming is much slower (around 5 seconds slower). Thus, I guess all my
problems must be related to some specific patch I'm applying against the
current -bk tree.
I'll keep investigating this issue, but I think voluntary-preempt might
have some strange interactions with these kthread changes.
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Patch] Per kthread freezer flags
2004-07-29 22:57 ` Felipe Alfaro Solana
@ 2004-07-29 23:01 ` Nigel Cunningham
0 siblings, 0 replies; 24+ messages in thread
From: Nigel Cunningham @ 2004-07-29 23:01 UTC (permalink / raw)
To: Felipe Alfaro Solana; +Cc: Andrew Morton, Linux Kernel Mailing List
Hi.
On Fri, 2004-07-30 at 08:57, Felipe Alfaro Solana wrote:
> Well, I've tried the kthread freezer patch against 2.6.8-rc2-mm1 and it
> works fine. However, with kthread freezer applied, suspending and
> resuming is much slower (around 5 seconds slower). Thus, I guess all my
> problems must be related to some specific patch I'm applying against the
> current -bk tree.
Okay. That might be due to the treatment of ksoftirqd, which Pavel and I
have agreed needs changing.
> I'll keep investigating this issue, but I think voluntary-preempt might
> have some strange interactions with these kthread changes.
Me too, when I get a chance. I'm running rc2-mm1 now, and it seems okay.
Especially since I turned off USB 2 support in the BIOS :>
Nigel
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Patch] Per kthread freezer flags (Version 2)
2004-07-29 22:44 ` Pavel Machek
2004-07-29 22:46 ` Nigel Cunningham
@ 2004-07-29 23:25 ` Nigel Cunningham
2004-07-30 9:18 ` Pavel Machek
2004-07-31 16:53 ` Felipe Alfaro Solana
2004-07-30 12:11 ` [Patch] Per kthread freezer flags Peter Osterlund
2 siblings, 2 replies; 24+ messages in thread
From: Nigel Cunningham @ 2004-07-29 23:25 UTC (permalink / raw)
To: Pavel Machek; +Cc: Andrew Morton, Linux Kernel Mailing List
Okay.. how does this look?
I applied your changes and fixed a couple of typos I noticed. I also
added support for the hcvs thread, which is new since rc1-mm1. (This is
against rc2-mm1).
Regards,
Nigel
diff -ruN linux-2.6.8-rc2-mm1/drivers/acpi/osl.c linux-2.6.8-rc2-mm1-kthread_refrigerator_support/drivers/acpi/osl.c
--- linux-2.6.8-rc2-mm1/drivers/acpi/osl.c 2004-07-29 16:12:37.000000000 +1000
+++ linux-2.6.8-rc2-mm1-kthread_refrigerator_support/drivers/acpi/osl.c 2004-07-30 09:11:26.385389632 +1000
@@ -81,7 +81,7 @@
return AE_NULL_ENTRY;
}
#endif
- kacpid_wq = create_singlethread_workqueue("kacpid");
+ kacpid_wq = create_singlethread_workqueue("kacpid", 0);
BUG_ON(!kacpid_wq);
return AE_OK;
diff -ruN linux-2.6.8-rc2-mm1/drivers/block/ll_rw_blk.c linux-2.6.8-rc2-mm1-kthread_refrigerator_support/drivers/block/ll_rw_blk.c
--- linux-2.6.8-rc2-mm1/drivers/block/ll_rw_blk.c 2004-07-29 16:12:37.000000000 +1000
+++ linux-2.6.8-rc2-mm1-kthread_refrigerator_support/drivers/block/ll_rw_blk.c 2004-07-30 09:11:26.400387352 +1000
@@ -2998,7 +2998,7 @@
int __init blk_dev_init(void)
{
- kblockd_workqueue = create_workqueue("kblockd");
+ kblockd_workqueue = create_workqueue("kblockd", PF_NOFREEZE);
if (!kblockd_workqueue)
panic("Failed to create kblockd\n");
diff -ruN linux-2.6.8-rc2-mm1/drivers/block/pktcdvd.c linux-2.6.8-rc2-mm1-kthread_refrigerator_support/drivers/block/pktcdvd.c
--- linux-2.6.8-rc2-mm1/drivers/block/pktcdvd.c 2004-07-29 16:12:37.000000000 +1000
+++ linux-2.6.8-rc2-mm1-kthread_refrigerator_support/drivers/block/pktcdvd.c 2004-07-30 09:16:12.831843152 +1000
@@ -2350,7 +2350,7 @@
pkt_init_queue(pd);
- pd->cdrw.thread = kthread_run(kcdrwd, pd, "%s", pd->name);
+ pd->cdrw.thread = kthread_run(kcdrwd, pd, PF_NOFREEZE, "%s", pd->name);
if (IS_ERR(pd->cdrw.thread)) {
printk("pktcdvd: can't start kernel thread\n");
ret = -ENOMEM;
diff -ruN linux-2.6.8-rc2-mm1/drivers/char/hvcs.c linux-2.6.8-rc2-mm1-kthread_refrigerator_support/drivers/char/hvcs.c
--- linux-2.6.8-rc2-mm1/drivers/char/hvcs.c 2004-07-29 16:12:37.000000000 +1000
+++ linux-2.6.8-rc2-mm1-kthread_refrigerator_support/drivers/char/hvcs.c 2004-07-30 09:19:23.912794432 +1000
@@ -1218,7 +1218,7 @@
hvcs_pi_lock = SPIN_LOCK_UNLOCKED;
hvcs_pi_buff = kmalloc(PAGE_SIZE, GFP_KERNEL);
- hvcs_task = kthread_run(khvcsd, NULL, "khvcsd");
+ hvcs_task = kthread_run(khvcsd, NULL, PF_NOFREEZE, "khvcsd");
if (IS_ERR(hvcs_task)) {
printk("khvcsd creation failed. Driver not loaded.\n");
kfree(hvcs_pi_buff);
diff -ruN linux-2.6.8-rc2-mm1/drivers/md/dm-crypt.c linux-2.6.8-rc2-mm1-kthread_refrigerator_support/drivers/md/dm-crypt.c
--- linux-2.6.8-rc2-mm1/drivers/md/dm-crypt.c 2004-05-19 22:10:27.000000000 +1000
+++ linux-2.6.8-rc2-mm1-kthread_refrigerator_support/drivers/md/dm-crypt.c 2004-07-30 09:11:26.414385224 +1000
@@ -758,7 +758,7 @@
if (!_crypt_io_pool)
return -ENOMEM;
- _kcryptd_workqueue = create_workqueue("kcryptd");
+ _kcryptd_workqueue = create_workqueue("kcryptd", PF_NOFREEZE);
if (!_kcryptd_workqueue) {
r = -ENOMEM;
DMERR(PFX "couldn't create kcryptd");
diff -ruN linux-2.6.8-rc2-mm1/drivers/md/dm-raid1.c linux-2.6.8-rc2-mm1-kthread_refrigerator_support/drivers/md/dm-raid1.c
--- linux-2.6.8-rc2-mm1/drivers/md/dm-raid1.c 2004-07-29 16:11:32.000000000 +1000
+++ linux-2.6.8-rc2-mm1-kthread_refrigerator_support/drivers/md/dm-raid1.c 2004-07-30 09:11:26.426383400 +1000
@@ -1238,7 +1238,7 @@
if (r)
return r;
- _kmirrord_wq = create_workqueue("kmirrord");
+ _kmirrord_wq = create_workqueue("kmirrord", 0);
if (!_kmirrord_wq) {
DMERR("couldn't start kmirrord");
dm_dirty_log_exit();
diff -ruN linux-2.6.8-rc2-mm1/drivers/md/kcopyd.c linux-2.6.8-rc2-mm1-kthread_refrigerator_support/drivers/md/kcopyd.c
--- linux-2.6.8-rc2-mm1/drivers/md/kcopyd.c 2004-07-29 16:11:32.000000000 +1000
+++ linux-2.6.8-rc2-mm1-kthread_refrigerator_support/drivers/md/kcopyd.c 2004-07-30 09:11:26.430382792 +1000
@@ -609,7 +609,7 @@
return r;
}
- _kcopyd_wq = create_singlethread_workqueue("kcopyd");
+ _kcopyd_wq = create_singlethread_workqueue("kcopyd", 0);
if (!_kcopyd_wq) {
jobs_exit();
up(&kcopyd_init_lock);
diff -ruN linux-2.6.8-rc2-mm1/drivers/net/wan/sdlamain.c linux-2.6.8-rc2-mm1-kthread_refrigerator_support/drivers/net/wan/sdlamain.c
--- linux-2.6.8-rc2-mm1/drivers/net/wan/sdlamain.c 2004-03-16 09:20:04.000000000 +1100
+++ linux-2.6.8-rc2-mm1-kthread_refrigerator_support/drivers/net/wan/sdlamain.c 2004-07-30 09:11:26.441381120 +1000
@@ -240,7 +240,7 @@
printk(KERN_INFO "%s v%u.%u %s\n",
fullname, DRV_VERSION, DRV_RELEASE, copyright);
- wanpipe_wq = create_workqueue("wanpipe_wq");
+ wanpipe_wq = create_workqueue("wanpipe_wq", 0);
if (!wanpipe_wq)
return -ENOMEM;
diff -ruN linux-2.6.8-rc2-mm1/drivers/s390/cio/device.c linux-2.6.8-rc2-mm1-kthread_refrigerator_support/drivers/s390/cio/device.c
--- linux-2.6.8-rc2-mm1/drivers/s390/cio/device.c 2004-06-18 12:44:07.000000000 +1000
+++ linux-2.6.8-rc2-mm1-kthread_refrigerator_support/drivers/s390/cio/device.c 2004-07-30 09:11:26.455378992 +1000
@@ -151,15 +151,16 @@
init_waitqueue_head(&ccw_device_init_wq);
atomic_set(&ccw_device_init_count, 0);
- ccw_device_work = create_singlethread_workqueue("cio");
+ ccw_device_work = create_singlethread_workqueue("cio", 0);
if (!ccw_device_work)
return -ENOMEM; /* FIXME: better errno ? */
- ccw_device_notify_work = create_singlethread_workqueue("cio_notify");
+ ccw_device_notify_work = create_singlethread_workqueue("cio_notify",
+ 0);
if (!ccw_device_notify_work) {
ret = -ENOMEM; /* FIXME: better errno ? */
goto out_err;
}
- slow_path_wq = create_singlethread_workqueue("kslowcrw");
+ slow_path_wq = create_singlethread_workqueue("kslowcrw", 0);
if (!slow_path_wq) {
ret = -ENOMEM; /* FIXME: better errno ? */
goto out_err;
diff -ruN linux-2.6.8-rc2-mm1/drivers/scsi/libata-core.c linux-2.6.8-rc2-mm1-kthread_refrigerator_support/drivers/scsi/libata-core.c
--- linux-2.6.8-rc2-mm1/drivers/scsi/libata-core.c 2004-07-29 16:12:38.000000000 +1000
+++ linux-2.6.8-rc2-mm1-kthread_refrigerator_support/drivers/scsi/libata-core.c 2004-07-30 09:11:26.472376408 +1000
@@ -3440,7 +3440,7 @@
static int __init ata_init(void)
{
- ata_wq = create_workqueue("ata");
+ ata_wq = create_workqueue("ata", PF_NOFREEZE);
if (!ata_wq)
return -ENOMEM;
diff -ruN linux-2.6.8-rc2-mm1/fs/aio.c linux-2.6.8-rc2-mm1-kthread_refrigerator_support/fs/aio.c
--- linux-2.6.8-rc2-mm1/fs/aio.c 2004-07-29 16:11:37.000000000 +1000
+++ linux-2.6.8-rc2-mm1-kthread_refrigerator_support/fs/aio.c 2004-07-30 09:11:26.490373672 +1000
@@ -69,7 +69,7 @@
kioctx_cachep = kmem_cache_create("kioctx", sizeof(struct kioctx),
0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL);
- aio_wq = create_workqueue("aio");
+ aio_wq = create_workqueue("aio", 0);
pr_debug("aio_setup: sizeof(struct page) = %d\n", (int)sizeof(struct page));
diff -ruN linux-2.6.8-rc2-mm1/fs/reiserfs/journal.c linux-2.6.8-rc2-mm1-kthread_refrigerator_support/fs/reiserfs/journal.c
--- linux-2.6.8-rc2-mm1/fs/reiserfs/journal.c 2004-07-29 16:12:38.000000000 +1000
+++ linux-2.6.8-rc2-mm1-kthread_refrigerator_support/fs/reiserfs/journal.c 2004-07-30 09:11:26.506371240 +1000
@@ -2483,7 +2483,7 @@
reiserfs_mounted_fs_count++ ;
if (reiserfs_mounted_fs_count <= 1)
- commit_wq = create_workqueue("reiserfs");
+ commit_wq = create_workqueue("reiserfs", 0);
INIT_WORK(&journal->j_work, flush_async_commits, p_s_sb);
return 0 ;
diff -ruN linux-2.6.8-rc2-mm1/fs/xfs/linux-2.6/xfs_buf.c linux-2.6.8-rc2-mm1-kthread_refrigerator_support/fs/xfs/linux-2.6/xfs_buf.c
--- linux-2.6.8-rc2-mm1/fs/xfs/linux-2.6/xfs_buf.c 2004-07-29 16:11:38.000000000 +1000
+++ linux-2.6.8-rc2-mm1-kthread_refrigerator_support/fs/xfs/linux-2.6/xfs_buf.c 2004-07-30 09:11:26.523368656 +1000
@@ -1746,11 +1746,11 @@
{
int rval;
- pagebuf_logio_workqueue = create_workqueue("xfslogd");
+ pagebuf_logio_workqueue = create_workqueue("xfslogd", 0);
if (!pagebuf_logio_workqueue)
return -ENOMEM;
- pagebuf_dataio_workqueue = create_workqueue("xfsdatad");
+ pagebuf_dataio_workqueue = create_workqueue("xfsdatad", 0);
if (!pagebuf_dataio_workqueue) {
destroy_workqueue(pagebuf_logio_workqueue);
return -ENOMEM;
diff -ruN linux-2.6.8-rc2-mm1/include/linux/kthread.h linux-2.6.8-rc2-mm1-kthread_refrigerator_support/include/linux/kthread.h
--- linux-2.6.8-rc2-mm1/include/linux/kthread.h 2004-07-08 12:03:28.000000000 +1000
+++ linux-2.6.8-rc2-mm1-kthread_refrigerator_support/include/linux/kthread.h 2004-07-30 09:11:26.540366072 +1000
@@ -25,20 +25,25 @@
*/
struct task_struct *kthread_create(int (*threadfn)(void *data),
void *data,
+ unsigned long freezer_flags,
const char namefmt[], ...);
/**
* kthread_run: create and wake a thread.
* @threadfn: the function to run until signal_pending(current).
* @data: data ptr for @threadfn.
+ * @freezer_flags: process flags that should be used for freezing.
+ * PF_NOFREEZE if also needed for writing the image.
+ * 0 otherwise.
* @namefmt: printf-style name for the thread.
*
* Description: Convenient wrapper for kthread_create() followed by
* wake_up_process(). Returns the kthread, or ERR_PTR(-ENOMEM). */
-#define kthread_run(threadfn, data, namefmt, ...) \
+#define kthread_run(threadfn, data, freezer_flags, namefmt, ...) \
({ \
struct task_struct *__k \
- = kthread_create(threadfn, data, namefmt, ## __VA_ARGS__); \
+ = kthread_create(threadfn, data, freezer_flags, \
+ namefmt, ## __VA_ARGS__); \
if (!IS_ERR(__k)) \
wake_up_process(__k); \
__k; \
diff -ruN linux-2.6.8-rc2-mm1/include/linux/workqueue.h linux-2.6.8-rc2-mm1-kthread_refrigerator_support/include/linux/workqueue.h
--- linux-2.6.8-rc2-mm1/include/linux/workqueue.h 2004-07-29 16:12:39.000000000 +1000
+++ linux-2.6.8-rc2-mm1-kthread_refrigerator_support/include/linux/workqueue.h 2004-07-30 09:11:26.554363944 +1000
@@ -51,9 +51,10 @@
} while (0)
extern struct workqueue_struct *__create_workqueue(const char *name,
- int singlethread);
-#define create_workqueue(name) __create_workqueue((name), 0)
-#define create_singlethread_workqueue(name) __create_workqueue((name), 1)
+ int singlethread,
+ unsigned long freezer_flag);
+#define create_workqueue(name, flags) __create_workqueue((name), 0, flags)
+#define create_singlethread_workqueue(name, flags) __create_workqueue((name), 1, flags)
extern void destroy_workqueue(struct workqueue_struct *wq);
diff -ruN linux-2.6.8-rc2-mm1/kernel/kmod.c linux-2.6.8-rc2-mm1-kthread_refrigerator_support/kernel/kmod.c
--- linux-2.6.8-rc2-mm1/kernel/kmod.c 2004-07-29 16:12:39.000000000 +1000
+++ linux-2.6.8-rc2-mm1-kthread_refrigerator_support/kernel/kmod.c 2004-07-30 09:11:26.565362272 +1000
@@ -274,6 +274,6 @@
void __init usermodehelper_init(void)
{
- khelper_wq = create_singlethread_workqueue("khelper");
+ khelper_wq = create_singlethread_workqueue("khelper", 0);
BUG_ON(!khelper_wq);
}
diff -ruN linux-2.6.8-rc2-mm1/kernel/kthread.c linux-2.6.8-rc2-mm1-kthread_refrigerator_support/kernel/kthread.c
--- linux-2.6.8-rc2-mm1/kernel/kthread.c 2004-07-29 16:11:40.000000000 +1000
+++ linux-2.6.8-rc2-mm1-kthread_refrigerator_support/kernel/kthread.c 2004-07-30 09:11:26.578360296 +1000
@@ -19,6 +19,7 @@
/* Information passed to kthread() from keventd. */
int (*threadfn)(void *data);
void *data;
+ unsigned long freezer_flags;
struct completion started;
/* Result passed back to kthread_create() from keventd. */
@@ -65,6 +66,7 @@
void *data;
sigset_t blocked;
int ret = -EINTR;
+ unsigned long flags_used;
kthread_exit_files();
@@ -80,6 +82,10 @@
/* By default we can run anywhere, unlike keventd. */
set_cpus_allowed(current, CPU_MASK_ALL);
+ /* Validate and set our freezer flags */
+ flags_used = create->freezer_flags & PF_NOFREEZE;
+ current->flags |= flags_used;
+
/* OK, tell user we're spawned, wait for stop or wakeup */
__set_current_state(TASK_INTERRUPTIBLE);
complete(&create->started);
@@ -115,6 +121,7 @@
struct task_struct *kthread_create(int (*threadfn)(void *data),
void *data,
+ unsigned long freezer_flags,
const char namefmt[],
...)
{
@@ -123,6 +130,7 @@
create.threadfn = threadfn;
create.data = data;
+ create.freezer_flags = freezer_flags;
init_completion(&create.started);
init_completion(&create.done);
diff -ruN linux-2.6.8-rc2-mm1/kernel/sched.c linux-2.6.8-rc2-mm1-kthread_refrigerator_support/kernel/sched.c
--- linux-2.6.8-rc2-mm1/kernel/sched.c 2004-07-29 16:12:39.000000000 +1000
+++ linux-2.6.8-rc2-mm1-kthread_refrigerator_support/kernel/sched.c 2004-07-30 09:12:08.800941488 +1000
@@ -3549,10 +3549,10 @@
switch (action) {
case CPU_UP_PREPARE:
- p = kthread_create(migration_thread, hcpu, "migration/%d",cpu);
+ p = kthread_create(migration_thread, hcpu, 0,
+ "migration/%d",cpu);
if (IS_ERR(p))
return NOTIFY_BAD;
- p->flags |= PF_NOFREEZE;
kthread_bind(p, cpu);
/* Must be high prio: stop_machine expects to yield to it. */
rq = task_rq_lock(p, &flags);
diff -ruN linux-2.6.8-rc2-mm1/kernel/softirq.c linux-2.6.8-rc2-mm1-kthread_refrigerator_support/kernel/softirq.c
--- linux-2.6.8-rc2-mm1/kernel/softirq.c 2004-05-19 22:10:48.000000000 +1000
+++ linux-2.6.8-rc2-mm1-kthread_refrigerator_support/kernel/softirq.c 2004-07-30 09:17:34.942360456 +1000
@@ -425,7 +425,7 @@
case CPU_UP_PREPARE:
BUG_ON(per_cpu(tasklet_vec, hotcpu).list);
BUG_ON(per_cpu(tasklet_hi_vec, hotcpu).list);
- p = kthread_create(ksoftirqd, hcpu, "ksoftirqd/%d", hotcpu);
+ p = kthread_create(ksoftirqd, hcpu, PF_NOFREEZE, "ksoftirqd/%d", hotcpu);
if (IS_ERR(p)) {
printk("ksoftirqd for %i failed\n", hotcpu);
return NOTIFY_BAD;
diff -ruN linux-2.6.8-rc2-mm1/kernel/stop_machine.c linux-2.6.8-rc2-mm1-kthread_refrigerator_support/kernel/stop_machine.c
--- linux-2.6.8-rc2-mm1/kernel/stop_machine.c 2004-05-19 22:10:48.000000000 +1000
+++ linux-2.6.8-rc2-mm1-kthread_refrigerator_support/kernel/stop_machine.c 2004-07-30 09:11:26.605356192 +1000
@@ -174,7 +174,7 @@
if (cpu == NR_CPUS)
cpu = smp_processor_id();
- p = kthread_create(do_stop, &smdata, "kstopmachine");
+ p = kthread_create(do_stop, &smdata, 0, "kstopmachine");
if (!IS_ERR(p)) {
kthread_bind(p, cpu);
wake_up_process(p);
diff -ruN linux-2.6.8-rc2-mm1/kernel/workqueue.c linux-2.6.8-rc2-mm1-kthread_refrigerator_support/kernel/workqueue.c
--- linux-2.6.8-rc2-mm1/kernel/workqueue.c 2004-07-29 16:12:39.000000000 +1000
+++ linux-2.6.8-rc2-mm1-kthread_refrigerator_support/kernel/workqueue.c 2004-07-30 09:11:26.618354216 +1000
@@ -25,6 +25,7 @@
#include <linux/cpu.h>
#include <linux/notifier.h>
#include <linux/kthread.h>
+#include <linux/suspend.h>
/*
* The per-CPU workqueue (if single thread, we always use cpu 0's).
@@ -186,8 +187,6 @@
struct k_sigaction sa;
sigset_t blocked;
- current->flags |= PF_NOFREEZE;
-
set_user_nice(current, -10);
/* Block and flush all signals */
@@ -208,6 +207,8 @@
schedule();
else
__set_current_state(TASK_RUNNING);
+ if (current->flags & PF_FREEZE)
+ refrigerator(PF_FREEZE);
remove_wait_queue(&cwq->more_work, &wait);
if (!list_empty(&cwq->worklist))
@@ -277,7 +278,8 @@
}
static struct task_struct *create_workqueue_thread(struct workqueue_struct *wq,
- int cpu)
+ int cpu,
+ unsigned long freezer_flags)
{
struct cpu_workqueue_struct *cwq = wq->cpu_wq + cpu;
struct task_struct *p;
@@ -292,9 +294,11 @@
init_waitqueue_head(&cwq->work_done);
if (is_single_threaded(wq))
- p = kthread_create(worker_thread, cwq, "%s", wq->name);
+ p = kthread_create(worker_thread, cwq, freezer_flags,
+ "%s", wq->name);
else
- p = kthread_create(worker_thread, cwq, "%s/%d", wq->name, cpu);
+ p = kthread_create(worker_thread, cwq, freezer_flags,
+ "%s/%d", wq->name, cpu);
if (IS_ERR(p))
return NULL;
cwq->thread = p;
@@ -302,7 +306,8 @@
}
struct workqueue_struct *__create_workqueue(const char *name,
- int singlethread)
+ int singlethread,
+ unsigned long freezer_flags)
{
int cpu, destroy = 0;
struct workqueue_struct *wq;
@@ -320,7 +325,7 @@
lock_cpu_hotplug();
if (singlethread) {
INIT_LIST_HEAD(&wq->list);
- p = create_workqueue_thread(wq, 0);
+ p = create_workqueue_thread(wq, 0, freezer_flags);
if (!p)
destroy = 1;
else
@@ -330,7 +335,7 @@
list_add(&wq->list, &workqueues);
spin_unlock(&workqueue_lock);
for_each_online_cpu(cpu) {
- p = create_workqueue_thread(wq, cpu);
+ p = create_workqueue_thread(wq, cpu, freezer_flags);
if (p) {
kthread_bind(p, cpu);
wake_up_process(p);
@@ -513,7 +518,7 @@
void init_workqueues(void)
{
hotcpu_notifier(workqueue_cpu_callback, 0);
- keventd_wq = create_workqueue("events");
+ keventd_wq = create_workqueue("events", 0);
BUG_ON(!keventd_wq);
}
diff -ruN linux-2.6.8-rc2-mm1/mm/pdflush.c linux-2.6.8-rc2-mm1-kthread_refrigerator_support/mm/pdflush.c
--- linux-2.6.8-rc2-mm1/mm/pdflush.c 2004-05-19 22:10:48.000000000 +1000
+++ linux-2.6.8-rc2-mm1-kthread_refrigerator_support/mm/pdflush.c 2004-07-30 09:11:26.631352240 +1000
@@ -215,7 +215,7 @@
static void start_one_pdflush_thread(void)
{
- kthread_run(pdflush, NULL, "pdflush");
+ kthread_run(pdflush, NULL, 0, "pdflush");
}
static int __init pdflush_init(void)
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Patch] Per kthread freezer flags
2004-07-29 22:39 ` Nigel Cunningham
@ 2004-07-30 8:12 ` Felipe Alfaro Solana
0 siblings, 0 replies; 24+ messages in thread
From: Felipe Alfaro Solana @ 2004-07-30 8:12 UTC (permalink / raw)
To: ncunningham; +Cc: Andrew Morton, Linux Kernel Mailing List
On Fri, 2004-07-30 at 08:39 +1000, Nigel Cunningham wrote:
> Hi.
>
> On Fri, 2004-07-30 at 02:10, Felipe Alfaro Solana wrote:
> > > Okay. So, just to make sure I understand you correctly, suspending works
> > > fine with all of these other patches added and adding the extra
> > > refrigerator calls breaks it. Are you at all able to narrow it down to a
> > > particular change?
> >
> > Exactly! I'm currently running a highly patched kernel based on 2.6.8-
> > rc2-bk7 plus Con's work and Ingo's voluntary preempt. They work fine
> > when suspending to memory (S3) and to disk (S4 via swsusp), but adding
> > your kthread freezer flags to the mix keeps my CardBus NIC from being
> > recognized when resuming from S3: I need to unplug it, then plug it to
> > make it functional again.
> >
> > However, I'm not sure what causes this behavior.
>
> Could you please try reversing each of the changes in my patch until it
> starts working? The NFS ones could be done all at once - they should be
> irrelevant to you anyway IIRC.
That's what I'm doing right now ;-)
Please, give me a few hours to post the result.
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Patch] Per kthread freezer flags (Version 2)
2004-07-29 23:25 ` [Patch] Per kthread freezer flags (Version 2) Nigel Cunningham
@ 2004-07-30 9:18 ` Pavel Machek
2004-07-31 16:53 ` Felipe Alfaro Solana
1 sibling, 0 replies; 24+ messages in thread
From: Pavel Machek @ 2004-07-30 9:18 UTC (permalink / raw)
To: Nigel Cunningham; +Cc: Andrew Morton, Linux Kernel Mailing List
Hi!
> Okay.. how does this look?
>
> I applied your changes and fixed a couple of typos I noticed. I also
> added support for the hcvs thread, which is new since rc1-mm1. (This is
> against rc2-mm1).
Looks okay, thanks.
Pavel
--
People were complaining that M$ turns users into beta-testers...
...jr ghea gurz vagb qrirybcref, naq gurl frrz gb yvxr vg gung jnl!
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Patch] Per kthread freezer flags
2004-07-29 22:44 ` Pavel Machek
2004-07-29 22:46 ` Nigel Cunningham
2004-07-29 23:25 ` [Patch] Per kthread freezer flags (Version 2) Nigel Cunningham
@ 2004-07-30 12:11 ` Peter Osterlund
2004-07-30 22:15 ` Nigel Cunningham
2 siblings, 1 reply; 24+ messages in thread
From: Peter Osterlund @ 2004-07-30 12:11 UTC (permalink / raw)
To: Pavel Machek; +Cc: Nigel Cunningham, Andrew Morton, Linux Kernel Mailing List
Pavel Machek <pavel@ucw.cz> writes:
> Hi!
>
> > > > - pd->cdrw.thread = kthread_run(kcdrwd, pd, "%s", pd->name);
> > > > + pd->cdrw.thread = kthread_run(kcdrwd, pd, "%s", 0, pd->name);
> > > > if (IS_ERR(pd->cdrw.thread)) {
> > > > printk("pktcdvd: can't start kernel thread\n");
> > > > ret = -ENOMEM;
> > >
> > > What if someone does swapon /dev/pktdvd0?
> >
> > Sorry. That's my ignorance. I thought the packet writer was only for
> > writing :>
pktcdvd devices are standard writable block devices, so you can use
them for anything you want, including swapping.
> Well, swapon /dev/pktdvd would be *very* bad idea as optical drives
> are very slow,
Agreed. Seek times before writes are in the range of 500-1000ms on my
drives. This will probably make your machine unresponsive for a *very*
long time when you start to swap to an optical disc.
It should work though, unless you wear out your disc before it's done
swapping, in which case nasty things will probably happen. I don't
think I/O errors on a swap device can be handled in a sane way by the
kernel.
> but PF_NOFREEZE is more correct here.
Yes. What about this code in the main loop in kcdrwd?
/* make swsusp happy with our thread */
if (current->flags & PF_FREEZE)
refrigerator(PF_FREEZE);
Should it still be there when the task is marked as PF_NOFREEZE?
--
Peter Osterlund - petero2@telia.com
http://w1.894.telia.com/~u89404340
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Patch] Per kthread freezer flags
2004-07-30 12:11 ` [Patch] Per kthread freezer flags Peter Osterlund
@ 2004-07-30 22:15 ` Nigel Cunningham
0 siblings, 0 replies; 24+ messages in thread
From: Nigel Cunningham @ 2004-07-30 22:15 UTC (permalink / raw)
To: Peter Osterlund; +Cc: Pavel Machek, Andrew Morton, Linux Kernel Mailing List
Hi.
On Fri, 2004-07-30 at 22:11, Peter Osterlund wrote:
> Yes. What about this code in the main loop in kcdrwd?
>
> /* make swsusp happy with our thread */
> if (current->flags & PF_FREEZE)
> refrigerator(PF_FREEZE);
>
> Should it still be there when the task is marked as PF_NOFREEZE?
No, it's not needed if the thread is NOFREEZE.
Regards,
Nigel
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Patch] Per kthread freezer flags (Version 2)
2004-07-29 23:25 ` [Patch] Per kthread freezer flags (Version 2) Nigel Cunningham
2004-07-30 9:18 ` Pavel Machek
@ 2004-07-31 16:53 ` Felipe Alfaro Solana
1 sibling, 0 replies; 24+ messages in thread
From: Felipe Alfaro Solana @ 2004-07-31 16:53 UTC (permalink / raw)
To: ncunningham; +Cc: Pavel Machek, Andrew Morton, Linux Kernel Mailing List
On Fri, 2004-07-30 at 09:25 +1000, Nigel Cunningham wrote:
> Okay.. how does this look?
>
> I applied your changes and fixed a couple of typos I noticed. I also
> added support for the hcvs thread, which is new since rc1-mm1. (This is
> against rc2-mm1).
I'm still suffering from the NIC-won't-come-out-from-S3 (I need to
unplug my CardBus NIC, then plug it again after resuming from S3) when
applying this patch against 2.6.8-rc2-mm1... I'll keep reverting every
hunk of the patch till I find the culprit.
^ permalink raw reply [flat|nested] 24+ messages in thread
end of thread, other threads:[~2004-07-31 16:53 UTC | newest]
Thread overview: 24+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-07-28 7:22 [Patch] Per kthread freezer flags Nigel Cunningham
2004-07-28 21:20 ` Andrew Morton
2004-07-28 22:25 ` Nigel Cunningham
2004-07-28 22:30 ` Felipe Alfaro Solana
2004-07-28 22:27 ` Nigel Cunningham
2004-07-28 22:36 ` Nigel Cunningham
2004-07-28 23:21 ` Felipe Alfaro Solana
2004-07-29 0:46 ` Nigel Cunningham
2004-07-29 10:02 ` Felipe Alfaro Solana
2004-07-29 12:11 ` Nigel Cunningham
2004-07-29 16:10 ` Felipe Alfaro Solana
2004-07-29 22:39 ` Nigel Cunningham
2004-07-30 8:12 ` Felipe Alfaro Solana
2004-07-29 22:57 ` Felipe Alfaro Solana
2004-07-29 23:01 ` Nigel Cunningham
2004-07-29 19:04 ` Pavel Machek
2004-07-29 22:24 ` Nigel Cunningham
2004-07-29 22:44 ` Pavel Machek
2004-07-29 22:46 ` Nigel Cunningham
2004-07-29 23:25 ` [Patch] Per kthread freezer flags (Version 2) Nigel Cunningham
2004-07-30 9:18 ` Pavel Machek
2004-07-31 16:53 ` Felipe Alfaro Solana
2004-07-30 12:11 ` [Patch] Per kthread freezer flags Peter Osterlund
2004-07-30 22:15 ` Nigel Cunningham
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox