Received: by 2002:ac0:a5a7:0:0:0:0:0 with SMTP id m36-v6csp269312imm; Thu, 12 Jul 2018 19:07:15 -0700 (PDT) X-Google-Smtp-Source: AAOMgpcNJn7Io9KRUxm/Ct43dl5wYoUTrmlbi36EMwUezoSg8is4xZCZzzr6Ywo2YsmjcNQl2Pp1 X-Received: by 2002:a63:c80e:: with SMTP id z14-v6mr4135057pgg.77.1531447635011; Thu, 12 Jul 2018 19:07:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1531447634; cv=none; d=google.com; s=arc-20160816; b=P5B3BHGh6+ZI3sdyyPncGk+lcMpxXdw7MmIgeM/fC2UBtinoQq0U7gmT7CHsfSP5Cd m7EwpLd9KCMdhvX8PH6StXmyuZz/XxzDN7SxKWnB0R6nwqyxtowUpOsyckYt94/NsPt1 kbFpft8Mno25tAvy/KphMyU4qVf3/6+u/mcYrjY/en24vKOhMnVu5Xho+rRuPo+C3j2C 7obn6G77cmu87KVRTqs3Zj4v06FfLe/RON+h79+v+HoTEek1bBP/zPcOC6JQbYXYXscr RY1t9VYKketeAShKNyLs2TGEU+9lliuN2bQ2XlCKSS58zuLewH/+6aAh2yOi73pzE1rv 3ooQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:in-reply-to :mime-version:user-agent:date:message-id:from:cc:references:to :subject:arc-authentication-results; bh=cXeEw3zrdw7NOurz/NxsNCQGcClKvmc9FzrLw+fx/Ro=; b=Tj8SJc5u0rn8PlM7IQcqEb1En1Q1eWtLijWJkNi8PvG7Ze/9VPZcmLXiWN34ihS+m2 tTvW/V2wyLLy804zi9JKO2kKML2VzNKd416GmQnd7KAZe51iKx/d/abte1NmI/5J4mSN +6SGF6jpZenAxYuCtTlHGUTphaJGLQo7m+DTn9Wsu5gGbtcST6ka+83grUqrXRgkEsBm oSbkpJbvmF5LEwpgMgjJzrwKyI+BncFxtNZloPRDxoWSGEuVGQ15V2J4aDanuIw2aism /y3S1vRqn9Cg5SzWqWx7cx0LL4E+kYtYEvvmDvnifonvNj7rsVcODHiAMAHHfoPdPJOy AQog== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id z9-v6si22115503pln.250.2018.07.12.19.06.59; Thu, 12 Jul 2018 19:07:14 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388053AbeGMCS2 (ORCPT + 99 others); Thu, 12 Jul 2018 22:18:28 -0400 Received: from szxga04-in.huawei.com ([45.249.212.190]:9614 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S2387972AbeGMCS2 (ORCPT ); Thu, 12 Jul 2018 22:18:28 -0400 Received: from DGGEMS407-HUB.china.huawei.com (unknown [172.30.72.58]) by Forcepoint Email with ESMTP id 45585282D3412; Fri, 13 Jul 2018 10:05:54 +0800 (CST) Received: from [127.0.0.1] (10.177.16.168) by DGGEMS407-HUB.china.huawei.com (10.3.19.207) with Microsoft SMTP Server id 14.3.382.0; Fri, 13 Jul 2018 10:05:51 +0800 Subject: Re: [V9fs-developer] [PATCH v2 3/6] 9p: Replace the fidlist with an IDR To: Matthew Wilcox , Dominique Martinet References: <20180711210225.19730-1-willy@infradead.org> <20180711210225.19730-4-willy@infradead.org> CC: Latchesar Ionkov , Eric Van Hensbergen , , Ron Minnich , , From: jiangyiwen Message-ID: <5B4808FE.7010500@huawei.com> Date: Fri, 13 Jul 2018 10:05:50 +0800 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Thunderbird/38.5.1 MIME-Version: 1.0 In-Reply-To: <20180711210225.19730-4-willy@infradead.org> Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: 7bit X-Originating-IP: [10.177.16.168] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2018/7/12 5:02, Matthew Wilcox wrote: > The p9_idpool being used to allocate the IDs uses an IDR to allocate > the IDs ... which we then keep in a doubly-linked list, rather than in > the IDR which allocated them. We can use an IDR directly which saves > two pointers per p9_fid, and a tiny memory allocation per p9_client. > > Signed-off-by: Matthew Wilcox > --- > include/net/9p/client.h | 9 +++------ > net/9p/client.c | 44 +++++++++++++++-------------------------- > 2 files changed, 19 insertions(+), 34 deletions(-) > > diff --git a/include/net/9p/client.h b/include/net/9p/client.h > index 7af9d769b97d..e405729cd1c7 100644 > --- a/include/net/9p/client.h > +++ b/include/net/9p/client.h > @@ -27,6 +27,7 @@ > #define NET_9P_CLIENT_H > > #include > +#include > > /* Number of requests per row */ > #define P9_ROW_MAXTAG 255 > @@ -128,8 +129,7 @@ struct p9_req_t { > * @proto_version: 9P protocol version to use > * @trans_mod: module API instantiated with this client > * @trans: tranport instance state and API > - * @fidpool: fid handle accounting for session > - * @fidlist: List of active fid handles > + * @fids: All active FID handles > * @tagpool - transaction id accounting for session > * @reqs - 2D array of requests > * @max_tag - current maximum tag id allocated > @@ -169,8 +169,7 @@ struct p9_client { > } tcp; > } trans_opts; > > - struct p9_idpool *fidpool; > - struct list_head fidlist; > + struct idr fids; > > struct p9_idpool *tagpool; > struct p9_req_t *reqs[P9_ROW_MAXTAG]; > @@ -188,7 +187,6 @@ struct p9_client { > * @iounit: the server reported maximum transaction size for this file > * @uid: the numeric uid of the local user who owns this handle > * @rdir: readdir accounting structure (allocated on demand) > - * @flist: per-client-instance fid tracking > * @dlist: per-dentry fid tracking > * > * TODO: This needs lots of explanation. > @@ -204,7 +202,6 @@ struct p9_fid { > > void *rdir; > > - struct list_head flist; > struct hlist_node dlist; /* list of all fids attached to a dentry */ > }; > > diff --git a/net/9p/client.c b/net/9p/client.c > index 389a2904b7b3..b89c7298267c 100644 > --- a/net/9p/client.c > +++ b/net/9p/client.c > @@ -908,30 +908,29 @@ static struct p9_fid *p9_fid_create(struct p9_client *clnt) > { > int ret; > struct p9_fid *fid; > - unsigned long flags; > > p9_debug(P9_DEBUG_FID, "clnt %p\n", clnt); > fid = kmalloc(sizeof(struct p9_fid), GFP_KERNEL); > if (!fid) > return NULL; > > - ret = p9_idpool_get(clnt->fidpool); > - if (ret < 0) > - goto error; > - fid->fid = ret; > - > memset(&fid->qid, 0, sizeof(struct p9_qid)); > fid->mode = -1; > fid->uid = current_fsuid(); > fid->clnt = clnt; > fid->rdir = NULL; > - spin_lock_irqsave(&clnt->lock, flags); > - list_add(&fid->flist, &clnt->fidlist); > - spin_unlock_irqrestore(&clnt->lock, flags); > + fid->fid = 0; > > - return fid; > + idr_preload(GFP_KERNEL); It is best to use GFP_NOFS instead, or else it may cause some unpredictable problem, because when out of memory it will reclaim memory from v9fs. > + spin_lock_irq(&clnt->lock); > + ret = idr_alloc_u32(&clnt->fids, fid, &fid->fid, P9_NOFID - 1, > + GFP_NOWAIT); > + spin_unlock_irq(&clnt->lock); use spin_lock instead, clnt->lock is not used in irq context. > + idr_preload_end(); > + > + if (!ret) > + return fid; > > -error: > kfree(fid); > return NULL; > } > @@ -943,9 +942,8 @@ static void p9_fid_destroy(struct p9_fid *fid) > > p9_debug(P9_DEBUG_FID, "fid %d\n", fid->fid); > clnt = fid->clnt; > - p9_idpool_put(fid->fid, clnt->fidpool); > spin_lock_irqsave(&clnt->lock, flags); > - list_del(&fid->flist); > + idr_remove(&clnt->fids, fid->fid); > spin_unlock_irqrestore(&clnt->lock, flags); > kfree(fid->rdir); > kfree(fid); > @@ -1028,7 +1026,7 @@ struct p9_client *p9_client_create(const char *dev_name, char *options) > memcpy(clnt->name, client_id, strlen(client_id) + 1); > > spin_lock_init(&clnt->lock); > - INIT_LIST_HEAD(&clnt->fidlist); > + idr_init(&clnt->fids); > > err = p9_tag_init(clnt); > if (err < 0) > @@ -1048,18 +1046,12 @@ struct p9_client *p9_client_create(const char *dev_name, char *options) > goto destroy_tagpool; > } > > - clnt->fidpool = p9_idpool_create(); > - if (IS_ERR(clnt->fidpool)) { > - err = PTR_ERR(clnt->fidpool); > - goto put_trans; > - } > - > p9_debug(P9_DEBUG_MUX, "clnt %p trans %p msize %d protocol %d\n", > clnt, clnt->trans_mod, clnt->msize, clnt->proto_version); > > err = clnt->trans_mod->create(clnt, dev_name, options); > if (err) > - goto destroy_fidpool; > + goto put_trans; > > if (clnt->msize > clnt->trans_mod->maxsize) > clnt->msize = clnt->trans_mod->maxsize; > @@ -1072,8 +1064,6 @@ struct p9_client *p9_client_create(const char *dev_name, char *options) > > close_trans: > clnt->trans_mod->close(clnt); > -destroy_fidpool: > - p9_idpool_destroy(clnt->fidpool); > put_trans: > v9fs_put_trans(clnt->trans_mod); > destroy_tagpool: > @@ -1086,7 +1076,8 @@ EXPORT_SYMBOL(p9_client_create); > > void p9_client_destroy(struct p9_client *clnt) > { > - struct p9_fid *fid, *fidptr; > + struct p9_fid *fid; > + int id; > > p9_debug(P9_DEBUG_MUX, "clnt %p\n", clnt); > > @@ -1095,14 +1086,11 @@ void p9_client_destroy(struct p9_client *clnt) > > v9fs_put_trans(clnt->trans_mod); > > - list_for_each_entry_safe(fid, fidptr, &clnt->fidlist, flist) { > + idr_for_each_entry(&clnt->fids, fid, id) { > pr_info("Found fid %d not clunked\n", fid->fid); > p9_fid_destroy(fid); > } > > - if (clnt->fidpool) > - p9_idpool_destroy(clnt->fidpool); > - I suggest add idr_destroy in the end. > p9_tag_cleanup(clnt); > > kfree(clnt); >