All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: linux-kernel@vger.kernel.org
Cc: Jason Wang <jasowang@redhat.com>,
	kvm@vger.kernel.org, virtualization@lists.linux-foundation.org,
	netdev@vger.kernel.org
Subject: [PATCH v8 10/19] vhost: force spec specified alignment on types
Date: Mon, 6 Apr 2020 21:16:48 -0400	[thread overview]
Message-ID: <20200407011612.478226-11-mst@redhat.com> (raw)
In-Reply-To: <20200407011612.478226-1-mst@redhat.com>

The ring element addresses are passed between components with different
alignments assumptions. Thus, if guest/userspace selects a pointer and
host then gets and dereferences it, we might need to decrease the
compiler-selected alignment to prevent compiler on the host from
assuming pointer is aligned.

This actually triggers on ARM with -mabi=apcs-gnu - which is a
deprecated configuration, but it seems safer to handle this
generally.

I verified that the produced binary is exactly identical on x86.

Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 drivers/vhost/vhost.h       |  6 +++---
 include/linux/virtio_ring.h | 24 +++++++++++++++++++++---
 2 files changed, 24 insertions(+), 6 deletions(-)

diff --git a/drivers/vhost/vhost.h b/drivers/vhost/vhost.h
index f8403bd46b85..60cab4c78229 100644
--- a/drivers/vhost/vhost.h
+++ b/drivers/vhost/vhost.h
@@ -67,9 +67,9 @@ struct vhost_virtqueue {
 	/* The actual ring of buffers. */
 	struct mutex mutex;
 	unsigned int num;
-	struct vring_desc __user *desc;
-	struct vring_avail __user *avail;
-	struct vring_used __user *used;
+	vring_desc_t __user *desc;
+	vring_avail_t __user *avail;
+	vring_used_t __user *used;
 	const struct vhost_iotlb_map *meta_iotlb[VHOST_NUM_ADDRS];
 	struct file *kick;
 	struct eventfd_ctx *call_ctx;
diff --git a/include/linux/virtio_ring.h b/include/linux/virtio_ring.h
index 11680e74761a..c3f9ca054250 100644
--- a/include/linux/virtio_ring.h
+++ b/include/linux/virtio_ring.h
@@ -60,14 +60,32 @@ static inline void virtio_store_mb(bool weak_barriers,
 struct virtio_device;
 struct virtqueue;
 
+/*
+ * The ring element addresses are passed between components with different
+ * alignments assumptions. Thus, we might need to decrease the compiler-selected
+ * alignment, and so must use a typedef to make sure the __aligned attribute
+ * actually takes hold:
+ *
+ * https://gcc.gnu.org/onlinedocs//gcc/Common-Type-Attributes.html#Common-Type-Attributes
+ *
+ * When used on a struct, or struct member, the aligned attribute can only
+ * increase the alignment; in order to decrease it, the packed attribute must
+ * be specified as well. When used as part of a typedef, the aligned attribute
+ * can both increase and decrease alignment, and specifying the packed
+ * attribute generates a warning.
+ */
+typedef struct vring_desc __aligned(VRING_DESC_ALIGN_SIZE) vring_desc_t;
+typedef struct vring_avail __aligned(VRING_AVAIL_ALIGN_SIZE) vring_avail_t;
+typedef struct vring_used __aligned(VRING_USED_ALIGN_SIZE) vring_used_t;
+
 struct vring {
 	unsigned int num;
 
-	struct vring_desc *desc;
+	vring_desc_t *desc;
 
-	struct vring_avail *avail;
+	vring_avail_t *avail;
 
-	struct vring_used *used;
+	vring_used_t *used;
 };
 
 /*
-- 
MST


  parent reply	other threads:[~2020-04-07  1:16 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-04-07  1:16 [PATCH v8 00/19] virtio: alignment issues Michael S. Tsirkin
2020-04-07  1:16 ` [PATCH v8 01/19] tools/virtio: define aligned attribute Michael S. Tsirkin
2020-04-07  1:16 ` [PATCH v8 02/19] tools/virtio: make asm/barrier.h self contained Michael S. Tsirkin
2020-04-07  1:16   ` Michael S. Tsirkin
2020-04-07  1:16 ` [PATCH v8 03/19] tools/virtio: define __KERNEL__ Michael S. Tsirkin
2020-04-07  1:16 ` [PATCH v8 04/19] virtio: add VIRTIO_RING_NO_LEGACY Michael S. Tsirkin
2020-04-07  1:16 ` [PATCH v8 05/19] virtgpu: pull in uaccess.h Michael S. Tsirkin
2020-04-07  1:16   ` Michael S. Tsirkin
2020-04-07  1:16   ` Michael S. Tsirkin
2020-04-07  1:16 ` [PATCH v8 06/19] virtio-rng: pull in slab.h Michael S. Tsirkin
2020-04-07  1:16 ` [PATCH v8 07/19] remoteproc: " Michael S. Tsirkin
2020-04-07  5:31   ` Bjorn Andersson
2020-04-07  5:31     ` Bjorn Andersson
2020-04-07  5:31       ` Bjorn Andersson
2020-04-07  1:16 ` [PATCH v8 08/19] virtio_input: " Michael S. Tsirkin
2020-04-07  1:16   ` Michael S. Tsirkin
2020-04-07  1:16 ` [PATCH v8 09/19] virtio: stop using legacy struct vring in kernel Michael S. Tsirkin
2020-04-07  1:16   ` Michael S. Tsirkin
2020-04-07  8:51   ` Stefan Hajnoczi
2020-04-07  1:16 ` Michael S. Tsirkin [this message]
2020-04-07  1:16 ` [PATCH v8 11/19] virtio: add legacy init/size APIs Michael S. Tsirkin
2020-04-07  1:16   ` Michael S. Tsirkin
2020-04-07  1:16 ` [PATCH v8 12/19] virtio_ring: switch to virtio_legacy_init/size Michael S. Tsirkin
2020-04-07  1:16   ` Michael S. Tsirkin
2020-04-07  1:16 ` [PATCH v8 13/19] tools/virtio: " Michael S. Tsirkin
2020-04-07  1:16 ` [PATCH v8 14/19] vop: " Michael S. Tsirkin
2020-04-07  1:16 ` [PATCH v8 15/19] remoteproc: " Michael S. Tsirkin
2020-04-07  5:30   ` Bjorn Andersson
2020-04-07  5:30     ` Bjorn Andersson
2020-04-07  5:30       ` Bjorn Andersson
2020-04-07  1:17 ` [PATCH v8 16/19] mellanox: " Michael S. Tsirkin
2020-04-07  1:17 ` [PATCH v8 17/19] vhost: option to fetch descriptors through an independent struct Michael S. Tsirkin
2020-04-07  1:17   ` Michael S. Tsirkin
2020-04-07  1:17 ` [PATCH v8 18/19] vhost: use batched version by default Michael S. Tsirkin
2020-04-07  1:17 ` [PATCH v8 19/19] vhost: batching fetches Michael S. Tsirkin
2020-04-07  3:44 ` [PATCH v8 00/19] virtio: alignment issues Jason Wang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200407011612.478226-11-mst@redhat.com \
    --to=mst@redhat.com \
    --cc=jasowang@redhat.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=virtualization@lists.linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.