From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A1443C4332F for ; Wed, 9 Mar 2022 07:51:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229794AbiCIHwi (ORCPT ); Wed, 9 Mar 2022 02:52:38 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39686 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229825AbiCIHwg (ORCPT ); Wed, 9 Mar 2022 02:52:36 -0500 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 168CE15F081 for ; Tue, 8 Mar 2022 23:51:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1646812297; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=8EooiEDUIiNqsLqksX/5gFpvlfrwnXfbsnSG7xyKFRM=; b=WbLjoaHEUmFA517eiWLah8J7TamEmzDw7yrH4elF2S9aBwXPYeObr20kb3Ja2UbVhWiQpK Y7fmpYpvoB32m8Exaggq79+kdi4HNShMiB14xL5PK/VF0KfpTb/l+UDaOdZSIHx0XtRlEq VuAg8LrJ2h4ZvaWEIndeD6w77dvOR8I= Received: from mail-pj1-f71.google.com (mail-pj1-f71.google.com [209.85.216.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-461-ZFeRA9WxOIe9tqT4eaUzsg-1; Wed, 09 Mar 2022 02:51:35 -0500 X-MC-Unique: ZFeRA9WxOIe9tqT4eaUzsg-1 Received: by mail-pj1-f71.google.com with SMTP id lp2-20020a17090b4a8200b001bc449ecbceso3295894pjb.8 for ; Tue, 08 Mar 2022 23:51:35 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:date:mime-version:user-agent:subject :content-language:to:cc:references:from:in-reply-to :content-transfer-encoding; bh=8EooiEDUIiNqsLqksX/5gFpvlfrwnXfbsnSG7xyKFRM=; b=QZk6vZMEfWaJniDIGYdeSEAz3OQPIVVCkOSAVk+YCM/pKV8MqoaLEAYZ9L1krmnAZV 1jaLMwPAGsupz6XGKJj6UEouoKMG+7gP2rp075yfE9/5nP1PROTHk1ke5nE3DxMHFY9R 9mp71MGFlzE4g071jAhvJFcFvtoCJ8xiGuK9aKyNrGyp/gFKdh23Zn8V4YqrQMhWNEMY XWegEdy7IeoYyf1TrWePVqLNh0QIlW+n9j5hDnKJZlKVYF7/zmJzWl/UUhfH7qgrf4Cg oDET8AwgkMDJYoaFmVTybmvotzxJM6l4+ZSynj3t/n0Fv1SDK6bJaL4QnwIY2Ygv39YQ +UPA== X-Gm-Message-State: AOAM530Wtf9G3njn/goi9zFqP0Ld2E3GP1z25N6MWCbrF6Hi3+Bbrv0i srTRbK57ehQIqRpgjD0IdsjA96UZC43RWpfoIVDw0X9ynQZcUZd5gu4U9TyDV7yixNZxWbfx9ny mEKnEzSj6KHPi X-Received: by 2002:a05:6a00:1aca:b0:4e1:a2b6:5b9 with SMTP id f10-20020a056a001aca00b004e1a2b605b9mr22032653pfv.4.1646812294729; Tue, 08 Mar 2022 23:51:34 -0800 (PST) X-Google-Smtp-Source: ABdhPJw7Di4SBo0vIcLZV8aD0YrzixtPGak4ozbl1xizUy139HXfoBpN9nPz+x4ygNPWdbKEaJoHaw== X-Received: by 2002:a05:6a00:1aca:b0:4e1:a2b6:5b9 with SMTP id f10-20020a056a001aca00b004e1a2b605b9mr22032623pfv.4.1646812294417; Tue, 08 Mar 2022 23:51:34 -0800 (PST) Received: from [10.72.12.183] ([209.132.188.80]) by smtp.gmail.com with ESMTPSA id s16-20020a63ff50000000b003650ee901e1sm1468074pgk.68.2022.03.08.23.51.18 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 08 Mar 2022 23:51:33 -0800 (PST) Message-ID: Date: Wed, 9 Mar 2022 15:51:13 +0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:91.0) Gecko/20100101 Thunderbird/91.6.1 Subject: Re: [PATCH v7 08/26] virtio_ring: extract the logic of freeing vring Content-Language: en-US To: Xuan Zhuo , virtualization@lists.linux-foundation.org, netdev@vger.kernel.org Cc: Jeff Dike , Richard Weinberger , Anton Ivanov , "Michael S. Tsirkin" , "David S. Miller" , Jakub Kicinski , Hans de Goede , Mark Gross , Vadim Pasternak , Bjorn Andersson , Mathieu Poirier , Cornelia Huck , Halil Pasic , Heiko Carstens , Vasily Gorbik , Christian Borntraeger , Alexander Gordeev , Sven Schnelle , Alexei Starovoitov , Daniel Borkmann , Jesper Dangaard Brouer , John Fastabend , Johannes Berg , Vincent Whitchurch , linux-um@lists.infradead.org, platform-driver-x86@vger.kernel.org, linux-remoteproc@vger.kernel.org, linux-s390@vger.kernel.org, kvm@vger.kernel.org, bpf@vger.kernel.org References: <20220308123518.33800-1-xuanzhuo@linux.alibaba.com> <20220308123518.33800-9-xuanzhuo@linux.alibaba.com> From: Jason Wang In-Reply-To: <20220308123518.33800-9-xuanzhuo@linux.alibaba.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: bpf@vger.kernel.org 在 2022/3/8 下午8:35, Xuan Zhuo 写道: > Introduce vring_free() to free the vring of vq. > > Prevent double free by setting vq->reset. > > Signed-off-by: Xuan Zhuo > --- > drivers/virtio/virtio_ring.c | 25 ++++++++++++++++++++----- > include/linux/virtio.h | 8 ++++++++ > 2 files changed, 28 insertions(+), 5 deletions(-) > > diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c > index b5a9bf4f45b3..e0422c04c903 100644 > --- a/drivers/virtio/virtio_ring.c > +++ b/drivers/virtio/virtio_ring.c > @@ -2442,14 +2442,10 @@ struct virtqueue *vring_new_virtqueue(unsigned int index, > } > EXPORT_SYMBOL_GPL(vring_new_virtqueue); > > -void vring_del_virtqueue(struct virtqueue *_vq) > +static void __vring_free(struct virtqueue *_vq) > { > struct vring_virtqueue *vq = to_vvq(_vq); > > - spin_lock(&vq->vq.vdev->vqs_list_lock); > - list_del(&_vq->list); > - spin_unlock(&vq->vq.vdev->vqs_list_lock); > - > if (vq->we_own_ring) { > if (vq->packed_ring) { > vring_free_queue(vq->vq.vdev, > @@ -2480,6 +2476,25 @@ void vring_del_virtqueue(struct virtqueue *_vq) > kfree(vq->split.desc_state); > kfree(vq->split.desc_extra); > } > +} > + > +static void vring_free(struct virtqueue *vq) > +{ > + __vring_free(vq); > + vq->reset = VIRTIO_VQ_RESET_STEP_VRING_RELEASE; > +} > + > +void vring_del_virtqueue(struct virtqueue *_vq) > +{ > + struct vring_virtqueue *vq = to_vvq(_vq); > + > + spin_lock(&vq->vq.vdev->vqs_list_lock); > + list_del(&_vq->list); > + spin_unlock(&vq->vq.vdev->vqs_list_lock); > + > + if (_vq->reset != VIRTIO_VQ_RESET_STEP_VRING_RELEASE) > + __vring_free(_vq); > + > kfree(vq); > } > EXPORT_SYMBOL_GPL(vring_del_virtqueue); > diff --git a/include/linux/virtio.h b/include/linux/virtio.h > index d59adc4be068..e3714e6db330 100644 > --- a/include/linux/virtio.h > +++ b/include/linux/virtio.h > @@ -10,6 +10,13 @@ > #include > #include > > +enum virtio_vq_reset_step { > + VIRTIO_VQ_RESET_STEP_NONE, > + VIRTIO_VQ_RESET_STEP_DEVICE, > + VIRTIO_VQ_RESET_STEP_VRING_RELEASE, > + VIRTIO_VQ_RESET_STEP_VRING_ATTACH, > +}; This part looks not related to the subject. And it needs detail documentation on this. But I wonder how useful it is, anyway we can check the reset status via transport specific way and in the future we may want to do more than just resizing (e.g PASID). Thanks > + > /** > * virtqueue - a queue to register buffers for sending or receiving. > * @list: the chain of virtqueues for this device > @@ -33,6 +40,7 @@ struct virtqueue { > unsigned int num_free; > unsigned int num_max; > void *priv; > + enum virtio_vq_reset_step reset; > }; > > int virtqueue_add_outbuf(struct virtqueue *vq,