Skip to content

Commit

Permalink
[PATCH] IB/addr: gid structure alignment fix
Browse files Browse the repository at this point in the history
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: Sean Hefty <[email protected]>
Signed-off-by: Michael S. Tsirkin <[email protected]>
Cc: Roland Dreier <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Michael S. Tsirkin authored and Linus Torvalds committed Jul 15, 2006
1 parent 04c3354 commit f0ee340
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 14 deletions.
21 changes: 11 additions & 10 deletions drivers/infiniband/core/cma.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
struct cma_device *cma_dev;
union ib_gid *gid;
union ib_gid gid;
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);
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);
if (!ret) {
cma_attach_to_dev(id_priv, cma_dev);
Expand Down Expand Up @@ -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;

memset(&path_rec, 0, sizeof path_rec);
path_rec.sgid = *ib_addr_get_sgid(addr);
path_rec.dgid = *ib_addr_get_dgid(addr);
ib_addr_get_sgid(addr, &path_rec.sgid);
ib_addr_get_dgid(addr, &path_rec.dgid);
path_rec.pkey = cpu_to_be16(ib_addr_get_pkey(addr));
path_rec.numb_path = 1;

Expand Down Expand Up @@ -1263,7 +1263,7 @@ static int cma_bind_loopback(struct rdma_id_private *id_priv)
{
struct cma_device *cma_dev;
struct ib_port_attr port_attr;
union ib_gid *gid;
union ib_gid gid;
u16 pkey;
int ret;
u8 p;
Expand All @@ -1284,15 +1284,15 @@ static int cma_bind_loopback(struct rdma_id_private *id_priv)
}

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)
goto out;

ret = ib_get_cached_pkey(cma_dev->device, p, 0, &pkey);
if (ret)
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);
id_priv->id.port_num = p;
cma_attach_to_dev(id_priv, cma_dev);
Expand Down Expand Up @@ -1339,6 +1339,7 @@ static int cma_resolve_loopback(struct rdma_id_private *id_priv)
{
struct cma_work *work;
struct sockaddr_in *src_in, *dst_in;
union ib_gid gid;
int ret;

work = kzalloc(sizeof *work, GFP_KERNEL);
Expand All @@ -1351,8 +1352,8 @@ static int cma_resolve_loopback(struct rdma_id_private *id_priv)
goto err;
}

ib_addr_set_dgid(&id_priv->id.route.addr.dev_addr,
ib_addr_get_sgid(&id_priv->id.route.addr.dev_addr));
ib_addr_get_sgid(&id_priv->id.route.addr.dev_addr, &gid);
ib_addr_set_dgid(&id_priv->id.route.addr.dev_addr, &gid);

if (cma_zero_addr(&id_priv->id.route.addr.src_addr)) {
src_in = (struct sockaddr_in *)&id_priv->id.route.addr.src_addr;
Expand Down
10 changes: 6 additions & 4 deletions include/rdma/ib_addr.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

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,
Expand All @@ -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);
}

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,
Expand Down

0 comments on commit f0ee340

Please sign in to comment.