Commit f0ee3404 authored by Michael S. Tsirkin's avatar Michael S. Tsirkin Committed by Linus Torvalds

[PATCH] IB/addr: gid structure alignment fix

The device address contains unsigned character arrays, which contain raw GID
addresses.  The GIDs may not be naturally aligned, so do not cast them to
structures or unions.
Signed-off-by: default avatarSean Hefty <sean.hefty@intel.com>
Signed-off-by: default avatarMichael S. Tsirkin <mst@mellanox.co.il>
Cc: Roland Dreier <rolandd@cisco.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 04c33543
...@@ -262,14 +262,14 @@ static void cma_detach_from_dev(struct rdma_id_private *id_priv) ...@@ -262,14 +262,14 @@ static void cma_detach_from_dev(struct rdma_id_private *id_priv)
static int cma_acquire_ib_dev(struct rdma_id_private *id_priv) static int cma_acquire_ib_dev(struct rdma_id_private *id_priv)
{ {
struct cma_device *cma_dev; struct cma_device *cma_dev;
union ib_gid *gid; union ib_gid gid;
int ret = -ENODEV; int ret = -ENODEV;
gid = ib_addr_get_sgid(&id_priv->id.route.addr.dev_addr); ib_addr_get_sgid(&id_priv->id.route.addr.dev_addr, &gid),
mutex_lock(&lock); mutex_lock(&lock);
list_for_each_entry(cma_dev, &dev_list, list) { list_for_each_entry(cma_dev, &dev_list, list) {
ret = ib_find_cached_gid(cma_dev->device, gid, ret = ib_find_cached_gid(cma_dev->device, &gid,
&id_priv->id.port_num, NULL); &id_priv->id.port_num, NULL);
if (!ret) { if (!ret) {
cma_attach_to_dev(id_priv, cma_dev); cma_attach_to_dev(id_priv, cma_dev);
...@@ -1134,8 +1134,8 @@ static int cma_query_ib_route(struct rdma_id_private *id_priv, int timeout_ms, ...@@ -1134,8 +1134,8 @@ static int cma_query_ib_route(struct rdma_id_private *id_priv, int timeout_ms,
struct ib_sa_path_rec path_rec; struct ib_sa_path_rec path_rec;
memset(&path_rec, 0, sizeof path_rec); memset(&path_rec, 0, sizeof path_rec);
path_rec.sgid = *ib_addr_get_sgid(addr); ib_addr_get_sgid(addr, &path_rec.sgid);
path_rec.dgid = *ib_addr_get_dgid(addr); ib_addr_get_dgid(addr, &path_rec.dgid);
path_rec.pkey = cpu_to_be16(ib_addr_get_pkey(addr)); path_rec.pkey = cpu_to_be16(ib_addr_get_pkey(addr));
path_rec.numb_path = 1; path_rec.numb_path = 1;
...@@ -1263,7 +1263,7 @@ static int cma_bind_loopback(struct rdma_id_private *id_priv) ...@@ -1263,7 +1263,7 @@ static int cma_bind_loopback(struct rdma_id_private *id_priv)
{ {
struct cma_device *cma_dev; struct cma_device *cma_dev;
struct ib_port_attr port_attr; struct ib_port_attr port_attr;
union ib_gid *gid; union ib_gid gid;
u16 pkey; u16 pkey;
int ret; int ret;
u8 p; u8 p;
...@@ -1284,8 +1284,7 @@ static int cma_bind_loopback(struct rdma_id_private *id_priv) ...@@ -1284,8 +1284,7 @@ static int cma_bind_loopback(struct rdma_id_private *id_priv)
} }
port_found: port_found:
gid = ib_addr_get_sgid(&id_priv->id.route.addr.dev_addr); ret = ib_get_cached_gid(cma_dev->device, p, 0, &gid);
ret = ib_get_cached_gid(cma_dev->device, p, 0, gid);
if (ret) if (ret)
goto out; goto out;
...@@ -1293,6 +1292,7 @@ port_found: ...@@ -1293,6 +1292,7 @@ port_found:
if (ret) if (ret)
goto out; goto out;
ib_addr_set_sgid(&id_priv->id.route.addr.dev_addr, &gid);
ib_addr_set_pkey(&id_priv->id.route.addr.dev_addr, pkey); ib_addr_set_pkey(&id_priv->id.route.addr.dev_addr, pkey);
id_priv->id.port_num = p; id_priv->id.port_num = p;
cma_attach_to_dev(id_priv, cma_dev); cma_attach_to_dev(id_priv, cma_dev);
...@@ -1339,6 +1339,7 @@ static int cma_resolve_loopback(struct rdma_id_private *id_priv) ...@@ -1339,6 +1339,7 @@ static int cma_resolve_loopback(struct rdma_id_private *id_priv)
{ {
struct cma_work *work; struct cma_work *work;
struct sockaddr_in *src_in, *dst_in; struct sockaddr_in *src_in, *dst_in;
union ib_gid gid;
int ret; int ret;
work = kzalloc(sizeof *work, GFP_KERNEL); work = kzalloc(sizeof *work, GFP_KERNEL);
...@@ -1351,8 +1352,8 @@ static int cma_resolve_loopback(struct rdma_id_private *id_priv) ...@@ -1351,8 +1352,8 @@ static int cma_resolve_loopback(struct rdma_id_private *id_priv)
goto err; goto err;
} }
ib_addr_set_dgid(&id_priv->id.route.addr.dev_addr, ib_addr_get_sgid(&id_priv->id.route.addr.dev_addr, &gid);
ib_addr_get_sgid(&id_priv->id.route.addr.dev_addr)); ib_addr_set_dgid(&id_priv->id.route.addr.dev_addr, &gid);
if (cma_zero_addr(&id_priv->id.route.addr.src_addr)) { if (cma_zero_addr(&id_priv->id.route.addr.src_addr)) {
src_in = (struct sockaddr_in *)&id_priv->id.route.addr.src_addr; src_in = (struct sockaddr_in *)&id_priv->id.route.addr.src_addr;
......
...@@ -89,9 +89,10 @@ static inline void ib_addr_set_pkey(struct rdma_dev_addr *dev_addr, u16 pkey) ...@@ -89,9 +89,10 @@ static inline void ib_addr_set_pkey(struct rdma_dev_addr *dev_addr, u16 pkey)
dev_addr->broadcast[9] = (unsigned char) pkey; dev_addr->broadcast[9] = (unsigned char) pkey;
} }
static inline union ib_gid *ib_addr_get_sgid(struct rdma_dev_addr *dev_addr) static inline void ib_addr_get_sgid(struct rdma_dev_addr *dev_addr,
union ib_gid *gid)
{ {
return (union ib_gid *) (dev_addr->src_dev_addr + 4); memcpy(gid, dev_addr->src_dev_addr + 4, sizeof *gid);
} }
static inline void ib_addr_set_sgid(struct rdma_dev_addr *dev_addr, static inline void ib_addr_set_sgid(struct rdma_dev_addr *dev_addr,
...@@ -100,9 +101,10 @@ static inline void ib_addr_set_sgid(struct rdma_dev_addr *dev_addr, ...@@ -100,9 +101,10 @@ static inline void ib_addr_set_sgid(struct rdma_dev_addr *dev_addr,
memcpy(dev_addr->src_dev_addr + 4, gid, sizeof *gid); memcpy(dev_addr->src_dev_addr + 4, gid, sizeof *gid);
} }
static inline union ib_gid *ib_addr_get_dgid(struct rdma_dev_addr *dev_addr) static inline void ib_addr_get_dgid(struct rdma_dev_addr *dev_addr,
union ib_gid *gid)
{ {
return (union ib_gid *) (dev_addr->dst_dev_addr + 4); memcpy(gid, dev_addr->dst_dev_addr + 4, sizeof *gid);
} }
static inline void ib_addr_set_dgid(struct rdma_dev_addr *dev_addr, static inline void ib_addr_set_dgid(struct rdma_dev_addr *dev_addr,
......
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