Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp1174882ybl; Fri, 31 Jan 2020 15:50:22 -0800 (PST) X-Google-Smtp-Source: APXvYqyAuq0pZC19EpXkZ43de6GcIjX5TiulHs63wGk5A5PNVGlosgqakTTbAIItDIpUNILRqkZR X-Received: by 2002:aca:60d7:: with SMTP id u206mr7730151oib.0.1580514622535; Fri, 31 Jan 2020 15:50:22 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1580514622; cv=none; d=google.com; s=arc-20160816; b=eA1D6PLtMFB8DthUSz30crEqinzjCS8syiTHkNtc6QW8HmgA8xhZY6YEvRIgZhIHGn L3gssAqEU1+BjLoi7c71C0Gbdd9TdAfTUg8YahXpnKX7Zp3RmCoGZvlNA0s7hB/mNhTj QYtDNKrtSltuMkRGrtcigX0uZMWS3yG0Ba7Jt3OZaZRJD3oUeV6eTBHTVYWFvqOkPnKb zoxlm6s4D3ldhJc9XBP12PoMTQLF8luuOWlfguKiWdiR1fCOe5hkOhaThB5C2sTPmiJd 6w1d+7IqTTd5YrKdbxAA4setPtfis3492MLkwAjB0HxmkRux2cuNS6/UBCs8KpDe14pV OlCg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :organization:references:in-reply-to:message-id:subject:cc:to:from :date; bh=VilZ7pQ5NnXRrt9nJCK0DFhMSFpIpH1IvfM4j7k+p5M=; b=R2me8OfVIG50FGYtoMCtgx4rfrc+IkiX6JBz6KTezlw9ES7XEpi0OGMRu19wPp80ut z9m2P1OA3ZpYFR1mmw9kQuLAshlRfavUz5CNwKdAAkKUiULwln8BatNokVeEVwwwXa5o XT+DrCZDehb4ucH76AU/VL8RIggPuWCF24XX/FsK4f0TV7AmDpTARhJuedHekxG/mM9m MRLIUP/8nN20IBKQEfvFQftCxkDKn3t9b5AXeBVNfNz8fwOc5PHvD7cslr6T6Xiqz+Ny SGd3J60OoOR102Zx1KKliRmMbT3DULaRM1KGXxDUMrvIAKexXDNwQoj6fc+VEzu0A6Tj QHTQ== 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=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id a11si5722597otq.223.2020.01.31.15.49.58; Fri, 31 Jan 2020 15:50:22 -0800 (PST) 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=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726347AbgAaXqL (ORCPT + 99 others); Fri, 31 Jan 2020 18:46:11 -0500 Received: from mga11.intel.com ([192.55.52.93]:53476 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726262AbgAaXqL (ORCPT ); Fri, 31 Jan 2020 18:46:11 -0500 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 31 Jan 2020 15:46:10 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.70,387,1574150400"; d="scan'208";a="247892207" Received: from jacob-builder.jf.intel.com (HELO jacob-builder) ([10.7.199.155]) by orsmga002.jf.intel.com with ESMTP; 31 Jan 2020 15:46:10 -0800 Date: Fri, 31 Jan 2020 15:51:25 -0800 From: Jacob Pan To: Alex Williamson Cc: iommu@lists.linux-foundation.org, LKML , "Lu Baolu" , Joerg Roedel , David Woodhouse , "Yi Liu" , "Tian, Kevin" , Raj Ashok , "Christoph Hellwig" , Jean-Philippe Brucker , Jonathan Cameron , Eric Auger , jacob.jun.pan@linux.intel.com Subject: Re: [PATCH 3/3] iommu/uapi: Add helper function for size lookup Message-ID: <20200131155125.53475a72@jacob-builder> In-Reply-To: <20200129151951.2e354e37@w520.home> References: <1580277724-66994-1-git-send-email-jacob.jun.pan@linux.intel.com> <1580277724-66994-4-git-send-email-jacob.jun.pan@linux.intel.com> <20200129144046.3f91e4c1@w520.home> <20200129151951.2e354e37@w520.home> Organization: OTC X-Mailer: Claws Mail 3.13.2 (GTK+ 2.24.30; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Alex, Sorry I missed this part in the previous reply. Comments below. On Wed, 29 Jan 2020 15:19:51 -0700 Alex Williamson wrote: > Also, is the 12-bytes of padding in struct iommu_gpasid_bind_data > excessive with this new versioning scheme? Per rule #2 I'm not sure > if we're allowed to repurpose those padding bytes, We can still use the padding bytes as long as there is a new flag bit to indicate the validity of the new filed within the padding. I should have made it clear in rule #2 when mentioning the flags bits. Should define what extension constitutes. How about this? " * 2. Data structures are open to extension but closed to modification. * Extension should leverage the padding bytes first where a new * flag bit is required to indicate the validity of each new member. * The above rule for padding bytes also applies to adding new union * members. * After padding bytes are exhausted, new fields must be added at the * end of each data structure with 64bit alignment. Flag bits can be * added without size change but existing ones cannot be altered. * " So if we add new field by doing re-purpose of padding bytes, size lookup result will remain the same. New code would recognize the new flag, old code stays the same. VFIO layer checks for UAPI compatibility and size to copy, version sanity check and flag usage are done in the IOMMU code. > but if we add > fields to the end of the structure as the scheme suggests, we're > stuck with not being able to expand the union for new fields. Good point, it does sound contradictory. I hope the rewritten rule #2 address that. Adding data after the union should be extremely rare. Do you see any issues with the example below? offsetofend() can still find the right size. e.g. V1 struct iommu_gpasid_bind_data { __u32 version; #define IOMMU_PASID_FORMAT_INTEL_VTD 1 __u32 format; #define IOMMU_SVA_GPASID_VAL (1 << 0) /* guest PASID valid */ __u64 flags; __u64 gpgd; __u64 hpasid; __u64 gpasid; __u32 addr_width; __u8 padding[12]; /* Vendor specific data */ union { struct iommu_gpasid_bind_data_vtd vtd; }; }; const static int iommu_uapi_data_size[NR_IOMMU_UAPI_TYPE][IOMMU_UAPI_VERSION] = { /* IOMMU_UAPI_BIND_GPASID */ {offsetofend(struct iommu_gpasid_bind_data, vtd)}, ... }; V2, Add new_member at the end (forget padding for now). struct iommu_gpasid_bind_data { __u32 version; #define IOMMU_PASID_FORMAT_INTEL_VTD 1 __u32 format; #define IOMMU_SVA_GPASID_VAL (1 << 0) /* guest PASID valid */ #define IOMMU_NEW_MEMBER_VAL (1 << 1) /* new member added */ __u64 flags; __u64 gpgd; __u64 hpasid; __u64 gpasid; __u32 addr_width; __u8 padding[12]; /* Vendor specific data */ union { struct iommu_gpasid_bind_data_vtd vtd; }; __u64 new_member; }; const static int iommu_uapi_data_size[NR_IOMMU_UAPI_TYPE][IOMMU_UAPI_VERSION] = { /* IOMMU_UAPI_BIND_GPASID */ {offsetofend(struct iommu_gpasid_bind_data, vtd), offsetofend(struct iommu_gpasid_bind_data,new_member)}, }; V3, Add smmu to the union,larger than vtd struct iommu_gpasid_bind_data { __u32 version; #define IOMMU_PASID_FORMAT_INTEL_VTD 1 #define IOMMU_PASID_FORMAT_INTEL_SMMU 2 __u32 format; #define IOMMU_SVA_GPASID_VAL (1 << 0) /* guest PASID valid */ #define IOMMU_NEW_MEMBER_VAL (1 << 1) /* new member added */ #define IOMMU_SVA_SMMU_SUPP (1 << 2) /* SMMU data supported */ __u64 flags; __u64 gpgd; __u64 hpasid; __u64 gpasid; __u32 addr_width; __u8 padding[12]; /* Vendor specific data */ union { struct iommu_gpasid_bind_data_vtd vtd; struct iommu_gpasid_bind_data_smmu smmu; }; __u64 new_member; }; const static int iommu_uapi_data_size[NR_IOMMU_UAPI_TYPE][IOMMU_UAPI_VERSION] = { /* IOMMU_UAPI_BIND_GPASID */ {offsetofend(struct iommu_gpasid_bind_data,vtd), offsetofend(struct iommu_gpasid_bind_data, new_member), offsetofend(struct iommu_gpasid_bind_data, new_member)}, ... };