History

iommu/uapi: Add argsz for user filled data

As IOMMU UAPI gets extended, user data size may increase. To support backward compatibiliy, this patch introduces a size field to each UAPI data structures. It is *always* the responsibility for the user to fill in the correct size. Padding fields are adjusted to ensure 8 byte alignment. Specific scenarios for user data handling are documented in: Documentation/userspace-api/iommu.rst As there is no current users of the API, struct version is not incremented.

Jacob Pan committed 6 years ago

Commit 1e6aaae1 parent d0023e31 file · +9 −3Browse files

Showing the changes to include/uapi/linux (1 of 1 file). Show all

Unified · Split

include/uapi/linux/iommu.h+9−3
@@ -139,6 +139,7 @@ enum iommu_page_response_code { · 138 unmodified lines
139139
140140 /**
141141 * struct iommu_page_response - Generic page response information
142+ * @argsz: User filled size of this data
142143 * @version: API version of this structure
143144 * @flags: encodes whether the corresponding fields are valid
144145 * (IOMMU_FAULT_PAGE_RESPONSE_* values)
@@ -147,6 +148,7 @@ enum iommu_page_response_code { · 2 unmodified lines
147148 * @code: response code from &enum iommu_page_response_code
148149 */
149150 struct iommu_page_response {
151+ __u32 argsz;
150152 #define IOMMU_PAGE_RESP_VERSION_1 1
151153 __u32 version;
152154 #define IOMMU_PAGE_RESP_PASID_VALID (1 << 0)
@@ -222,6 +224,7 @@ struct iommu_inv_pasid_info { · 69 unmodified lines
222224 /**
223225 * struct iommu_cache_invalidate_info - First level/stage invalidation
224226 * information
227+ * @argsz: User filled size of this data
225228 * @version: API version of this structure
226229 * @cache: bitfield that allows to select which caches to invalidate
227230 * @granularity: defines the lowest granularity used for the invalidation:
@@ -250,6 +253,7 @@ struct iommu_inv_pasid_info { · 22 unmodified lines
250253 * must support the used granularity.
251254 */
252255 struct iommu_cache_invalidate_info {
256+ __u32 argsz;
253257 #define IOMMU_CACHE_INVALIDATE_INFO_VERSION_1 1
254258 __u32 version;
255259 /* IOMMU paging structure cache */
@@ -259,7 +263,7 @@ struct iommu_cache_invalidate_info { · 3 unmodified lines
259263 #define IOMMU_CACHE_INV_TYPE_NR (3)
260264 __u8 cache;
261265 __u8 granularity;
262− __u8 padding[2];
266+ __u8 padding[6];
263267 union {
264268 struct iommu_inv_pasid_info pasid_info;
265269 struct iommu_inv_addr_info addr_info;
@@ -296,6 +300,7 @@ struct iommu_gpasid_bind_data_vtd { · 30 unmodified lines
296300
297301 /**
298302 * struct iommu_gpasid_bind_data - Information about device and guest PASID binding
303+ * @argsz: User filled size of this data
299304 * @version: Version of this data structure
300305 * @format: PASID table entry format
301306 * @flags: Additional information on guest bind request
@@ -313,17 +318,18 @@ struct iommu_gpasid_bind_data_vtd { · 11 unmodified lines
313318 * PASID to host PASID based on this bind data.
314319 */
315320 struct iommu_gpasid_bind_data {
321+ __u32 argsz;
316322 #define IOMMU_GPASID_BIND_VERSION_1 1
317323 __u32 version;
318324 #define IOMMU_PASID_FORMAT_INTEL_VTD 1
319325 __u32 format;
326+ __u32 addr_width;
320327 #define IOMMU_SVA_GPASID_VAL (1 << 0) /* guest PASID valid */
321328 __u64 flags;
322329 __u64 gpgd;
323330 __u64 hpasid;
324331 __u64 gpasid;
325− __u32 addr_width;
326− __u8 padding[12];
332+ __u8 padding[8];
327333 /* Vendor specific data */
328334 union {
329335 struct iommu_gpasid_bind_data_vtd vtd;