From patchwork Tue Jan 31 23:22:06 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Si-Wei Liu X-Patchwork-Id: 51090 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:eb09:0:0:0:0:0 with SMTP id s9csp91093wrn; Tue, 31 Jan 2023 15:25:53 -0800 (PST) X-Google-Smtp-Source: AK7set94JqFjpXhkiK0yjFtYZ93uWvmM5GJS5LouDFUOziuUfwD5R60ddLunwaCqeka//MP7cpEC X-Received: by 2002:a17:902:c7d1:b0:196:58de:9f29 with SMTP id r17-20020a170902c7d100b0019658de9f29mr496455pla.47.1675207553278; Tue, 31 Jan 2023 15:25:53 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1675207553; cv=none; d=google.com; s=arc-20160816; b=SuCBytcKbVXLOLY4+GTsOzKL7y1XlVXqm49AX3nGnoHJKYD9na27fkI1VAsTlF6F5B veFzt/oWN9PxgppoApKZBNtRTzvkft/EuSam1iQYZIgsHSzXVT9Qu7jhd1YALi7L7Kmr DF1DADz3a3NzI/woqFuSTaSiJoE/vQ3H5engCKW4apcLPxhb8iqG7OkTyTQ+HiNg+6UB NnTQdRYxiKac5XBcQirGp0A5Oj8Rv4/7kcvFkbqrSd9JFS4oRKPBlQbZGSdGGjYsyZ+n rc3rDPcB8jhEggaGtVfbvC1P5AMivAfqhWinaSOFiPL83PTYHSp2DZHWkz968NhVouuj Q6XQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from:dkim-signature; bh=QOmgHByRE9rxe9H6Awf2sGRk9/4W2KF7M1XIRh/aqzs=; b=cIuVg70/3trGDDSb0n8WzivnS714mZqbxYI0onLHRbY8/yEtG1GgfUVHLG+WKx3quT hfrgSeUvlzbkrY5ElekizMwI2lkGhXV/lKFdhyqSmEsabO54+cL3U8ypIsML65QojSeC kIfKhfPhCB2m0l23C1f8JlzaaSwaXhsAqOFC6U+ogF6n+e5hzcYhYMrt0uXLv0d8Enxx AVPMmcpKNfazmzo7rK8fEh/HMXMo0O22QQNVEIh5skW+fW3Wxj71OeYmza6ulZCdoEEB vbKjiL6Kajn9aCCPlRGDbf4/yKQYabp7AClAUgJivMI6ai6QZ/c+8CZwl2aPiVo/4+21 8fJg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@oracle.com header.s=corp-2022-7-12 header.b="OtJh/ict"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=oracle.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id g3-20020a170902e38300b0019609a4f16dsi15741501ple.461.2023.01.31.15.25.40; Tue, 31 Jan 2023 15:25:53 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@oracle.com header.s=corp-2022-7-12 header.b="OtJh/ict"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=oracle.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232209AbjAaXWl (ORCPT + 99 others); Tue, 31 Jan 2023 18:22:41 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53914 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232149AbjAaXWb (ORCPT ); Tue, 31 Jan 2023 18:22:31 -0500 Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8649343921 for ; Tue, 31 Jan 2023 15:22:30 -0800 (PST) Received: from pps.filterd (m0333521.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 30VIi9FT006492; Tue, 31 Jan 2023 23:22:27 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2022-7-12; bh=QOmgHByRE9rxe9H6Awf2sGRk9/4W2KF7M1XIRh/aqzs=; b=OtJh/ict3SBbLHy5rJ/+Td6UziToPlpUgEQM0QB2f6VRT7T2JbNczakdGQixcYg1dxmC jREFnUpBPsvbIxD4rLWkPbZ9+PiDmm9Zj4qSNKv8m0/UNEXmi8LjOx7J7amZZnHUPxeF 83SD3r39/hXSQgJiZ/hx3SI0iU1y6T5eCH1ZudQe+J9M4OBST5UuBD00ZkFKuy04dJUI QXWUwEY/7wxUsbwU2FBxF6B+1jzQF8Uxon4LzT/AfANfxIAjMstZjboqVzqLoVCM2fAa 0/yGinf5+OuvqrFAwTPNBKfMK3rkxN2+oS8VmdU16zAkpC7Zq6x8GAyIV5XFEs6j+iGD nQ== Received: from iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta03.appoci.oracle.com [130.35.103.27]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3ncvp171fd-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 31 Jan 2023 23:22:27 +0000 Received: from pps.filterd (iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (8.17.1.5/8.17.1.5) with ESMTP id 30VMuk9P031540; Tue, 31 Jan 2023 23:22:25 GMT Received: from ban25x6uut24.us.oracle.com (ban25x6uut24.us.oracle.com [10.153.73.24]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTP id 3nct5d8c94-6; Tue, 31 Jan 2023 23:22:25 +0000 From: Si-Wei Liu To: mst@redhat.com, jasowang@redhat.com, parav@nvidia.com, elic@nvidia.com Cc: virtualization@lists.linux-foundation.org, linux-kernel@vger.kernel.org Subject: [PATCH 5/6] vdpa: validate device feature provisioning against supported class Date: Tue, 31 Jan 2023 15:22:06 -0800 Message-Id: <1675207327-22289-6-git-send-email-si-wei.liu@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1675207327-22289-1-git-send-email-si-wei.liu@oracle.com> References: <1675207327-22289-1-git-send-email-si-wei.liu@oracle.com> X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.219,Aquarius:18.0.930,Hydra:6.0.562,FMLib:17.11.122.1 definitions=2023-01-31_08,2023-01-31_01,2022-06-22_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 malwarescore=0 suspectscore=0 adultscore=0 mlxscore=0 phishscore=0 mlxlogscore=999 spamscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2212070000 definitions=main-2301310201 X-Proofpoint-GUID: agwxh2A_7qT2XRrvzD3R-OlPYLFdh22H X-Proofpoint-ORIG-GUID: agwxh2A_7qT2XRrvzD3R-OlPYLFdh22H X-Spam-Status: No, score=-2.8 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1756582435257383748?= X-GMAIL-MSGID: =?utf-8?q?1756582435257383748?= Today when device features are explicitly provisioned, the features user supplied may contain device class specific features that are not supported by the parent managment device. On the other hand, when parent managment device supports more than one class, the device features to provision may be ambiguous if none of the class specific attributes is provided at the same time. Validate these cases and prompt appropriate user errors accordingly. Signed-off-by: Si-Wei Liu --- drivers/vdpa/vdpa.c | 51 ++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 42 insertions(+), 9 deletions(-) diff --git a/drivers/vdpa/vdpa.c b/drivers/vdpa/vdpa.c index 6d02b8c..d5d6729 100644 --- a/drivers/vdpa/vdpa.c +++ b/drivers/vdpa/vdpa.c @@ -460,12 +460,30 @@ static int vdpa_nl_mgmtdev_handle_fill(struct sk_buff *msg, const struct vdpa_mg return 0; } +static u64 vdpa_mgmtdev_get_classes(const struct vdpa_mgmt_dev *mdev, + unsigned int *nclasses) +{ + u64 supported_classes = 0; + unsigned int n = 0; + int i = 0; + + while (mdev->id_table[i].device) { + if (mdev->id_table[i].device <= 63) { + supported_classes |= BIT_ULL(mdev->id_table[i].device); + n++; + } + i++; + } + if (nclasses) + *nclasses = n; + + return supported_classes; +} + static int vdpa_mgmtdev_fill(const struct vdpa_mgmt_dev *mdev, struct sk_buff *msg, u32 portid, u32 seq, int flags) { - u64 supported_classes = 0; void *hdr; - int i = 0; int err; hdr = genlmsg_put(msg, portid, seq, &vdpa_nl_family, flags, VDPA_CMD_MGMTDEV_NEW); @@ -475,14 +493,9 @@ static int vdpa_mgmtdev_fill(const struct vdpa_mgmt_dev *mdev, struct sk_buff *m if (err) goto msg_err; - while (mdev->id_table[i].device) { - if (mdev->id_table[i].device <= 63) - supported_classes |= BIT_ULL(mdev->id_table[i].device); - i++; - } - if (nla_put_u64_64bit(msg, VDPA_ATTR_MGMTDEV_SUPPORTED_CLASSES, - supported_classes, VDPA_ATTR_UNSPEC)) { + vdpa_mgmtdev_get_classes(mdev, NULL), + VDPA_ATTR_UNSPEC)) { err = -EMSGSIZE; goto msg_err; } @@ -571,8 +584,10 @@ static int vdpa_nl_cmd_dev_add_set_doit(struct sk_buff *skb, struct genl_info *i struct vdpa_dev_set_config config = {}; struct nlattr **nl_attrs = info->attrs; struct vdpa_mgmt_dev *mdev; + unsigned int ncls = 0; const u8 *macaddr; const char *name; + u64 classes; int err = 0; if (!info->attrs[VDPA_ATTR_DEV_NAME]) @@ -654,6 +669,24 @@ static int vdpa_nl_cmd_dev_add_set_doit(struct sk_buff *skb, struct genl_info *i goto err; } + classes = vdpa_mgmtdev_get_classes(mdev, &ncls); + if (config.mask & VDPA_DEV_NET_ATTRS_MASK && + !(classes & BIT_ULL(VIRTIO_ID_NET))) { + NL_SET_ERR_MSG_MOD(info->extack, + "Network class attributes provided on unsupported management device"); + err = -EINVAL; + goto err; + } + if (!(config.mask & VDPA_DEV_NET_ATTRS_MASK) && + config.mask & BIT_ULL(VDPA_ATTR_DEV_FEATURES) && + classes & BIT_ULL(VIRTIO_ID_NET) && ncls > 1 && + config.device_features & VIRTIO_DEVICE_F_MASK) { + NL_SET_ERR_MSG_MOD(info->extack, + "Management device supports multi-class while device features specified are ambiguous"); + err = -EINVAL; + goto err; + } + err = mdev->ops->dev_add(mdev, name, &config); err: up_write(&vdpa_dev_lock);