All of lore.kernel.org
 help / color / mirror / Atom feed
From: Leon Romanovsky <leon@kernel.org>
To: "Zhijian Li (Fujitsu)" <lizhijian@fujitsu.com>
Cc: Zhu Yanjun <yanjun.zhu@linux.dev>,
	Guoqing Jiang <guoqing.jiang@linux.dev>,
	"haris.iqbal@ionos.com" <haris.iqbal@ionos.com>,
	"jinpu.wang@ionos.com" <jinpu.wang@ionos.com>,
	"jgg@ziepe.ca" <jgg@ziepe.ca>,
	"linux-rdma@vger.kernel.org" <linux-rdma@vger.kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH for-next 2/3] RDMA/rtrs: Fix rxe_dealloc_pd warning
Date: Tue, 18 Apr 2023 10:57:06 +0300	[thread overview]
Message-ID: <20230418075706.GB9740@unreal> (raw)
In-Reply-To: <0985e0a9-fe19-1c07-0da7-48ec88eb77c6@fujitsu.com>

On Tue, Apr 18, 2023 at 07:04:00AM +0000, Zhijian Li (Fujitsu) wrote:
> 
> 
> On 18/04/2023 02:04, Leon Romanovsky wrote:
> > On Mon, Apr 17, 2023 at 02:18:24AM +0000, Zhijian Li (Fujitsu) wrote:
> >>
> >>
> >> On 14/04/2023 23:58, Zhu Yanjun wrote:
> >>> 在 2023/4/13 21:24, Leon Romanovsky 写道:
> >>>> On Thu, Apr 13, 2023 at 08:12:15AM +0000, Zhijian Li (Fujitsu) wrote:
> >>>>>
> >>>>>
> >>>>> On 13/04/2023 15:35, Guoqing Jiang wrote:
> >>>>>> Hi,
> >>>>>>
> >>>>>> I take a closer look today.
> >>>>>>
> >>>>>> On 4/12/23 09:15, Zhijian Li (Fujitsu) wrote:
> >>>>>>>
> >>>>>>> On 11/04/2023 20:26, Leon Romanovsky wrote:
> >>>>>>>> On Tue, Apr 11, 2023 at 02:43:46AM +0000, Zhijian Li (Fujitsu) wrote:
> >>>>>>>>>
> >>>>>>>>> On 10/04/2023 21:10, Guoqing Jiang wrote:
> >>>>>>>>>>
> >>>>>>>>>> On 4/10/23 20:08, Leon Romanovsky wrote:
> >>>>>>>>>>> On Mon, Apr 10, 2023 at 06:43:03AM +0000, Li Zhijian wrote:
> >>>>>>>>>>>> The warning occurs when destroying PD whose reference count is not zero.
> >>>>>>>>>>>>
> >>>>>>>>>>>> Precodition: clt_path->s.con_num is 2.
> >>>>>>>>>>>> So 2 cm connection will be created as below:
> >>>>>>>>>>>> CPU0                                              CPU1
> >>>>>>>>>>>> init_conns {                              |
> >>>>>>>>>>>>        create_cm() // a. con[0] created        |
> >>>>>>>>>>>>                                                |  a'. rtrs_clt_rdma_cm_handler() {
> >>>>>>>>>>>>                                                |    rtrs_rdma_addr_resolved()
> >>>>>>>>>>>>                                                |      create_con_cq_qp(con); << con[0]
> >>>>>>>>>>>>                                                |  }
> >>>>>>>>>>>>                                                | in this moment, refcnt of PD was increased to 2+
> >>>>>>
> >>>>>> What do you mean "refcnt of PD"? usecnt in struct ib_pd or dev_ref.
> >>>>>
> >>>>> I mean usecnt in struct ib_pd
> >>>>>
> >>>>>
> >>>>>
> >>>>>>
> >>>>>>>>>>>>                                                |
> >>>>>>>>>>>>        create_cm() // b. cid = 1, failed       |
> >>>>>>>>>>>>          destroy_con_cq_qp()                   |
> >>>>>>>>>>>>            rtrs_ib_dev_put()                   |
> >>>>>>>>>>>>              dev_free()                        |
> >>>>>>>>>>>>                ib_dealloc_pd(dev->ib_pd) << PD |
> >>>>>>>>>>>>                 is destroyed, but refcnt is    |
> >>>>>>>>>>>>                 still greater than 0           |
> >>>>>>
> >>>>>> Assuming you mean "pd->usecnt". We only allocate pd in con[0] by rtrs_ib_dev_find_or_add,
> >>>>>> if con[1] failed to create cm, then alloc_path_reqs -> ib_alloc_mr -> atomic_inc(&pd->usecnt)
> >>>>>> can't be triggered. Is there other places could increase the refcnt?
> >>>>>
> >>>>>
> >>>>> Yes, when create a qp, it will also associate to this PD, that also mean refcnt of PD will be increased.
> >>>>>
> >>>>> When con[0](create_con_cq_qp) succeeded, refcnt of PD will be 2. and then when con[1] failed, since
> >>>>> QP didn't create, refcnt of PD is still 2. con[1]'s cleanup will destroy the PD(ib_dealloc_pd) since dev_ref = 1, after that its
> >>>>> refcnt is still 1.
> >>>>
> >>>> Why is refcnt 1 in con[1] destruction phase? It seems to me like a bug.
> >>
> >>
> >>
> >>> +	if (!con->has_dev)
> >>> +		return;
> >>>   	if (clt_path->s.dev_ref && !--clt_path->s.dev_ref) {
> >>>   		rtrs_ib_dev_put(clt_path->s.dev);
> >>>   		clt_path->s.dev = NULL;
> >>
> >> Currently, without this patch:
> >> 1. PD and clt_path->s.dev are shared among connections.
> >> 2. every con[n]'s cleanup phase will call destroy_con_cq_qp()
> >> 3. clt_path->s.dev will be always decreased in destroy_con_cq_qp(), and when
> >>      clt_path->s.dev become zero, it will destroy PD.
> >> 4. when con[1] failed to create, con[1] will not take clt_path->s.dev, but it try to decreased clt_path->s.dev <<< it's wrong to do that.
> > 
> > So please fix it by making sure that failure to create con[1] will
> > release resources which were allocated. If con[1] didn't increase
> > s.dev_ref, it shouldn't decrease it either.
> 
> You are right, the current patch did exactly that.
> It introduced a con owning flag 'has_dev' to indicate whether this con has taken s.dev.
> so that its cleanup phase will only decrease its s.dev properly.

The has_dev is a workaround and not a solution. In proper error unwind
sequence, you won't need extra flag.

Thanks

> 
> Thanks
> Zhijian
> 
> 
> > 
> > Thanks
> > 
> >>
> >>
> >> Thanks
> >> Zhijian
> >>
> >>> Agree. We should find out why refcnt 1 and fix this problem.
> >>
> >>
> >>
> >>
> >>>
> >>> Zhu Yanjun
> >>>>
> >>>> Thanks
> >>>

  reply	other threads:[~2023-04-18  7:57 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-04-10  6:43 [PATCH for-next 0/3] rtrs bugfix and cleanups Li Zhijian
2023-04-10  6:43 ` [PATCH for-next 1/3] RDMA/rtrs: Remove duplicate cq_num assignment Li Zhijian
2023-04-10 13:09   ` Guoqing Jiang
2023-04-19 10:37   ` Jinpu Wang
2023-04-10  6:43 ` [PATCH for-next 2/3] RDMA/rtrs: Fix rxe_dealloc_pd warning Li Zhijian
2023-04-10 12:08   ` Leon Romanovsky
2023-04-10 13:10     ` Guoqing Jiang
2023-04-11  2:43       ` Zhijian Li (Fujitsu)
2023-04-11 12:26         ` Leon Romanovsky
2023-04-12  1:15           ` Zhijian Li (Fujitsu)
2023-04-13  7:35             ` Guoqing Jiang
2023-04-13  8:12               ` Zhijian Li (Fujitsu)
2023-04-13 13:24                 ` Leon Romanovsky
2023-04-14 15:58                   ` Zhu Yanjun
2023-04-17  2:18                     ` Zhijian Li (Fujitsu)
2023-04-17 18:04                       ` Leon Romanovsky
2023-04-18  7:04                         ` Zhijian Li (Fujitsu)
2023-04-18  7:57                           ` Leon Romanovsky [this message]
2023-04-19  9:53                             ` Zhijian Li (Fujitsu)
2023-04-19 13:20                               ` Jinpu Wang
2023-04-20  2:00                                 ` Zhijian Li (Fujitsu)
2023-04-21  1:38                                   ` Zhijian Li (Fujitsu)
2023-04-21  6:49                                     ` Zhijian Li (Fujitsu)
2023-04-21  7:05                                     ` Jinpu Wang
2023-04-14  3:40                 ` Guoqing Jiang
2023-04-14  4:25                   ` Bob Pearson
2023-04-14  5:37                   ` Zhijian Li (Fujitsu)
2023-04-14  6:03                     ` Jinpu Wang
2023-04-14  6:47                       ` Zhijian Li (Fujitsu)
2023-04-14  6:04                     ` Guoqing Jiang
2023-04-14 10:09                       ` Zhijian Li (Fujitsu)
2023-04-17  3:08                         ` Guoqing Jiang
2023-04-18  6:47                           ` Zhijian Li (Fujitsu)
2023-04-10  6:43 ` [PATCH for-next 3/3] RDMA/rtrs: Avoid use-after-free in rtrs_clt_rdma_cm_handler Li Zhijian
2023-04-10 12:10   ` Leon Romanovsky
2023-04-10 13:13   ` Guoqing Jiang
2023-04-11  1:33     ` Zhijian Li (Fujitsu)
2023-04-12  1:15       ` Guoqing Jiang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230418075706.GB9740@unreal \
    --to=leon@kernel.org \
    --cc=guoqing.jiang@linux.dev \
    --cc=haris.iqbal@ionos.com \
    --cc=jgg@ziepe.ca \
    --cc=jinpu.wang@ionos.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-rdma@vger.kernel.org \
    --cc=lizhijian@fujitsu.com \
    --cc=yanjun.zhu@linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.