> 在 2018年3月5日,上午10:52,Yan, Zheng <zyan@xxxxxxxxxx> 写道: > > > >> On 24 Feb 2018, at 18:35, Chengguang Xu <cgxu519@xxxxxxxxxx> wrote: >> >> When setting high volume of caps_min_count or having many >> unreserved caps, unused caps may always keep in the ->caps_list >> even can't get new cap from kmem_cache_alloc because lack of >> maximum limitation of caps_avail_count. Hence reuse caps in >> ->caps_list if available, it's maybe better than setting max >> limitation of caps_avail_count and releasing unused caps when >> reaching the limit. >> >> Signed-off-by: Chengguang Xu <cgxu519@xxxxxxxxxx> >> --- >> Only compile tested. >> >> fs/ceph/caps.c | 17 +++++++++++++++++ >> 1 file changed, 17 insertions(+) >> >> diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c >> index 6582c45..b598a24 100644 >> --- a/fs/ceph/caps.c >> +++ b/fs/ceph/caps.c >> @@ -280,6 +280,23 @@ struct ceph_cap *ceph_get_cap(struct ceph_mds_client *mdsc, >> /* temporary, until we do something about cap import/export */ >> if (!ctx) { >> cap = kmem_cache_alloc(ceph_cap_cachep, GFP_NOFS); >> + if (!cap) { >> + spin_lock(&mdsc->caps_list_lock); >> + if (mdsc->caps_avail_count) { >> + BUG_ON(list_empty(&mdsc->caps_list)); >> + >> + mdsc->caps_avail_count--; >> + mdsc->caps_use_count++; >> + cap = list_first_entry(&mdsc->caps_list, >> + struct ceph_cap, caps_item); >> + list_del(&cap->caps_item); >> + >> + BUG_ON(mdsc->caps_total_count != mdsc->caps_use_count + >> + mdsc->caps_reserve_count + mdsc->caps_avail_count); >> + } >> + spin_unlock(&mdsc->caps_list_lock); >> + } >> + > > should skip executing following code. I fixed it locally Yes, that should be in else part. Thanks for your fix. > >> if (cap) { >> spin_lock(&mdsc->caps_list_lock); >> mdsc->caps_use_count++; >> -- >> 1.8.3.1 -- To unsubscribe from this list: send the line "unsubscribe ceph-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html