All of lore.kernel.org
 help / color / mirror / Atom feed
From: Pavel Machek <pavel@ucw.cz>
To: "Rafael J. Wysocki" <rjw@sisk.pl>
Cc: Andrew Morton <akpm@osdl.org>, Eric Sandeen <sandeen@redhat.com>,
	Nigel Cunningham <nigel@suspend2.net>,
	David Chinner <dgc@sgi.com>,
	linux-kernel@vger.kernel.org, dm-devel@redhat.com,
	Srinivasa DS <srinivasa@in.ibm.com>,
	Alasdair G Kergon <agk@redhat.com>
Subject: Re: [PATCH 2.6.19 5/5] fs: freeze_bdev with semaphore not mutex
Date: Wed, 15 Nov 2006 23:49:26 +0100	[thread overview]
Message-ID: <20061115224926.GA4302@elf.ucw.cz> (raw)
In-Reply-To: <200611152258.52160.rjw@sisk.pl>

Hi!

> > > > There's one more thing, actually.  If the on-disk data and metadata are
> > > > changed _after_ the sync we do and _before_ we create the snapshot image,
> > > > and the subsequent  resume fails,
> > > 
> > > Well, but this is equivalent to a power failure immediately after the sync, so
> > > there _must_ be a way to recover the filesystem from that, no?
> > 
> > Exactly.
> > 
> > > I think I'll prepare a patch for freezing the work queues and we'll see what
> > > to do next.
> > 
> > Thanks!
> 
> Okay, the patch follows.
> 
> I've been running it for some time on my boxes and it doesn't seem to break
> anything.  However, I don't use XFS, so well ...

Seems like a way to go, thanks!
									Pavel

> Index: linux-2.6.19-rc5-mm2/include/linux/workqueue.h
> ===================================================================
> --- linux-2.6.19-rc5-mm2.orig/include/linux/workqueue.h	2006-09-20 05:42:06.000000000 +0200
> +++ linux-2.6.19-rc5-mm2/include/linux/workqueue.h	2006-11-15 21:58:40.000000000 +0100
> @@ -55,9 +55,11 @@ struct execute_work {
>  	} 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,
> +						    int freezeable);
> +#define create_workqueue(name) __create_workqueue((name), 0, 0)
> +#define create_freezeable_workqueue(name) __create_workqueue((name), 0, 1)
> +#define create_singlethread_workqueue(name) __create_workqueue((name), 1, 0)
>  
>  extern void destroy_workqueue(struct workqueue_struct *wq);
>  
> Index: linux-2.6.19-rc5-mm2/kernel/workqueue.c
> ===================================================================
> --- linux-2.6.19-rc5-mm2.orig/kernel/workqueue.c	2006-11-15 21:32:13.000000000 +0100
> +++ linux-2.6.19-rc5-mm2/kernel/workqueue.c	2006-11-15 22:27:40.000000000 +0100
> @@ -31,6 +31,7 @@
>  #include <linux/mempolicy.h>
>  #include <linux/kallsyms.h>
>  #include <linux/debug_locks.h>
> +#include <linux/freezer.h>
>  
>  /*
>   * The per-CPU workqueue (if single thread, we always use the first
> @@ -57,6 +58,8 @@ struct cpu_workqueue_struct {
>  	struct task_struct *thread;
>  
>  	int run_depth;		/* Detect run_workqueue() recursion depth */
> +
> +	int freezeable;		/* Freeze the thread during suspend */
>  } ____cacheline_aligned;
>  
>  /*
> @@ -251,7 +254,8 @@ static int worker_thread(void *__cwq)
>  	struct k_sigaction sa;
>  	sigset_t blocked;
>  
> -	current->flags |= PF_NOFREEZE;
> +	if (!cwq->freezeable)
> +		current->flags |= PF_NOFREEZE;
>  
>  	set_user_nice(current, -5);
>  
> @@ -274,6 +278,9 @@ static int worker_thread(void *__cwq)
>  
>  	set_current_state(TASK_INTERRUPTIBLE);
>  	while (!kthread_should_stop()) {
> +		if (cwq->freezeable)
> +			try_to_freeze();
> +
>  		add_wait_queue(&cwq->more_work, &wait);
>  		if (list_empty(&cwq->worklist))
>  			schedule();
> @@ -350,7 +357,7 @@ void fastcall flush_workqueue(struct wor
>  EXPORT_SYMBOL_GPL(flush_workqueue);
>  
>  static struct task_struct *create_workqueue_thread(struct workqueue_struct *wq,
> -						   int cpu)
> +						   int cpu, int freezeable)
>  {
>  	struct cpu_workqueue_struct *cwq = per_cpu_ptr(wq->cpu_wq, cpu);
>  	struct task_struct *p;
> @@ -360,6 +367,7 @@ static struct task_struct *create_workqu
>  	cwq->thread = NULL;
>  	cwq->insert_sequence = 0;
>  	cwq->remove_sequence = 0;
> +	cwq->freezeable = freezeable;
>  	INIT_LIST_HEAD(&cwq->worklist);
>  	init_waitqueue_head(&cwq->more_work);
>  	init_waitqueue_head(&cwq->work_done);
> @@ -375,7 +383,7 @@ static struct task_struct *create_workqu
>  }
>  
>  struct workqueue_struct *__create_workqueue(const char *name,
> -					    int singlethread)
> +					    int singlethread, int freezeable)
>  {
>  	int cpu, destroy = 0;
>  	struct workqueue_struct *wq;
> @@ -395,7 +403,7 @@ struct workqueue_struct *__create_workqu
>  	mutex_lock(&workqueue_mutex);
>  	if (singlethread) {
>  		INIT_LIST_HEAD(&wq->list);
> -		p = create_workqueue_thread(wq, singlethread_cpu);
> +		p = create_workqueue_thread(wq, singlethread_cpu, freezeable);
>  		if (!p)
>  			destroy = 1;
>  		else
> @@ -403,7 +411,7 @@ struct workqueue_struct *__create_workqu
>  	} else {
>  		list_add(&wq->list, &workqueues);
>  		for_each_online_cpu(cpu) {
> -			p = create_workqueue_thread(wq, cpu);
> +			p = create_workqueue_thread(wq, cpu, freezeable);
>  			if (p) {
>  				kthread_bind(p, cpu);
>  				wake_up_process(p);
> @@ -657,7 +665,7 @@ static int __devinit workqueue_cpu_callb
>  		mutex_lock(&workqueue_mutex);
>  		/* Create a new workqueue thread for it. */
>  		list_for_each_entry(wq, &workqueues, list) {
> -			if (!create_workqueue_thread(wq, hotcpu)) {
> +			if (!create_workqueue_thread(wq, hotcpu, 0)) {
>  				printk("workqueue for %i failed\n", hotcpu);
>  				return NOTIFY_BAD;
>  			}
> Index: linux-2.6.19-rc5-mm2/fs/xfs/linux-2.6/xfs_buf.c
> ===================================================================
> --- linux-2.6.19-rc5-mm2.orig/fs/xfs/linux-2.6/xfs_buf.c	2006-11-15 21:32:08.000000000 +0100
> +++ linux-2.6.19-rc5-mm2/fs/xfs/linux-2.6/xfs_buf.c	2006-11-15 22:12:43.000000000 +0100
> @@ -1826,11 +1826,11 @@ xfs_buf_init(void)
>  	if (!xfs_buf_zone)
>  		goto out_free_trace_buf;
>  
> -	xfslogd_workqueue = create_workqueue("xfslogd");
> +	xfslogd_workqueue = create_freezeable_workqueue("xfslogd");
>  	if (!xfslogd_workqueue)
>  		goto out_free_buf_zone;
>  
> -	xfsdatad_workqueue = create_workqueue("xfsdatad");
> +	xfsdatad_workqueue = create_freezeable_workqueue("xfsdatad");
>  	if (!xfsdatad_workqueue)
>  		goto out_destroy_xfslogd_workqueue;
>  

-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html

WARNING: multiple messages have this Message-ID (diff)
From: Pavel Machek <pavel@ucw.cz>
To: "Rafael J. Wysocki" <rjw@sisk.pl>
Cc: David Chinner <dgc@sgi.com>, Alasdair G Kergon <agk@redhat.com>,
	Eric Sandeen <sandeen@redhat.com>, Andrew Morton <akpm@osdl.org>,
	linux-kernel@vger.kernel.org, dm-devel@redhat.com,
	Srinivasa DS <srinivasa@in.ibm.com>,
	Nigel Cunningham <nigel@suspend2.net>
Subject: Re: [PATCH 2.6.19 5/5] fs: freeze_bdev with semaphore not mutex
Date: Wed, 15 Nov 2006 23:49:26 +0100	[thread overview]
Message-ID: <20061115224926.GA4302@elf.ucw.cz> (raw)
In-Reply-To: <200611152258.52160.rjw@sisk.pl>

Hi!

> > > > There's one more thing, actually.  If the on-disk data and metadata are
> > > > changed _after_ the sync we do and _before_ we create the snapshot image,
> > > > and the subsequent  resume fails,
> > > 
> > > Well, but this is equivalent to a power failure immediately after the sync, so
> > > there _must_ be a way to recover the filesystem from that, no?
> > 
> > Exactly.
> > 
> > > I think I'll prepare a patch for freezing the work queues and we'll see what
> > > to do next.
> > 
> > Thanks!
> 
> Okay, the patch follows.
> 
> I've been running it for some time on my boxes and it doesn't seem to break
> anything.  However, I don't use XFS, so well ...

Seems like a way to go, thanks!
									Pavel

> Index: linux-2.6.19-rc5-mm2/include/linux/workqueue.h
> ===================================================================
> --- linux-2.6.19-rc5-mm2.orig/include/linux/workqueue.h	2006-09-20 05:42:06.000000000 +0200
> +++ linux-2.6.19-rc5-mm2/include/linux/workqueue.h	2006-11-15 21:58:40.000000000 +0100
> @@ -55,9 +55,11 @@ struct execute_work {
>  	} 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,
> +						    int freezeable);
> +#define create_workqueue(name) __create_workqueue((name), 0, 0)
> +#define create_freezeable_workqueue(name) __create_workqueue((name), 0, 1)
> +#define create_singlethread_workqueue(name) __create_workqueue((name), 1, 0)
>  
>  extern void destroy_workqueue(struct workqueue_struct *wq);
>  
> Index: linux-2.6.19-rc5-mm2/kernel/workqueue.c
> ===================================================================
> --- linux-2.6.19-rc5-mm2.orig/kernel/workqueue.c	2006-11-15 21:32:13.000000000 +0100
> +++ linux-2.6.19-rc5-mm2/kernel/workqueue.c	2006-11-15 22:27:40.000000000 +0100
> @@ -31,6 +31,7 @@
>  #include <linux/mempolicy.h>
>  #include <linux/kallsyms.h>
>  #include <linux/debug_locks.h>
> +#include <linux/freezer.h>
>  
>  /*
>   * The per-CPU workqueue (if single thread, we always use the first
> @@ -57,6 +58,8 @@ struct cpu_workqueue_struct {
>  	struct task_struct *thread;
>  
>  	int run_depth;		/* Detect run_workqueue() recursion depth */
> +
> +	int freezeable;		/* Freeze the thread during suspend */
>  } ____cacheline_aligned;
>  
>  /*
> @@ -251,7 +254,8 @@ static int worker_thread(void *__cwq)
>  	struct k_sigaction sa;
>  	sigset_t blocked;
>  
> -	current->flags |= PF_NOFREEZE;
> +	if (!cwq->freezeable)
> +		current->flags |= PF_NOFREEZE;
>  
>  	set_user_nice(current, -5);
>  
> @@ -274,6 +278,9 @@ static int worker_thread(void *__cwq)
>  
>  	set_current_state(TASK_INTERRUPTIBLE);
>  	while (!kthread_should_stop()) {
> +		if (cwq->freezeable)
> +			try_to_freeze();
> +
>  		add_wait_queue(&cwq->more_work, &wait);
>  		if (list_empty(&cwq->worklist))
>  			schedule();
> @@ -350,7 +357,7 @@ void fastcall flush_workqueue(struct wor
>  EXPORT_SYMBOL_GPL(flush_workqueue);
>  
>  static struct task_struct *create_workqueue_thread(struct workqueue_struct *wq,
> -						   int cpu)
> +						   int cpu, int freezeable)
>  {
>  	struct cpu_workqueue_struct *cwq = per_cpu_ptr(wq->cpu_wq, cpu);
>  	struct task_struct *p;
> @@ -360,6 +367,7 @@ static struct task_struct *create_workqu
>  	cwq->thread = NULL;
>  	cwq->insert_sequence = 0;
>  	cwq->remove_sequence = 0;
> +	cwq->freezeable = freezeable;
>  	INIT_LIST_HEAD(&cwq->worklist);
>  	init_waitqueue_head(&cwq->more_work);
>  	init_waitqueue_head(&cwq->work_done);
> @@ -375,7 +383,7 @@ static struct task_struct *create_workqu
>  }
>  
>  struct workqueue_struct *__create_workqueue(const char *name,
> -					    int singlethread)
> +					    int singlethread, int freezeable)
>  {
>  	int cpu, destroy = 0;
>  	struct workqueue_struct *wq;
> @@ -395,7 +403,7 @@ struct workqueue_struct *__create_workqu
>  	mutex_lock(&workqueue_mutex);
>  	if (singlethread) {
>  		INIT_LIST_HEAD(&wq->list);
> -		p = create_workqueue_thread(wq, singlethread_cpu);
> +		p = create_workqueue_thread(wq, singlethread_cpu, freezeable);
>  		if (!p)
>  			destroy = 1;
>  		else
> @@ -403,7 +411,7 @@ struct workqueue_struct *__create_workqu
>  	} else {
>  		list_add(&wq->list, &workqueues);
>  		for_each_online_cpu(cpu) {
> -			p = create_workqueue_thread(wq, cpu);
> +			p = create_workqueue_thread(wq, cpu, freezeable);
>  			if (p) {
>  				kthread_bind(p, cpu);
>  				wake_up_process(p);
> @@ -657,7 +665,7 @@ static int __devinit workqueue_cpu_callb
>  		mutex_lock(&workqueue_mutex);
>  		/* Create a new workqueue thread for it. */
>  		list_for_each_entry(wq, &workqueues, list) {
> -			if (!create_workqueue_thread(wq, hotcpu)) {
> +			if (!create_workqueue_thread(wq, hotcpu, 0)) {
>  				printk("workqueue for %i failed\n", hotcpu);
>  				return NOTIFY_BAD;
>  			}
> Index: linux-2.6.19-rc5-mm2/fs/xfs/linux-2.6/xfs_buf.c
> ===================================================================
> --- linux-2.6.19-rc5-mm2.orig/fs/xfs/linux-2.6/xfs_buf.c	2006-11-15 21:32:08.000000000 +0100
> +++ linux-2.6.19-rc5-mm2/fs/xfs/linux-2.6/xfs_buf.c	2006-11-15 22:12:43.000000000 +0100
> @@ -1826,11 +1826,11 @@ xfs_buf_init(void)
>  	if (!xfs_buf_zone)
>  		goto out_free_trace_buf;
>  
> -	xfslogd_workqueue = create_workqueue("xfslogd");
> +	xfslogd_workqueue = create_freezeable_workqueue("xfslogd");
>  	if (!xfslogd_workqueue)
>  		goto out_free_buf_zone;
>  
> -	xfsdatad_workqueue = create_workqueue("xfsdatad");
> +	xfsdatad_workqueue = create_freezeable_workqueue("xfsdatad");
>  	if (!xfsdatad_workqueue)
>  		goto out_destroy_xfslogd_workqueue;
>  

-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html

  reply	other threads:[~2006-11-15 22:49 UTC|newest]

Thread overview: 110+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-11-07 18:34 [PATCH 2.6.19 5/5] fs: freeze_bdev with semaphore not mutex Alasdair G Kergon
2006-11-07 18:34 ` Alasdair G Kergon
2006-11-07 20:18 ` Mike Snitzer
2006-11-07 20:18   ` [dm-devel] " Mike Snitzer
2006-11-07 20:22   ` Eric Sandeen
2006-11-07 23:34   ` Alasdair G Kergon
2006-11-07 23:34     ` [dm-devel] " Alasdair G Kergon
2006-11-07 20:28 ` Andrew Morton
2006-11-07 20:28   ` Andrew Morton
2006-11-07 22:45   ` Eric Sandeen
2006-11-07 23:00     ` Andrew Morton
2006-11-07 23:00       ` Andrew Morton
2006-11-08  9:54       ` Arjan van de Ven
2006-11-08  9:54         ` Arjan van de Ven
2007-01-12  6:23       ` Srinivasa Ds
2007-01-12  6:23         ` Srinivasa Ds
2007-01-12 10:16       ` Srinivasa Ds
2006-11-07 23:05     ` Rafael J. Wysocki
2006-11-07 23:18       ` Eric Sandeen
2006-11-07 23:42         ` Rafael J. Wysocki
2006-11-08  0:01           ` Alasdair G Kergon
2006-11-08  0:01             ` Alasdair G Kergon
2006-11-08  8:27             ` David Chinner
2006-11-08 14:25               ` Alasdair G Kergon
2006-11-08 14:25                 ` Alasdair G Kergon
2006-11-08 14:43                 ` Rafael J. Wysocki
2006-11-08 15:25                   ` Alasdair G Kergon
2006-11-08 15:25                     ` Alasdair G Kergon
2006-11-08 23:06                     ` Rafael J. Wysocki
2006-11-07 23:49       ` Alasdair G Kergon
2006-11-07 23:49         ` Alasdair G Kergon
2006-11-08  0:00         ` Rafael J. Wysocki
2006-11-08  3:33           ` David Chinner
2006-11-08  2:30         ` Alasdair G Kergon
2006-11-08  2:30           ` Alasdair G Kergon
2006-11-08 12:10           ` Rafael J. Wysocki
2006-11-08 18:09             ` Pavel Machek
2006-11-09 15:52               ` Rafael J. Wysocki
2006-11-09 16:00                 ` Pavel Machek
2006-11-09 19:59                   ` Rafael J. Wysocki
2006-11-09 21:17                     ` Pavel Machek
2006-11-09 21:18                       ` Rafael J. Wysocki
2006-11-09 21:41                         ` Pavel Machek
2006-11-09 22:21                           ` Rafael J. Wysocki
2006-11-09 23:11                             ` Pavel Machek
2006-11-09 23:24                               ` Alasdair G Kergon
2006-11-09 23:24                                 ` Alasdair G Kergon
2006-11-09 23:32                                 ` Pavel Machek
2006-11-10 12:03                                   ` Rafael J. Wysocki
2006-11-10 12:03                                     ` Rafael J. Wysocki
2006-11-12 18:43                                     ` Pavel Machek
2006-11-12 21:53                                       ` Rafael J. Wysocki
2006-11-12 21:53                                         ` Rafael J. Wysocki
2006-11-12 23:30                                       ` David Chinner
2006-11-12 23:30                                         ` David Chinner
2006-11-13 16:11                                         ` Rafael J. Wysocki
2006-11-13 16:11                                           ` Rafael J. Wysocki
2006-11-15 18:50                                         ` Pavel Machek
2006-11-15 18:50                                           ` Pavel Machek
2006-11-15 19:56                                           ` Rafael J. Wysocki
2006-11-15 19:56                                             ` Rafael J. Wysocki
2006-11-15 20:00                                             ` Rafael J. Wysocki
2006-11-15 20:23                                               ` Pavel Machek
2006-11-15 21:58                                                 ` Rafael J. Wysocki
2006-11-15 21:58                                                   ` Rafael J. Wysocki
2006-11-15 22:49                                                   ` Pavel Machek [this message]
2006-11-15 22:49                                                     ` Pavel Machek
2006-11-16 23:20                                                   ` David Chinner
2006-11-16 23:20                                                     ` David Chinner
2006-11-16 23:38                                                     ` Pavel Machek
2006-11-16 23:38                                                       ` Pavel Machek
2006-11-13  7:35                                       ` Stefan Seyfried
2006-11-10  0:57                             ` David Chinner
2006-11-10  0:57                               ` David Chinner
2006-11-10 10:39                               ` Pavel Machek
2006-11-10 10:39                                 ` Pavel Machek
2006-11-12 22:30                                 ` David Chinner
2006-11-12 22:30                                   ` David Chinner
2006-11-12 22:43                                   ` Rafael J. Wysocki
2006-11-12 22:43                                     ` Rafael J. Wysocki
2006-11-13  5:43                                     ` David Chinner
2006-11-13  5:43                                       ` David Chinner
2006-11-13 16:22                                       ` Rafael J. Wysocki
2006-11-13 16:22                                         ` Rafael J. Wysocki
2006-11-14  0:10                                         ` David Chinner
2006-11-14  0:10                                           ` David Chinner
2006-11-16 23:23                                     ` David Chinner
2006-11-16 23:23                                       ` David Chinner
2006-11-16 23:40                                       ` Pavel Machek
2006-11-16 23:40                                         ` Pavel Machek
2006-11-17  1:40                                         ` David Chinner
2006-11-17  1:40                                           ` David Chinner
2006-11-17 15:13                                           ` Pavel Machek
2006-11-17 15:13                                             ` Pavel Machek
2006-11-10  0:54                       ` David Chinner
2006-11-10  0:54                         ` David Chinner
2006-11-10 10:24                       ` Alan Cox
2006-11-10 10:24                         ` Alan Cox
2006-11-10 10:36                         ` Pavel Machek
2006-11-10 10:36                           ` Pavel Machek
2006-11-10  0:33                   ` David Chinner
2006-11-10  0:33                     ` David Chinner
2006-11-10 10:38                     ` Pavel Machek
2006-11-10 10:38                       ` Pavel Machek
2006-11-08 20:48             ` Nigel Cunningham
2006-11-08 21:08               ` Rafael J. Wysocki
2006-11-07 23:23   ` Alasdair G Kergon
2006-11-07 23:23     ` Alasdair G Kergon
2006-11-07 23:39   ` Ingo Molnar
2006-11-07 23:39     ` Ingo Molnar

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20061115224926.GA4302@elf.ucw.cz \
    --to=pavel@ucw.cz \
    --cc=agk@redhat.com \
    --cc=akpm@osdl.org \
    --cc=dgc@sgi.com \
    --cc=dm-devel@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=nigel@suspend2.net \
    --cc=rjw@sisk.pl \
    --cc=sandeen@redhat.com \
    --cc=srinivasa@in.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.