aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/infiniband/ulp/ipoib/ipoib.h10
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/infiniband/ulp/ipoib/ipoib.h b/drivers/infiniband/ulp/ipoib/ipoib.h
index 2f85a9a831b1..638eff745b2f 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib.h
+++ b/drivers/infiniband/ulp/ipoib/ipoib.h
@@ -217,10 +217,16 @@ struct ipoib_neigh {
217 struct list_head list; 217 struct list_head list;
218}; 218};
219 219
220/*
221 * We stash a pointer to our private neighbour information after our
222 * hardware address in neigh->ha. The ALIGN() expression here makes
223 * sure that this pointer is stored aligned so that an unaligned
224 * load is not needed to dereference it.
225 */
220static inline struct ipoib_neigh **to_ipoib_neigh(struct neighbour *neigh) 226static inline struct ipoib_neigh **to_ipoib_neigh(struct neighbour *neigh)
221{ 227{
222 return (struct ipoib_neigh **) (neigh->ha + 24 - 228 return (void*) neigh + ALIGN(offsetof(struct neighbour, ha) +
223 (offsetof(struct neighbour, ha) & 4)); 229 INFINIBAND_ALEN, sizeof(void *));
224} 230}
225 231
226extern struct workqueue_struct *ipoib_workqueue; 232extern struct workqueue_struct *ipoib_workqueue;