Commit 1e31aa92 authored by Ashutosh Dixit's avatar Ashutosh Dixit Committed by Greg Kroah-Hartman

misc: mic: Fix user space namespace pollution from mic_common.h.

Avoid declaring ALIGN() and __aligned() in
include/uapi/linux/mic_common.h since they pollute user space
namespace. Also, mic_aligned_size() can be simply replaced simply by
sizeof() since all structures where mic_aligned_size() is used are
declared using __attribute__ ((aligned(8)));

--
>From mail from H Peter Anvin about this:

On Fri, Nov 08, 2013 H Peter Anvin <h.peter.anvin@intel.com> wrote:
Subject: Namespace pollution in mic_common.h

This puts two macros, ALIGN() and __aligned(), into arbitrary user space
namespace.  This really isn't safe or acceptable, especially since those
symbols are highly generic.
...
When these structures are forced-aligned, they will in fact have padding
automatically added by the compiler to an 8-byte boundary anyway, so
mic_aligned_size() does nothing.
...
Reported-by: default avatarH Peter Anvin <h.peter.anvin@intel.com>
Reviewed-by: default avatarSudeep Dutt <sudeep.dutt@intel.com>
Signed-off-by: default avatarNikhil Rao <nikhil.rao@intel.com>
Signed-off-by: default avatarAshutosh Dixit <ashutosh.dixit@intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 286c2402
...@@ -313,7 +313,7 @@ static struct mic_device_desc *get_device_desc(struct mic_info *mic, int type) ...@@ -313,7 +313,7 @@ static struct mic_device_desc *get_device_desc(struct mic_info *mic, int type)
int i; int i;
void *dp = get_dp(mic, type); void *dp = get_dp(mic, type);
for (i = mic_aligned_size(struct mic_bootparam); i < PAGE_SIZE; for (i = sizeof(struct mic_bootparam); i < PAGE_SIZE;
i += mic_total_desc_size(d)) { i += mic_total_desc_size(d)) {
d = dp + i; d = dp + i;
...@@ -520,7 +520,7 @@ static void * ...@@ -520,7 +520,7 @@ static void *
virtio_net(void *arg) virtio_net(void *arg)
{ {
static __u8 vnet_hdr[2][sizeof(struct virtio_net_hdr)]; static __u8 vnet_hdr[2][sizeof(struct virtio_net_hdr)];
static __u8 vnet_buf[2][MAX_NET_PKT_SIZE] __aligned(64); static __u8 vnet_buf[2][MAX_NET_PKT_SIZE] __attribute__ ((aligned(64)));
struct iovec vnet_iov[2][2] = { struct iovec vnet_iov[2][2] = {
{ { .iov_base = vnet_hdr[0], .iov_len = sizeof(vnet_hdr[0]) }, { { .iov_base = vnet_hdr[0], .iov_len = sizeof(vnet_hdr[0]) },
{ .iov_base = vnet_buf[0], .iov_len = sizeof(vnet_buf[0]) } }, { .iov_base = vnet_buf[0], .iov_len = sizeof(vnet_buf[0]) } },
......
...@@ -520,8 +520,8 @@ static void mic_scan_devices(struct mic_driver *mdrv, bool remove) ...@@ -520,8 +520,8 @@ static void mic_scan_devices(struct mic_driver *mdrv, bool remove)
struct device *dev; struct device *dev;
int ret; int ret;
for (i = mic_aligned_size(struct mic_bootparam); for (i = sizeof(struct mic_bootparam); i < MIC_DP_SIZE;
i < MIC_DP_SIZE; i += mic_total_desc_size(d)) { i += mic_total_desc_size(d)) {
d = mdrv->dp + i; d = mdrv->dp + i;
dc = (void __iomem *)d + mic_aligned_desc_size(d); dc = (void __iomem *)d + mic_aligned_desc_size(d);
/* /*
......
...@@ -42,8 +42,8 @@ ...@@ -42,8 +42,8 @@
static inline unsigned mic_desc_size(struct mic_device_desc __iomem *desc) static inline unsigned mic_desc_size(struct mic_device_desc __iomem *desc)
{ {
return mic_aligned_size(*desc) return sizeof(*desc)
+ ioread8(&desc->num_vq) * mic_aligned_size(struct mic_vqconfig) + ioread8(&desc->num_vq) * sizeof(struct mic_vqconfig)
+ ioread8(&desc->feature_len) * 2 + ioread8(&desc->feature_len) * 2
+ ioread8(&desc->config_len); + ioread8(&desc->config_len);
} }
...@@ -67,8 +67,7 @@ mic_vq_configspace(struct mic_device_desc __iomem *desc) ...@@ -67,8 +67,7 @@ mic_vq_configspace(struct mic_device_desc __iomem *desc)
} }
static inline unsigned mic_total_desc_size(struct mic_device_desc __iomem *desc) static inline unsigned mic_total_desc_size(struct mic_device_desc __iomem *desc)
{ {
return mic_aligned_desc_size(desc) + return mic_aligned_desc_size(desc) + sizeof(struct mic_device_ctrl);
mic_aligned_size(struct mic_device_ctrl);
} }
int mic_devices_init(struct mic_driver *mdrv); int mic_devices_init(struct mic_driver *mdrv);
......
...@@ -467,7 +467,7 @@ static int mic_copy_dp_entry(struct mic_vdev *mvdev, ...@@ -467,7 +467,7 @@ static int mic_copy_dp_entry(struct mic_vdev *mvdev,
} }
/* Find the first free device page entry */ /* Find the first free device page entry */
for (i = mic_aligned_size(struct mic_bootparam); for (i = sizeof(struct mic_bootparam);
i < MIC_DP_SIZE - mic_total_desc_size(dd_config); i < MIC_DP_SIZE - mic_total_desc_size(dd_config);
i += mic_total_desc_size(devp)) { i += mic_total_desc_size(devp)) {
devp = mdev->dp + i; devp = mdev->dp + i;
......
...@@ -23,12 +23,7 @@ ...@@ -23,12 +23,7 @@
#include <linux/virtio_ring.h> #include <linux/virtio_ring.h>
#ifndef __KERNEL__ #define __mic_align(a, x) (((a) + (x) - 1) & ~((x) - 1))
#define ALIGN(a, x) (((a) + (x) - 1) & ~((x) - 1))
#define __aligned(x) __attribute__ ((aligned(x)))
#endif
#define mic_aligned_size(x) ALIGN(sizeof(x), 8)
/** /**
* struct mic_device_desc: Virtio device information shared between the * struct mic_device_desc: Virtio device information shared between the
...@@ -49,7 +44,7 @@ struct mic_device_desc { ...@@ -49,7 +44,7 @@ struct mic_device_desc {
__u8 config_len; __u8 config_len;
__u8 status; __u8 status;
__u64 config[0]; __u64 config[0];
} __aligned(8); } __attribute__ ((aligned(8)));
/** /**
* struct mic_device_ctrl: Per virtio device information in the device page * struct mic_device_ctrl: Per virtio device information in the device page
...@@ -74,7 +69,7 @@ struct mic_device_ctrl { ...@@ -74,7 +69,7 @@ struct mic_device_ctrl {
__u8 used_address_updated; __u8 used_address_updated;
__s8 c2h_vdev_db; __s8 c2h_vdev_db;
__s8 h2c_vdev_db; __s8 h2c_vdev_db;
} __aligned(8); } __attribute__ ((aligned(8)));
/** /**
* struct mic_bootparam: Virtio device independent information in device page * struct mic_bootparam: Virtio device independent information in device page
...@@ -93,7 +88,7 @@ struct mic_bootparam { ...@@ -93,7 +88,7 @@ struct mic_bootparam {
__s8 h2c_config_db; __s8 h2c_config_db;
__u8 shutdown_status; __u8 shutdown_status;
__u8 shutdown_card; __u8 shutdown_card;
} __aligned(8); } __attribute__ ((aligned(8)));
/** /**
* struct mic_device_page: High level representation of the device page * struct mic_device_page: High level representation of the device page
...@@ -119,7 +114,7 @@ struct mic_vqconfig { ...@@ -119,7 +114,7 @@ struct mic_vqconfig {
__u64 address; __u64 address;
__u64 used_address; __u64 used_address;
__u16 num; __u16 num;
} __aligned(8); } __attribute__ ((aligned(8)));
/* /*
* The alignment to use between consumer and producer parts of vring. * The alignment to use between consumer and producer parts of vring.
...@@ -173,15 +168,13 @@ struct mic_vring { ...@@ -173,15 +168,13 @@ struct mic_vring {
int len; int len;
}; };
#define mic_aligned_desc_size(d) ALIGN(mic_desc_size(d), 8) #define mic_aligned_desc_size(d) __mic_align(mic_desc_size(d), 8)
#ifndef INTEL_MIC_CARD #ifndef INTEL_MIC_CARD
static inline unsigned mic_desc_size(const struct mic_device_desc *desc) static inline unsigned mic_desc_size(const struct mic_device_desc *desc)
{ {
return mic_aligned_size(*desc) return sizeof(*desc) + desc->num_vq * sizeof(struct mic_vqconfig)
+ desc->num_vq * mic_aligned_size(struct mic_vqconfig) + desc->feature_len * 2 + desc->config_len;
+ desc->feature_len * 2
+ desc->config_len;
} }
static inline struct mic_vqconfig * static inline struct mic_vqconfig *
...@@ -201,8 +194,7 @@ static inline __u8 *mic_vq_configspace(const struct mic_device_desc *desc) ...@@ -201,8 +194,7 @@ static inline __u8 *mic_vq_configspace(const struct mic_device_desc *desc)
} }
static inline unsigned mic_total_desc_size(struct mic_device_desc *desc) static inline unsigned mic_total_desc_size(struct mic_device_desc *desc)
{ {
return mic_aligned_desc_size(desc) + return mic_aligned_desc_size(desc) + sizeof(struct mic_device_ctrl);
mic_aligned_size(struct mic_device_ctrl);
} }
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment