]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: release unused caps, but keep some reserve
authorSage Weil <sage@newdream.net>
Wed, 29 Jul 2009 23:11:04 +0000 (16:11 -0700)
committerSage Weil <sage@newdream.net>
Wed, 29 Jul 2009 23:11:04 +0000 (16:11 -0700)
Release unused caps.  Keep some reserve so we can do a readdir
(which reserves lots of caps) quickly, without reallocating a
zillion new caps.

src/kernel/caps.c

index 86e243ab3e60751dfbe0c36e0771f4184485807c..de6be4df62b55c3c2c3ef515b8213c062c19d8b9 100644 (file)
@@ -262,13 +262,24 @@ static void put_cap(struct ceph_cap *cap,
             ctx, ctx ? ctx->count : 0, caps_total_count, caps_use_count,
             caps_reserve_count, caps_avail_count);
        caps_use_count--;
-       if (ctx) {
-               ctx->count++;
-               caps_reserve_count++;
+       /*
+        * Keep some preallocated caps around, at least enough to do a
+        * readdir (which needs to preallocate lots of them), to avoid
+        * lots of free/alloc churn.
+        */
+       if (caps_avail_count >= caps_reserve_count +
+           ceph_client(cap->ci->vfs_inode.i_sb)->mount_args.max_readdir) {
+               caps_total_count--;
+               kfree(cap);
        } else {
-               caps_avail_count++;
+               if (ctx) {
+                       ctx->count++;
+                       caps_reserve_count++;
+               } else {
+                       caps_avail_count++;
+               }
+               list_add(&cap->caps_item, &caps_list);
        }
-       list_add(&cap->caps_item, &caps_list);
 
        BUG_ON(caps_total_count != caps_use_count + caps_reserve_count +
               caps_avail_count);