From: Liu Yuan <[email protected]>

We can benefit from RCU list that we can always operate on the list without lock

Signed-off-by: Liu Yuan <[email protected]>
---
 sheep/object_cache.c |   30 ++++++++++++------------------
 1 file changed, 12 insertions(+), 18 deletions(-)

diff --git a/sheep/object_cache.c b/sheep/object_cache.c
index 0a2e3f3..59f1015 100644
--- a/sheep/object_cache.c
+++ b/sheep/object_cache.c
@@ -49,7 +49,7 @@
 
 struct global_cache {
        uint64_t cache_size;
-       int reclaiming;
+       int in_reclaim;
        struct cds_list_head cache_lru_list;
 };
 
@@ -90,12 +90,13 @@ static pthread_mutex_t hashtable_lock[HASH_SIZE] = {
 
 static struct hlist_head cache_hashtable[HASH_SIZE];
 
-static inline int cache_in_reclaim(int start)
+/*
+ * If the cache is already in reclaim, return 1, otherwise return 0
+ * and set sys_cache.in_reclaim to 1
+ */
+static inline int mark_cache_in_reclaim(void)
 {
-       if (start)
-               return uatomic_cmpxchg(&sys_cache.reclaiming, 0, 1);
-       else
-               return uatomic_read(&sys_cache.reclaiming);
+       return uatomic_cmpxchg(&sys_cache.in_reclaim, 0, 1);
 }
 
 static inline int entry_is_dirty(struct object_cache_entry *entry)
@@ -459,7 +460,7 @@ static void do_reclaim(struct work *work)
 
 static void reclaim_done(struct work *work)
 {
-       uatomic_set(&sys_cache.reclaiming, 0);
+       uatomic_set(&sys_cache.in_reclaim, 0);
        free(work);
 }
 
@@ -563,10 +564,6 @@ add_to_dirty_tree_and_list(struct object_cache *oc, 
uint32_t idx,
        struct object_cache_entry *entry;
        entry = dirty_tree_and_list_insert(oc, idx, bmap, create);
 
-       if (cache_in_reclaim(0))
-               return;
-
-       /* If cache isn't in reclaiming, move it to the head of lru list */
        cds_list_del_rcu(&entry->lru_list);
        cds_list_add_rcu(&entry->lru_list, &sys_cache.cache_lru_list);
 }
@@ -591,7 +588,7 @@ void object_cache_try_to_reclaim(void)
        if (uatomic_read(&sys_cache.cache_size) < sys->cache_size)
                return;
 
-       if (cache_in_reclaim(1))
+       if (mark_cache_in_reclaim())
                return;
 
        work = xzalloc(sizeof(struct work));
@@ -995,11 +992,8 @@ retry:
                        goto err;
                req->rp.data_length = hdr->data_length;
 
-               if (entry && !cache_in_reclaim(0)) {
-                       cds_list_del_rcu(&entry->lru_list);
-                       cds_list_add_rcu(&entry->lru_list,
-                                        &sys_cache.cache_lru_list);
-               }
+               cds_list_del_rcu(&entry->lru_list);
+               cds_list_add_rcu(&entry->lru_list, &sys_cache.cache_lru_list);
        }
 err:
        put_cache_entry(entry);
@@ -1198,7 +1192,7 @@ int object_cache_init(const char *p)
 
        CDS_INIT_LIST_HEAD(&sys_cache.cache_lru_list);
        uatomic_set(&sys_cache.cache_size, 0);
-       uatomic_set(&sys_cache.reclaiming, 0);
+       uatomic_set(&sys_cache.in_reclaim, 0);
 
        ret = load_existing_cache();
 err:
-- 
1.7.10.2

-- 
sheepdog mailing list
[email protected]
http://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to