All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] dm-kcopyd: optionally zero an area instead of copying
@ 2011-06-08 21:55 Mikulas Patocka
  2011-06-09 10:04 ` Joe Thornber
  0 siblings, 1 reply; 5+ messages in thread
From: Mikulas Patocka @ 2011-06-08 21:55 UTC (permalink / raw)
  To: Edward Thornber, Alasdair G. Kergon, dm-devel

Hi

This patch introduces an option to kcopyd to zero requested area instead 
of copying. I think Joe may need something like this in his snapshot 
store.

Mikulas

---

dm-kcopyd: optionally zero an area instead of copying

This patch causes kcopyd to zero a requested area instead of copying
if "from" parameter is set to zero.

Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>

---
 drivers/md/dm-kcopyd.c |   21 +++++++++++++++++----
 1 file changed, 17 insertions(+), 4 deletions(-)

Index: linux-2.6.39-fast/drivers/md/dm-kcopyd.c
===================================================================
--- linux-2.6.39-fast.orig/drivers/md/dm-kcopyd.c	2011-06-08 17:07:43.000000000 +0200
+++ linux-2.6.39-fast/drivers/md/dm-kcopyd.c	2011-06-08 17:18:02.000000000 +0200
@@ -69,6 +69,8 @@ struct dm_kcopyd_client {
 	struct list_head pages_jobs;
 };
 
+static struct page_list zero_page_list;
+
 static DEFINE_SPINLOCK(throttle_spinlock);
 
 /*
@@ -339,6 +341,9 @@ int __init dm_kcopyd_init(void)
 	if (!_job_cache)
 		return -ENOMEM;
 
+	zero_page_list.next = &zero_page_list;
+	zero_page_list.page = ZERO_PAGE(0);
+
 	return 0;
 }
 
@@ -407,7 +412,7 @@ static int run_complete_job(struct kcopy
 	dm_kcopyd_notify_fn fn = job->fn;
 	struct dm_kcopyd_client *kc = job->kc;
 
-	if (job->pages)
+	if (job->pages && job->pages != &zero_page_list)
 		kcopyd_put_pages(kc, job->pages);
 	/* Do not free sub-jobs */
 	if (context != job)
@@ -570,6 +575,8 @@ static void dispatch_job(struct kcopyd_j
 	atomic_inc(&kc->nr_jobs);
 	if (unlikely(!job->source.count))
 		push(&kc->complete_jobs, job);
+	else if (job->pages == &zero_page_list)
+		push(&kc->io_jobs, job);
 	else
 		push(&kc->pages_jobs, job);
 	wake(kc);
@@ -681,12 +688,18 @@ int dm_kcopyd_copy(struct dm_kcopyd_clie
 	job->write_err = 0;
 	job->rw = READ;
 
-	job->source = *from;
-
 	job->num_dests = num_dests;
 	memcpy(&job->dests, dests, sizeof(*dests) * num_dests);
 
-	job->pages = NULL;
+	if (from) {
+		job->source = *from;
+		job->pages = NULL;
+	} else {
+		memset(&job->source, 0, sizeof job->source);
+		job->source.count = job->dests[0].count;
+		job->pages = &zero_page_list;
+		job->rw = WRITE;
+	}
 
 	job->fn = fn;
 	job->context = context;

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] dm-kcopyd: optionally zero an area instead of copying
  2011-06-08 21:55 [PATCH] dm-kcopyd: optionally zero an area instead of copying Mikulas Patocka
@ 2011-06-09 10:04 ` Joe Thornber
  2011-06-09 15:36   ` Mikulas Patocka
  0 siblings, 1 reply; 5+ messages in thread
From: Joe Thornber @ 2011-06-09 10:04 UTC (permalink / raw)
  To: Mikulas Patocka; +Cc: dm-devel, Alasdair G. Kergon

On Wed, Jun 08, 2011 at 05:55:37PM -0400, Mikulas Patocka wrote:
> Hi
> 
> This patch introduces an option to kcopyd to zero requested area instead 
> of copying. I think Joe may need something like this in his snapshot 
> store.

Could we have another function please, rather than overloading the
existing entry point?

i.e.,

int dm_kcopyd_zero(struct dm_kcopyd_client *kc,
		   unsigned num_dests, struct dm_io_region *dests,
		   unsigned flags, dm_kcopyd_notify_fn fn, void *context);

Thanks,

- Joe

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] dm-kcopyd: optionally zero an area instead of copying
  2011-06-09 10:04 ` Joe Thornber
@ 2011-06-09 15:36   ` Mikulas Patocka
  2011-06-23 14:34     ` Alasdair G Kergon
  0 siblings, 1 reply; 5+ messages in thread
From: Mikulas Patocka @ 2011-06-09 15:36 UTC (permalink / raw)
  To: Joe Thornber; +Cc: dm-devel, Alasdair G. Kergon



On Thu, 9 Jun 2011, Joe Thornber wrote:

> On Wed, Jun 08, 2011 at 05:55:37PM -0400, Mikulas Patocka wrote:
> > Hi
> > 
> > This patch introduces an option to kcopyd to zero requested area instead 
> > of copying. I think Joe may need something like this in his snapshot 
> > store.
> 
> Could we have another function please, rather than overloading the
> existing entry point?
> 
> i.e.,
> 
> int dm_kcopyd_zero(struct dm_kcopyd_client *kc,
> 		   unsigned num_dests, struct dm_io_region *dests,
> 		   unsigned flags, dm_kcopyd_notify_fn fn, void *context);
> 
> Thanks,
> 
> - Joe
> 

Here it is ... but it duplicates some code in dm_kcopyd_copy..

Mikulas

---

dm-kcopyd: optionally zero an area instead of copying

This patch introduces new function "dm_kcopyd_zero" that zeroes a
requested.

Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>

---
 drivers/md/dm-kcopyd.c    |   53 +++++++++++++++++++++++++++++++++++++++++++++-
 include/linux/dm-kcopyd.h |    4 +++
 2 files changed, 56 insertions(+), 1 deletion(-)

Index: linux-2.6.39-fast/drivers/md/dm-kcopyd.c
===================================================================
--- linux-2.6.39-fast.orig/drivers/md/dm-kcopyd.c	2011-06-09 17:15:34.000000000 +0200
+++ linux-2.6.39-fast/drivers/md/dm-kcopyd.c	2011-06-09 17:20:30.000000000 +0200
@@ -69,6 +69,8 @@ struct dm_kcopyd_client {
 	struct list_head pages_jobs;
 };
 
+static struct page_list zero_page_list;
+
 static DEFINE_SPINLOCK(throttle_spinlock);
 
 /*
@@ -339,6 +341,9 @@ int __init dm_kcopyd_init(void)
 	if (!_job_cache)
 		return -ENOMEM;
 
+	zero_page_list.next = &zero_page_list;
+	zero_page_list.page = ZERO_PAGE(0);
+
 	return 0;
 }
 
@@ -407,7 +412,7 @@ static int run_complete_job(struct kcopy
 	dm_kcopyd_notify_fn fn = job->fn;
 	struct dm_kcopyd_client *kc = job->kc;
 
-	if (job->pages)
+	if (job->pages && job->pages != &zero_page_list)
 		kcopyd_put_pages(kc, job->pages);
 	/* Do not free sub-jobs */
 	if (context != job)
@@ -570,6 +575,8 @@ static void dispatch_job(struct kcopyd_j
 	atomic_inc(&kc->nr_jobs);
 	if (unlikely(!job->source.count))
 		push(&kc->complete_jobs, job);
+	else if (job->pages == &zero_page_list)
+		push(&kc->io_jobs, job);
 	else
 		push(&kc->pages_jobs, job);
 	wake(kc);
@@ -704,6 +711,50 @@ int dm_kcopyd_copy(struct dm_kcopyd_clie
 }
 EXPORT_SYMBOL(dm_kcopyd_copy);
 
+int dm_kcopyd_zero(struct dm_kcopyd_client *kc,
+		   unsigned int num_dests, struct dm_io_region *dests,
+		   unsigned int flags, dm_kcopyd_notify_fn fn, void *context)
+{
+	struct kcopyd_job *job;
+
+	/*
+	 * Allocate a new job.
+	 */
+	job = mempool_alloc(kc->job_pool, GFP_NOIO);
+
+	/*
+	 * set up for the write.
+	 */
+	job->kc = kc;
+	job->flags = flags;
+	job->read_err = 0;
+	job->write_err = 0;
+	job->rw = WRITE;
+
+	memset(&job->source, 0, sizeof job->source);
+	job->source.count = dests[0].count;
+
+	job->num_dests = num_dests;
+	memcpy(&job->dests, dests, sizeof(*dests) * num_dests);
+
+	job->pages = &zero_page_list;
+
+	job->fn = fn;
+	job->context = context;
+
+	if (job->source.count <= SUB_JOB_SIZE)
+		dispatch_job(job);
+
+	else {
+		mutex_init(&job->lock);
+		job->progress = 0;
+		split_job(job);
+	}
+
+	return 0;
+}
+EXPORT_SYMBOL(dm_kcopyd_zero);
+
 /*
  * Cancels a kcopyd job, eg. someone might be deactivating a
  * mirror.
Index: linux-2.6.39-fast/include/linux/dm-kcopyd.h
===================================================================
--- linux-2.6.39-fast.orig/include/linux/dm-kcopyd.h	2011-06-09 17:20:47.000000000 +0200
+++ linux-2.6.39-fast/include/linux/dm-kcopyd.h	2011-06-09 17:21:01.000000000 +0200
@@ -55,5 +55,9 @@ int dm_kcopyd_copy(struct dm_kcopyd_clie
 		   unsigned num_dests, struct dm_io_region *dests,
 		   unsigned flags, dm_kcopyd_notify_fn fn, void *context);
 
+int dm_kcopyd_zero(struct dm_kcopyd_client *kc,
+		   unsigned num_dests, struct dm_io_region *dests,
+		   unsigned flags, dm_kcopyd_notify_fn fn, void *context);
+
 #endif	/* __KERNEL__ */
 #endif	/* _LINUX_DM_KCOPYD_H */

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] dm-kcopyd: optionally zero an area instead of copying
  2011-06-09 15:36   ` Mikulas Patocka
@ 2011-06-23 14:34     ` Alasdair G Kergon
  2011-06-23 15:24       ` Mikulas Patocka
  0 siblings, 1 reply; 5+ messages in thread
From: Alasdair G Kergon @ 2011-06-23 14:34 UTC (permalink / raw)
  To: Mikulas Patocka; +Cc: dm-devel, Joe Thornber

On Thu, Jun 09, 2011 at 11:36:44AM -0400, Mikulas Patocka wrote:
> Here it is ... but it duplicates some code in dm_kcopyd_copy..
 
Obviously I don't want the duplication:)

Presumably a wrapper function with the first patch will suffice?

Alasdair

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] dm-kcopyd: optionally zero an area instead of copying
  2011-06-23 14:34     ` Alasdair G Kergon
@ 2011-06-23 15:24       ` Mikulas Patocka
  0 siblings, 0 replies; 5+ messages in thread
From: Mikulas Patocka @ 2011-06-23 15:24 UTC (permalink / raw)
  To: Alasdair G Kergon; +Cc: dm-devel, Joe Thornber



On Thu, 23 Jun 2011, Alasdair G Kergon wrote:

> On Thu, Jun 09, 2011 at 11:36:44AM -0400, Mikulas Patocka wrote:
> > Here it is ... but it duplicates some code in dm_kcopyd_copy..
>  
> Obviously I don't want the duplication:)
> 
> Presumably a wrapper function with the first patch will suffice?
> 
> Alasdair

Hi

So you can use this patch that adds a new function, but internaly works as 
passing NULL from to dm_kcopyd_copy.

Mikulas

---

dm-kcopyd: optionally zero an area instead of copying

This patch introduces new function "dm_kcopyd_zero" that zeroes a
requested.

Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>

---
 drivers/md/dm-kcopyd.c    |   31 ++++++++++++++++++++++++++-----
 include/linux/dm-kcopyd.h |    3 +++
 2 files changed, 29 insertions(+), 5 deletions(-)

Index: linux-2.6.39-fast/drivers/md/dm-kcopyd.c
===================================================================
--- linux-2.6.39-fast.orig/drivers/md/dm-kcopyd.c	2011-06-23 16:58:49.000000000 +0200
+++ linux-2.6.39-fast/drivers/md/dm-kcopyd.c	2011-06-23 17:02:47.000000000 +0200
@@ -69,6 +69,8 @@ struct dm_kcopyd_client {
 	struct list_head pages_jobs;
 };
 
+static struct page_list zero_page_list;
+
 static DEFINE_SPINLOCK(throttle_spinlock);
 
 /*
@@ -339,6 +341,9 @@ int __init dm_kcopyd_init(void)
 	if (!_job_cache)
 		return -ENOMEM;
 
+	zero_page_list.next = &zero_page_list;
+	zero_page_list.page = ZERO_PAGE(0);
+
 	return 0;
 }
 
@@ -407,7 +412,7 @@ static int run_complete_job(struct kcopy
 	dm_kcopyd_notify_fn fn = job->fn;
 	struct dm_kcopyd_client *kc = job->kc;
 
-	if (job->pages)
+	if (job->pages && job->pages != &zero_page_list)
 		kcopyd_put_pages(kc, job->pages);
 	/* Do not free sub-jobs */
 	if (context != job)
@@ -570,6 +575,8 @@ static void dispatch_job(struct kcopyd_j
 	atomic_inc(&kc->nr_jobs);
 	if (unlikely(!job->source.count))
 		push(&kc->complete_jobs, job);
+	else if (job->pages == &zero_page_list)
+		push(&kc->io_jobs, job);
 	else
 		push(&kc->pages_jobs, job);
 	wake(kc);
@@ -679,14 +686,20 @@ int dm_kcopyd_copy(struct dm_kcopyd_clie
 	job->flags = flags;
 	job->read_err = 0;
 	job->write_err = 0;
-	job->rw = READ;
-
-	job->source = *from;
 
 	job->num_dests = num_dests;
 	memcpy(&job->dests, dests, sizeof(*dests) * num_dests);
 
-	job->pages = NULL;
+	if (from) {
+		job->source = *from;
+		job->pages = NULL;
+		job->rw = READ;
+	} else {
+		memset(&job->source, 0, sizeof job->source);
+		job->source.count = job->dests[0].count;
+		job->pages = &zero_page_list;
+		job->rw = WRITE;
+	}
 
 	job->fn = fn;
 	job->context = context;
@@ -704,6 +717,14 @@ int dm_kcopyd_copy(struct dm_kcopyd_clie
 }
 EXPORT_SYMBOL(dm_kcopyd_copy);
 
+int dm_kcopyd_zero(struct dm_kcopyd_client *kc,
+		   unsigned int num_dests, struct dm_io_region *dests,
+		   unsigned int flags, dm_kcopyd_notify_fn fn, void *context)
+{
+	return dm_kcopyd_copy(kc, NULL, num_dests, dests, flags, fn, context);
+}
+EXPORT_SYMBOL(dm_kcopyd_zero);
+
 /*
  * Cancels a kcopyd job, eg. someone might be deactivating a
  * mirror.
Index: linux-2.6.39-fast/include/linux/dm-kcopyd.h
===================================================================
--- linux-2.6.39-fast.orig/include/linux/dm-kcopyd.h	2011-06-23 17:00:16.000000000 +0200
+++ linux-2.6.39-fast/include/linux/dm-kcopyd.h	2011-06-23 17:00:42.000000000 +0200
@@ -54,6 +54,9 @@ typedef void (*dm_kcopyd_notify_fn)(int 
 int dm_kcopyd_copy(struct dm_kcopyd_client *kc, struct dm_io_region *from,
 		   unsigned num_dests, struct dm_io_region *dests,
 		   unsigned flags, dm_kcopyd_notify_fn fn, void *context);
+int dm_kcopyd_zero(struct dm_kcopyd_client *kc,
+		   unsigned num_dests, struct dm_io_region *dests,
+		   unsigned flags, dm_kcopyd_notify_fn fn, void *context);
 
 #endif	/* __KERNEL__ */
 #endif	/* _LINUX_DM_KCOPYD_H */

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2011-06-23 15:24 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-06-08 21:55 [PATCH] dm-kcopyd: optionally zero an area instead of copying Mikulas Patocka
2011-06-09 10:04 ` Joe Thornber
2011-06-09 15:36   ` Mikulas Patocka
2011-06-23 14:34     ` Alasdair G Kergon
2011-06-23 15:24       ` Mikulas Patocka

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.