FAQ Search Today's Posts Mark Forums Read
» Video Reviews

» Linux Archive

Linux-archive is a website aiming to archive linux email lists and to make them easily accessible for linux users/developers.


» Sponsor

» Partners

» Sponsor

Go Back   Linux Archive > Redhat > Device-mapper Development

 
 
LinkBack Thread Tools
 
Old 03-19-2012, 02:53 PM
Hannes Reinecke
 
Default dm-table: delayed cleanup for dm_table_destroy()

We should be using a kref instead of the existing holders flag.
This enables us to use delayed cleanup and we'll get rid of the
msleep in dm_table_destroy().

Signed-off-by: Hannes Reinecke <hare@suse.de>
---
drivers/md/dm-table.c | 26 +++++++++++++-------------
1 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c
index a3d1e18..97c01f7 100644
--- a/drivers/md/dm-table.c
+++ b/drivers/md/dm-table.c
@@ -41,7 +41,7 @@

struct dm_table {
struct mapped_device *md;
- atomic_t holders;
+ struct kref kref;
unsigned type;

/* btree table */
@@ -208,7 +208,7 @@ int dm_table_create(struct dm_table **result, fmode_t mode,

INIT_LIST_HEAD(&t->devices);
INIT_LIST_HEAD(&t->target_callbacks);
- atomic_set(&t->holders, 0);
+ kref_init(&t->kref);

if (!num_targets)
num_targets = KEYS_PER_NODE;
@@ -240,17 +240,11 @@ static void free_devices(struct list_head *devices)
}
}

-void dm_table_destroy(struct dm_table *t)
+void __table_destroy(struct kref *kref)
{
+ struct dm_table *t = container_of(kref, struct dm_table, kref);
unsigned int i;

- if (!t)
- return;
-
- while (atomic_read(&t->holders))
- msleep(1);
- smp_mb();
-
/* free the indexes */
if (t->depth >= 2)
vfree(t->index[t->depth - 2]);
@@ -277,7 +271,8 @@ void dm_table_destroy(struct dm_table *t)

void dm_table_get(struct dm_table *t)
{
- atomic_inc(&t->holders);
+ if (t)
+ kref_get(&t->kref);
}
EXPORT_SYMBOL(dm_table_get);

@@ -286,11 +281,16 @@ void dm_table_put(struct dm_table *t)
if (!t)
return;

- smp_mb__before_atomic_dec();
- atomic_dec(&t->holders);
+ kref_put(&t->kref, __table_destroy);
}
EXPORT_SYMBOL(dm_table_put);

+void dm_table_destroy(struct dm_table *t)
+{
+ smp_mb__before_atomic_dec();
+ dm_table_put(t);
+}
+
/*
* Checks to see if we need to extend highs or targets.
*/
--
1.6.0.2

--
dm-devel mailing list
dm-devel@redhat.com
https://www.redhat.com/mailman/listinfo/dm-devel
 

Thread Tools




All times are GMT. The time now is 12:27 PM.

VBulletin, Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.
Copyright 2007 - 2008, www.linux-archive.org