Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp3426573yba; Tue, 23 Apr 2019 03:42:20 -0700 (PDT) X-Google-Smtp-Source: APXvYqyij1MljtrZ7aaBYT5/6b/bQOEcv0dAdqrexPGk7GfUzGtQaeoulabvqxWfk4WEdoD9DjWx X-Received: by 2002:a63:fc43:: with SMTP id r3mr23628557pgk.44.1556016140593; Tue, 23 Apr 2019 03:42:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1556016140; cv=none; d=google.com; s=arc-20160816; b=wK5xMTV0YlB1jts26KpA152Hw0LBWAgbi+p5/dKO6QpH74kRBFjYieTWb+VIAEDeoz Daz/fMMiOUSRMMLjHFmwzAx/vQtDZRPFhYqff7r0FGQzv9VyRTiKqvdP1rNreSriyJh5 H4DQgYfPFQ0PsEwVpdmsmVujTERbnvP8xwpouv1RPFHXAFlCH/IPewbDgVLvY8AWajDu nF2JK23+Pe85piCiMdOpCNQTYiQuk5YflilzqUV7OHw9UvdOYUzJx17bLINcvK2gAOa3 pxgKuSoArLzlzk1Q4sOqLvxBWa36o2d+4kZuo5XIJYGZPxtdho6SvxenHDgCXpHcaY4n XBiQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:reply-to:message-id :subject:cc:to:from:date; bh=tPtLNqlXGcpSN1+D0rFPwkir61eGl9oeuhxFv/jjTaQ=; b=LiK9F1HpAjzJMGuPH1L8VzDHwozXZURJEK/tzD9m8EhfJi0tYERz2IdFjPJQ+qIE0h lH1b7ZZK/jC1x2ELSjqFth6cnqXO+5KKUHcRtJXJ8pVjgMrZcCNcTb3TrzWvzmx3O7YP j+CU5RJiwQQAEos+DZAtw+AzVWpF2kQCnnqSwTpn7G2jNm0qizeqTscsCNc8BuCbs7ea vHaLe/qwZKX6zEcdUi6o7UJYzLozP3zoprnniAqGWg0mXiJsI0fCxAoC10VhDveTIZjz nmcBgMV6mQEOK0zHO7N2QnJmk4Au4nhFq4T/+gfS1D1XxvPwk5rhLa4XvCTtOpHSCKN3 xnnw== 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id x2si5174583pgf.272.2019.04.23.03.42.05; Tue, 23 Apr 2019 03:42:20 -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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727437AbfDWKj4 (ORCPT + 99 others); Tue, 23 Apr 2019 06:39:56 -0400 Received: from mx1.redhat.com ([209.132.183.28]:17096 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725990AbfDWKj4 (ORCPT ); Tue, 23 Apr 2019 06:39:56 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9C1A630ADBBD; Tue, 23 Apr 2019 10:39:55 +0000 (UTC) Received: from redhat.com (ovpn-112-50.ams2.redhat.com [10.36.112.50]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 8A713226FF; Tue, 23 Apr 2019 10:39:42 +0000 (UTC) Date: Tue, 23 Apr 2019 11:39:39 +0100 From: Daniel =?utf-8?B?UC4gQmVycmFuZ8Op?= To: Yan Zhao Cc: intel-gvt-dev@lists.freedesktop.org, cjia@nvidia.com, kvm@vger.kernel.org, aik@ozlabs.ru, Zhengxiao.zx@alibaba-inc.com, shuangtai.tst@alibaba-inc.com, qemu-devel@nongnu.org, kwankhede@nvidia.com, eauger@redhat.com, yi.l.liu@intel.com, eskultet@redhat.com, ziye.yang@intel.com, mlevitsk@redhat.com, pasic@linux.ibm.com, libvir-list@redhat.com, arei.gonglei@huawei.com, felipe@nutanix.com, Ken.Xue@amd.com, kevin.tian@intel.com, dgilbert@redhat.com, zhenyuw@linux.intel.com, alex.williamson@redhat.com, changpeng.liu@intel.com, cohuck@redhat.com, linux-kernel@vger.kernel.org, zhi.a.wang@intel.com, jonathan.davies@nutanix.com, shaopeng.he@intel.com Subject: Re: [Qemu-devel] [PATCH 1/2] vfio/mdev: add version field as mandatory attribute for mdev device Message-ID: <20190423103939.GF6022@redhat.com> Reply-To: Daniel =?utf-8?B?UC4gQmVycmFuZ8Op?= References: <20190419083258.19580-1-yan.y.zhao@intel.com> <20190419083505.19654-1-yan.y.zhao@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20190419083505.19654-1-yan.y.zhao@intel.com> User-Agent: Mutt/1.11.3 (2019-02-01) X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.47]); Tue, 23 Apr 2019 10:39:56 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Apr 19, 2019 at 04:35:04AM -0400, Yan Zhao wrote: > device version attribute in mdev sysfs is used by user space software > (e.g. libvirt) to query device compatibility for live migration of VFIO > mdev devices. This attribute is mandatory if a mdev device supports live > migration. > > It consists of two parts: common part and vendor proprietary part. > common part: 32 bit. lower 16 bits is vendor id and higher 16 bits > identifies device type. e.g., for pci device, it is > "pci vendor id" | (VFIO_DEVICE_FLAGS_PCI << 16). > vendor proprietary part: this part is varied in length. vendor driver can > specify any string to identify a device. > > When reading this attribute, it should show device version string of the > device of type . If a device does not support live migration, it > should return errno. > When writing a string to this attribute, it returns errno for > incompatibility or returns written string length in compatibility case. > If a device does not support live migration, it always returns errno. > > For user space software to use: > 1. > Before starting live migration, user space software first reads source side > mdev device's version. e.g. > "#cat \ > /sys/bus/pci/devices/0000\:00\:02.0/5ac1fb20-2bbf-4842-bb7e-36c58c3be9cd/mdev_type/version" > 00028086-193b-i915-GVTg_V5_4 > > 2. > Then, user space software writes the source side returned version string > to device version attribute in target side, and checks the return value. > If a negative errno is returned in the target side, then mdev devices in > source and target sides are not compatible; > If a positive number is returned and it equals to the length of written > string, then the two mdev devices in source and target side are compatible. > e.g. > (a) compatibility case > "# echo 00028086-193b-i915-GVTg_V5_4 > > /sys/bus/pci/devices/0000\:00\:02.0/882cc4da-dede-11e7-9180-078a62063ab1/mdev_type/version" > > (b) incompatibility case > "#echo 00028086-193b-i915-GVTg_V5_1 > > /sys/bus/pci/devices/0000\:00\:02.0/882cc4da-dede-11e7-9180-078a62063ab1/mdev_type/version" > -bash: echo: write error: Invalid argument What you have written here seems to imply that each mdev type is able to support many different versions at the same time. Writing a version into this sysfs file then chooses which of the many versions to actually use. This is good as it allows for live migration across driver software upgrades. A mgmt application may well want to know what versions are supported for an mdev type *before* starting a migration. A mgmt app can query all the 100's of hosts it knows and thus figure out which are valid to use as the target of a migration. IOW, we want to avoid the ever hitting the incompatibility case in the first place, by only choosing to migrate to a host that we know is going to be compatible. This would need some kind of way to report the full list of supported versions against the mdev supported types on the host. > 3. if two mdev devices are compatible, user space software can start > live migration, and vice versa. > > Note: if a mdev device does not support live migration, it either does > not provide a version attribute, or always returns errno when its version > attribute is read/written. > > Cc: Alex Williamson > Cc: Erik Skultety > Cc: "Dr. David Alan Gilbert" > Cc: Cornelia Huck > Cc: "Tian, Kevin" > Cc: Zhenyu Wang > Cc: "Wang, Zhi A" > Cc: Neo Jia > Cc: Kirti Wankhede > > Signed-off-by: Yan Zhao > --- > Documentation/vfio-mediated-device.txt | 36 ++++++++++++++++++++++++++ > samples/vfio-mdev/mbochs.c | 17 ++++++++++++ > samples/vfio-mdev/mdpy.c | 16 ++++++++++++ > samples/vfio-mdev/mtty.c | 16 ++++++++++++ > 4 files changed, 85 insertions(+) > > diff --git a/Documentation/vfio-mediated-device.txt b/Documentation/vfio-mediated-device.txt > index c3f69bcaf96e..bc28471c0667 100644 > --- a/Documentation/vfio-mediated-device.txt > +++ b/Documentation/vfio-mediated-device.txt > @@ -202,6 +202,7 @@ Directories and files under the sysfs for Each Physical Device > | | |--- available_instances > | | |--- device_api > | | |--- description > + | | |--- version > | | |--- [devices] > | |--- [] > | | |--- create > @@ -209,6 +210,7 @@ Directories and files under the sysfs for Each Physical Device > | | |--- available_instances > | | |--- device_api > | | |--- description > + | | |--- version > | | |--- [devices] > | |--- [] > | |--- create > @@ -216,6 +218,7 @@ Directories and files under the sysfs for Each Physical Device > | |--- available_instances > | |--- device_api > | |--- description > + | |--- version > | |--- [devices] > > * [mdev_supported_types] > @@ -225,6 +228,8 @@ Directories and files under the sysfs for Each Physical Device > [], device_api, and available_instances are mandatory attributes > that should be provided by vendor driver. > > + version is a mandatory attribute if a mdev device supports live migration. > + > * [] > > The [] name is created by adding the device driver string as a prefix > @@ -246,6 +251,35 @@ Directories and files under the sysfs for Each Physical Device > This attribute should show the number of devices of type that can be > created. > > +* version > + > + This attribute is rw. It is used to check whether two devices are compatible > + for live migration. If this attribute is missing, then the corresponding mdev > + device is regarded as not supporting live migration. > + > + It consists of two parts: common part and vendor proprietary part. > + common part: 32 bit. lower 16 bits is vendor id and higher 16 bits identifies > + device type. e.g., for pci device, it is > + "pci vendor id" | (VFIO_DEVICE_FLAGS_PCI << 16). > + vendor proprietary part: this part is varied in length. vendor driver can > + specify any string to identify a device. > + > + When reading this attribute, it should show device version string of the device > + of type . If a device does not support live migration, it should > + return errno. > + When writing a string to this attribute, it returns errno for incompatibility > + or returns written string length in compatibility case. If a device does not > + support live migration, it always returns errno. > + > + for example. > + # cat \ > + /sys/bus/pci/devices/0000\:00\:02.0/mdev_supported_types/i915-GVTg_V5_2/version > + 00028086-193b-i915-GVTg_V5_2 > + > + #echo 00028086-193b-i915-GVTg_V5_2 > \ > + /sys/bus/pci/devices/0000\:00\:02.0/mdev_supported_types/i915-GVTg_V5_4/version > + -bash: echo: write error: Invalid argument > + IIUC this path is against the physical device. IOW, the mgmt app would have to first write to the "version" file to choose a version, and then write to the "create" file to actually create an virtual device. This has the obvious concurrency problem if multiple devices are being created at the same time and distinct versions for each device are required. There would need to be a locking scheme defined to ensure safety. Wouldn't it be better if we can pass the desired version when we write to the "create" file, so that we avoid any concurrent usage problems. "version" could be just a read-only file with a *list* of supported versions. eg $ cat /sys/bus/pci/devices/0000\:00\:02.0/mdev_supported_types/i915-GVTg_V5_4/version 5.0 5.1 5.2 $ echo "83b8f4f2-509f-382f-3c1e-e6bfe0fa1001;version=5.2" > /sys/devices/virtual/mtty/mtty/mdev_supported_types/mtty-2/create Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|