Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[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: Sean Hefty <sean.hefty@intel.com>
Signed-off-by: Michael S. Tsirkin <mst@mellanox.co.il>
Cc: Roland Dreier <rolandd@cisco.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by

Michael S. Tsirkin and committed by
Linus Torvalds
f0ee3404 04c33543

+17 -14
+11 -10
drivers/infiniband/core/cma.c
··· 262 262 static int cma_acquire_ib_dev(struct rdma_id_private *id_priv) 263 263 { 264 264 struct cma_device *cma_dev; 265 - union ib_gid *gid; 265 + union ib_gid gid; 266 266 int ret = -ENODEV; 267 267 268 - gid = ib_addr_get_sgid(&id_priv->id.route.addr.dev_addr); 268 + ib_addr_get_sgid(&id_priv->id.route.addr.dev_addr, &gid), 269 269 270 270 mutex_lock(&lock); 271 271 list_for_each_entry(cma_dev, &dev_list, list) { 272 - ret = ib_find_cached_gid(cma_dev->device, gid, 272 + ret = ib_find_cached_gid(cma_dev->device, &gid, 273 273 &id_priv->id.port_num, NULL); 274 274 if (!ret) { 275 275 cma_attach_to_dev(id_priv, cma_dev); ··· 1134 1134 struct ib_sa_path_rec path_rec; 1135 1135 1136 1136 memset(&path_rec, 0, sizeof path_rec); 1137 - path_rec.sgid = *ib_addr_get_sgid(addr); 1138 - path_rec.dgid = *ib_addr_get_dgid(addr); 1137 + ib_addr_get_sgid(addr, &path_rec.sgid); 1138 + ib_addr_get_dgid(addr, &path_rec.dgid); 1139 1139 path_rec.pkey = cpu_to_be16(ib_addr_get_pkey(addr)); 1140 1140 path_rec.numb_path = 1; 1141 1141 ··· 1263 1263 { 1264 1264 struct cma_device *cma_dev; 1265 1265 struct ib_port_attr port_attr; 1266 - union ib_gid *gid; 1266 + union ib_gid gid; 1267 1267 u16 pkey; 1268 1268 int ret; 1269 1269 u8 p; ··· 1284 1284 } 1285 1285 1286 1286 port_found: 1287 - gid = ib_addr_get_sgid(&id_priv->id.route.addr.dev_addr); 1288 - ret = ib_get_cached_gid(cma_dev->device, p, 0, gid); 1287 + ret = ib_get_cached_gid(cma_dev->device, p, 0, &gid); 1289 1288 if (ret) 1290 1289 goto out; 1291 1290 ··· 1292 1293 if (ret) 1293 1294 goto out; 1294 1295 1296 + ib_addr_set_sgid(&id_priv->id.route.addr.dev_addr, &gid); 1295 1297 ib_addr_set_pkey(&id_priv->id.route.addr.dev_addr, pkey); 1296 1298 id_priv->id.port_num = p; 1297 1299 cma_attach_to_dev(id_priv, cma_dev); ··· 1339 1339 { 1340 1340 struct cma_work *work; 1341 1341 struct sockaddr_in *src_in, *dst_in; 1342 + union ib_gid gid; 1342 1343 int ret; 1343 1344 1344 1345 work = kzalloc(sizeof *work, GFP_KERNEL); ··· 1352 1351 goto err; 1353 1352 } 1354 1353 1355 - ib_addr_set_dgid(&id_priv->id.route.addr.dev_addr, 1356 - ib_addr_get_sgid(&id_priv->id.route.addr.dev_addr)); 1354 + ib_addr_get_sgid(&id_priv->id.route.addr.dev_addr, &gid); 1355 + ib_addr_set_dgid(&id_priv->id.route.addr.dev_addr, &gid); 1357 1356 1358 1357 if (cma_zero_addr(&id_priv->id.route.addr.src_addr)) { 1359 1358 src_in = (struct sockaddr_in *)&id_priv->id.route.addr.src_addr;
+6 -4
include/rdma/ib_addr.h
··· 89 89 dev_addr->broadcast[9] = (unsigned char) pkey; 90 90 } 91 91 92 - static inline union ib_gid *ib_addr_get_sgid(struct rdma_dev_addr *dev_addr) 92 + static inline void ib_addr_get_sgid(struct rdma_dev_addr *dev_addr, 93 + union ib_gid *gid) 93 94 { 94 - return (union ib_gid *) (dev_addr->src_dev_addr + 4); 95 + memcpy(gid, dev_addr->src_dev_addr + 4, sizeof *gid); 95 96 } 96 97 97 98 static inline void ib_addr_set_sgid(struct rdma_dev_addr *dev_addr, ··· 101 100 memcpy(dev_addr->src_dev_addr + 4, gid, sizeof *gid); 102 101 } 103 102 104 - static inline union ib_gid *ib_addr_get_dgid(struct rdma_dev_addr *dev_addr) 103 + static inline void ib_addr_get_dgid(struct rdma_dev_addr *dev_addr, 104 + union ib_gid *gid) 105 105 { 106 - return (union ib_gid *) (dev_addr->dst_dev_addr + 4); 106 + memcpy(gid, dev_addr->dst_dev_addr + 4, sizeof *gid); 107 107 } 108 108 109 109 static inline void ib_addr_set_dgid(struct rdma_dev_addr *dev_addr,