[sheepdog] [PATCH] add list_move and list_move_tail
Christoph Hellwig
hch at infradead.org
Mon May 28 12:57:53 CEST 2012
And use them to optimize list_del/list_add_(tail) pairs.
Signed-off-by: Christoph Hellwig <hch at lst.de>
Index: sheepdog/include/list.h
===================================================================
--- sheepdog.orig/include/list.h 2012-05-28 11:12:30.728363536 +0200
+++ sheepdog/include/list.h 2012-05-28 12:39:31.612497218 +0200
@@ -80,6 +80,11 @@ static inline void __list_del(struct lis
prev->next = next;
}
+static inline void __list_del_entry(struct list_head *entry)
+{
+ __list_del(entry->prev, entry->next);
+}
+
static inline void list_del(struct list_head *entry)
{
__list_del(entry->prev, entry->next);
@@ -88,10 +93,23 @@ static inline void list_del(struct list_
static inline void list_del_init(struct list_head *entry)
{
- __list_del(entry->prev, entry->next);
+ __list_del_entry(entry);
INIT_LIST_HEAD(entry);
}
+static inline void list_move(struct list_head *list, struct list_head *head)
+{
+ __list_del_entry(list);
+ list_add(list, head);
+}
+
+static inline void list_move_tail(struct list_head *list,
+ struct list_head *head)
+{
+ __list_del_entry(list);
+ list_add_tail(list, head);
+}
+
static inline void __list_splice(const struct list_head *list,
struct list_head *prev,
struct list_head *next)
diff --git a/collie/treeview.c b/collie/treeview.c
index b1d2242..29d265b 100644
--- a/collie/treeview.c
+++ b/collie/treeview.c
@@ -98,10 +98,8 @@ static void compaction(struct vdi_tree *parent)
list_for_each_entry_safe(vdi, e, &parent->children, siblings) {
new_parent = find_vdi(root, vdi->pvid, vdi->name);
- if (new_parent && parent != new_parent) {
- list_del(&vdi->siblings);
- list_add_tail(&vdi->siblings, &new_parent->children);
- }
+ if (new_parent && parent != new_parent)
+ list_move_tail(&vdi->siblings, &new_parent->children);
compaction(vdi);
}
diff --git a/sheep/recovery.c b/sheep/recovery.c
index 3fb34c0..f7bc62c 100644
--- a/sheep/recovery.c
+++ b/sheep/recovery.c
@@ -417,10 +417,8 @@ static void resume_wait_recovery_requests(void)
list_for_each_entry_safe(req, t, &sys->wait_rw_queue,
request_list) {
dprintf("resume wait oid %" PRIx64 "\n", req->local_oid);
- if (req->rp.result == SD_RES_OBJ_RECOVERING) {
- list_del(&req->request_list);
- list_add_tail(&req->request_list, &sys->request_queue);
- }
+ if (req->rp.result == SD_RES_OBJ_RECOVERING)
+ list_move_tail(&req->request_list, &sys->request_queue);
}
process_request_event_queues();
diff --git a/sheep/sdnet.c b/sheep/sdnet.c
index f4408f7..7fcff4b 100644
--- a/sheep/sdnet.c
+++ b/sheep/sdnet.c
@@ -65,8 +65,7 @@ static void check_object_consistency(struct sd_req *hdr)
nr_bmaps++;
if (bmap->vdi_id == vdi_id) {
set_bit(data_oid_to_idx(hdr->obj.oid), bmap->dobjs);
- list_del(&bmap->list);
- list_add_tail(&bmap->list, &sys->consistent_obj_list);
+ list_move_tail(&bmap->list, &sys->consistent_obj_list);
return;
}
}
@@ -267,8 +266,7 @@ void resume_wait_epoch_requests(void)
setup_access_to_local_objects(req);
/* peer retries the request locally when its epoch changes. */
case SD_RES_NEW_NODE_VER:
- list_del(&req->request_list);
- list_add_tail(&req->request_list, &sys->request_queue);
+ list_move_tail(&req->request_list, &sys->request_queue);
break;
default:
break;
@@ -287,8 +285,7 @@ void resume_wait_obj_requests(uint64_t oid)
* recovered, notify the pending request. */
if (req->local_oid == oid) {
dprintf("retry %" PRIx64 "\n", req->local_oid);
- list_del(&req->request_list);
- list_add_tail(&req->request_list, &sys->request_queue);
+ list_move_tail(&req->request_list, &sys->request_queue);
}
}
process_request_event_queues();
More information about the sheepdog
mailing list