Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp1021664pxf; Thu, 11 Mar 2021 23:11:45 -0800 (PST) X-Google-Smtp-Source: ABdhPJy+3JgWSbz0nhsA+IGs/pVcC2TxaDEHdlWxJwVnbJX8K3+wKYOYz6Kpi6Eb2kiY6IgO+CTT X-Received: by 2002:a17:907:110c:: with SMTP id qu12mr7116549ejb.442.1615533105450; Thu, 11 Mar 2021 23:11:45 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1615533105; cv=none; d=google.com; s=arc-20160816; b=bfa6Zv8immDx1AhlHzNg5obpRik8r8hyCVNO4ipDjDCif8HqghiNEdFEMlzTMvdzBJ TyNDbIXCF2DuWbECr2EPQZXRzhrAjTYH6/KldUcVNOGCopmseGtzN2gOb5zG8qI+RN3c vPaJ99y62dtGFB7SzFLQQOW+BSU95B6XEV7T6YSpbrev0aqrBD75EuNmPrihqEf0rkxR 8NqdjST/QLuqpebMkKRpXfYEg1zUXWitbo9W9TbwEeyj6qRDTdUojgqTyULBmN41myUc r0GhGEmlWJvSRjyKW3lYVd9UD/f/u4jJg8j4vwAHKZmeEflaLYZGD8O0JMz7Ury652JX TJcw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-language:content-transfer-encoding :in-reply-to:mime-version:user-agent:date:message-id:from:references :cc:to:subject:ironport-sdr:ironport-sdr; bh=KFfKS2CqP1XHk/m3Awt0ypxH2Oo75hUeXQ8eiouFcrQ=; b=oFPKOQXG+QoNb8IA/AVg2/vrV4JOxxvgDnir2hlYWs9g1Of2nLkFqb20qWfZ6jSFm+ rCwBUbAZbs0tAKwJyhdf/52nnHvlsr7VFXNwKN3y+WbAlCmqFreR2BnSwwIAUYKIP+At izlctadM2yMSdU6EcZjAW7PNtCovQ2yqwdyQey4C1kJRP/Yt0o1GFViEO1DipsBYR4xt dMCNxUCN/cy5BHl/sQbYF2n4cmfTcYgonD7y/Wj0SKCngrHn4evOYRT7IvjCnmgHIGTv /xkvzv5UpfQML+uOTEtHyrhhWoLyrvOFqlXZ0VtEmIV7wv35nn4JZioAt3KNlv3LIkDF pqvg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id k18si3496499ejp.292.2021.03.11.23.11.23; Thu, 11 Mar 2021 23:11:45 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231921AbhCLHJI (ORCPT + 99 others); Fri, 12 Mar 2021 02:09:08 -0500 Received: from mga18.intel.com ([134.134.136.126]:48048 "EHLO mga18.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231928AbhCLHI7 (ORCPT ); Fri, 12 Mar 2021 02:08:59 -0500 IronPort-SDR: G1ba+bE5eZ7/z3tJUxDljovP3+8lgrQxUNqjekiZEdfMNL2/qJSXcrOXX6wqfqTrq2eqf5oM/L cY5/R+RrFn8g== X-IronPort-AV: E=McAfee;i="6000,8403,9920"; a="176385839" X-IronPort-AV: E=Sophos;i="5.81,242,1610438400"; d="scan'208";a="176385839" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Mar 2021 23:08:59 -0800 IronPort-SDR: kkXI+umYoTMCwy8UfK8j5GA5HLLX3JznDMO9VVopjx8ODszJpK4FN395GRqcKZsJ7Cc+Ht6lHt 066uR5yTwF3Q== X-IronPort-AV: E=Sophos;i="5.81,242,1610438400"; d="scan'208";a="410915047" Received: from lingshan-mobl5.ccr.corp.intel.com (HELO [10.254.214.210]) ([10.254.214.210]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Mar 2021 23:08:56 -0800 Subject: Re: [PATCH V3 6/6] vDPA/ifcvf: verify mandatory feature bits for vDPA To: Jason Wang , Zhu Lingshan , mst@redhat.com, lulu@redhat.com, leonro@nvidia.com Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, virtualization@lists.linux-foundation.org References: <20210310090052.4762-1-lingshan.zhu@intel.com> <20210310090052.4762-7-lingshan.zhu@intel.com> <3e53a5c9-c531-48ee-c9a7-907dfdacc9d1@redhat.com> <9c2fb3d0-2d69-20b9-589d-cc5ffc830f38@linux.intel.com> <4f3ef2bb-d823-d53d-3bb0-0152a3f6c9f1@redhat.com> <67be60b6-bf30-de85-ed42-d9fad974f42b@redhat.com> <2a6e31d3-ea31-9b64-0749-1f149b656623@intel.com> <2111b14b-4857-34c8-82c4-72d182ca50c5@redhat.com> From: "Zhu, Lingshan" Message-ID: <7405714f-c29a-6636-b01f-243af49a685c@intel.com> Date: Fri, 12 Mar 2021 15:08:54 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Thunderbird/78.7.1 MIME-Version: 1.0 In-Reply-To: <2111b14b-4857-34c8-82c4-72d182ca50c5@redhat.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 3/12/2021 3:00 PM, Jason Wang wrote: > > On 2021/3/12 2:40 下午, Zhu, Lingshan wrote: >> >> >> On 3/12/2021 1:52 PM, Jason Wang wrote: >>> >>> On 2021/3/11 3:19 下午, Zhu, Lingshan wrote: >>>> >>>> >>>> On 3/11/2021 2:20 PM, Jason Wang wrote: >>>>> >>>>> On 2021/3/11 12:16 下午, Zhu Lingshan wrote: >>>>>> >>>>>> >>>>>> On 3/11/2021 11:20 AM, Jason Wang wrote: >>>>>>> >>>>>>> On 2021/3/10 5:00 下午, Zhu Lingshan wrote: >>>>>>>> vDPA requres VIRTIO_F_ACCESS_PLATFORM as a must, this commit >>>>>>>> examines this when set features. >>>>>>>> >>>>>>>> Signed-off-by: Zhu Lingshan >>>>>>>> --- >>>>>>>>   drivers/vdpa/ifcvf/ifcvf_base.c | 8 ++++++++ >>>>>>>>   drivers/vdpa/ifcvf/ifcvf_base.h | 1 + >>>>>>>>   drivers/vdpa/ifcvf/ifcvf_main.c | 5 +++++ >>>>>>>>   3 files changed, 14 insertions(+) >>>>>>>> >>>>>>>> diff --git a/drivers/vdpa/ifcvf/ifcvf_base.c >>>>>>>> b/drivers/vdpa/ifcvf/ifcvf_base.c >>>>>>>> index ea6a78791c9b..58f47fdce385 100644 >>>>>>>> --- a/drivers/vdpa/ifcvf/ifcvf_base.c >>>>>>>> +++ b/drivers/vdpa/ifcvf/ifcvf_base.c >>>>>>>> @@ -224,6 +224,14 @@ u64 ifcvf_get_features(struct ifcvf_hw *hw) >>>>>>>>       return hw->hw_features; >>>>>>>>   } >>>>>>>>   +int ifcvf_verify_min_features(struct ifcvf_hw *hw) >>>>>>>> +{ >>>>>>>> +    if (!(hw->hw_features & BIT_ULL(VIRTIO_F_ACCESS_PLATFORM))) >>>>>>>> +        return -EINVAL; >>>>>>>> + >>>>>>>> +    return 0; >>>>>>>> +} >>>>>>>> + >>>>>>>>   void ifcvf_read_net_config(struct ifcvf_hw *hw, u64 offset, >>>>>>>>                  void *dst, int length) >>>>>>>>   { >>>>>>>> diff --git a/drivers/vdpa/ifcvf/ifcvf_base.h >>>>>>>> b/drivers/vdpa/ifcvf/ifcvf_base.h >>>>>>>> index dbb8c10aa3b1..91c5735d4dc9 100644 >>>>>>>> --- a/drivers/vdpa/ifcvf/ifcvf_base.h >>>>>>>> +++ b/drivers/vdpa/ifcvf/ifcvf_base.h >>>>>>>> @@ -123,6 +123,7 @@ void io_write64_twopart(u64 val, u32 *lo, >>>>>>>> u32 *hi); >>>>>>>>   void ifcvf_reset(struct ifcvf_hw *hw); >>>>>>>>   u64 ifcvf_get_features(struct ifcvf_hw *hw); >>>>>>>>   u64 ifcvf_get_hw_features(struct ifcvf_hw *hw); >>>>>>>> +int ifcvf_verify_min_features(struct ifcvf_hw *hw); >>>>>>>>   u16 ifcvf_get_vq_state(struct ifcvf_hw *hw, u16 qid); >>>>>>>>   int ifcvf_set_vq_state(struct ifcvf_hw *hw, u16 qid, u16 num); >>>>>>>>   struct ifcvf_adapter *vf_to_adapter(struct ifcvf_hw *hw); >>>>>>>> diff --git a/drivers/vdpa/ifcvf/ifcvf_main.c >>>>>>>> b/drivers/vdpa/ifcvf/ifcvf_main.c >>>>>>>> index 25fb9dfe23f0..f624f202447d 100644 >>>>>>>> --- a/drivers/vdpa/ifcvf/ifcvf_main.c >>>>>>>> +++ b/drivers/vdpa/ifcvf/ifcvf_main.c >>>>>>>> @@ -179,6 +179,11 @@ static u64 ifcvf_vdpa_get_features(struct >>>>>>>> vdpa_device *vdpa_dev) >>>>>>>>   static int ifcvf_vdpa_set_features(struct vdpa_device >>>>>>>> *vdpa_dev, u64 features) >>>>>>>>   { >>>>>>>>       struct ifcvf_hw *vf = vdpa_to_vf(vdpa_dev); >>>>>>>> +    int ret; >>>>>>>> + >>>>>>>> +    ret = ifcvf_verify_min_features(vf); >>>>>>> >>>>>>> >>>>>>> So this validate device features instead of driver which is the >>>>>>> one we really want to check? >>>>>>> >>>>>>> Thanks >>>>>> >>>>>> Hi Jason, >>>>>> >>>>>> Here we check device feature bits to make sure the device support >>>>>> ACCESS_PLATFORM. >>>>> >>>>> >>>>> If you want to check device features, you need to do that during >>>>> probe() and fail the probing if without the feature. But I think >>>>> you won't ship cards without ACCESS_PLATFORM. >>>> Yes, there are no reasons ship a card without ACCESS_PLATFORM >>>>> >>>>> >>>>>> In get_features(), >>>>>> it will return a intersection of device features bit and driver >>>>>> supported features bits(which includes ACCESS_PLATFORM). >>>>>> Other components like QEMU should not set features bits more than >>>>>> this intersection of bits. so we can make sure if this >>>>>> ifcvf_verify_min_features() passed, both device and driver >>>>>> support ACCESS_PLATFORM. >>>>>> >>>>>> Are you suggesting check driver feature bits in >>>>>> ifcvf_verify_min_features() in the meantime as well? >>>>> >>>>> >>>>> So it really depends on your hardware. If you hardware can always >>>>> offer ACCESS_PLATFORM, you just need to check driver features. >>>>> This is how vdpa_sim and mlx5_vdpa work. >>>> Yes, we always support ACCESS_PLATFORM, so it is hard coded in the >>>> macro IFCVF_SUPPORTED_FEATURES. >>> >>> >>> That's not what I read from the code: >>> >>>         features = ifcvf_get_features(vf) & IFCVF_SUPPORTED_FEATURES; >> ifcvf_get_features() reads device feature bits(which should always >> has ACCSSS_PLATFORM) and IFCVF_SUPPORTED_FEATURES is the driver >> supported feature bits > > > For "driver" you probably mean IFCVF. So there's some misunderstanding > before, what I meant for "driver" is virtio driver that do feature > negotaitation with the device. > > I wonder what features are supported by the device but not the IFCVF > driver? > > Thanks we did not use TSO hardware feature bits in IFCVF driver for now. Anyway, we will check the features bits to set in set_features than hw/ifcvf driver feature bits. THanks! > > >> which hard coded ACCESS_PLATFORM, so the intersection should include >> ACCESS_PLATFORM. >> the intersection "features" is returned in get_features(), qemu >> should set features according to it. >>> >>> >>>> Now we check whether device support this feature bit as a double >>>> conformation, are you suggesting we should check whether >>>> ACCESS_PLATFORM & IFCVF_SUPPORTED_FEATURES >>>> in set_features() as well? >>> >>> >>> If we know device will always offer ACCESS_PLATFORM, there's no need >>> to check it again. What we should check if whether driver set that, >>> and if it doesn't we need to fail set_features(). I think there's >>> little chance that IFCVF can work when IOMMU_PLATFORM is not >>> negotiated. >> Agree, will check the features bit to set instead of device feature >> bits. Thanks! >>> >>> >>> >>>> I prefer check both device and IFCVF_SUPPORTED_FEATURES both, more >>>> reliable. >>> >>> >>> So again, if you want to check device features, set_features() is >>> not the proper place. We need to fail the probe in this case. >>> >>> Thanks >>> >>> >>>> >>>> Thanks! >>>>> >>>>> Thanks >>>>> >>>>> >>>>>> >>>>>> Thanks! >>>>>>> >>>>>>> >>>>>>>> +    if (ret) >>>>>>>> +        return ret; >>>>>>>>         vf->req_features = features; >>>>>>> >>>>>>> _______________________________________________ >>>>>>> Virtualization mailing list >>>>>>> Virtualization@lists.linux-foundation.org >>>>>>> https://lists.linuxfoundation.org/mailman/listinfo/virtualization >>>>>> >>>>> >>>> >>> >> >