aboutsummaryrefslogtreecommitdiffstats
path: root/include/rdma
diff options
context:
space:
mode:
Diffstat (limited to 'include/rdma')
-rw-r--r--include/rdma/ib_user_mad.h22
1 files changed, 21 insertions, 1 deletions
diff --git a/include/rdma/ib_user_mad.h b/include/rdma/ib_user_mad.h
index 2a32043d1abd..29d2c7205a90 100644
--- a/include/rdma/ib_user_mad.h
+++ b/include/rdma/ib_user_mad.h
@@ -147,6 +147,26 @@ struct ib_user_mad {
147 __u64 data[0]; 147 __u64 data[0];
148}; 148};
149 149
150/*
151 * Earlier versions of this interface definition declared the
152 * method_mask[] member as an array of __u32 but treated it as a
153 * bitmap made up of longs in the kernel. This ambiguity meant that
154 * 32-bit big-endian applications that can run on both 32-bit and
155 * 64-bit kernels had no consistent ABI to rely on, and 64-bit
156 * big-endian applications that treated method_mask as being made up
157 * of 32-bit words would have their bitmap misinterpreted.
158 *
159 * To clear up this confusion, we change the declaration of
160 * method_mask[] to use unsigned long and handle the conversion from
161 * 32-bit userspace to 64-bit kernel for big-endian systems in the
162 * compat_ioctl method. Unfortunately, to keep the structure layout
163 * the same, we need the method_mask[] array to be aligned only to 4
164 * bytes even when long is 64 bits, which forces us into this ugly
165 * typedef.
166 */
167typedef unsigned long __attribute__((aligned(4))) packed_ulong;
168#define IB_USER_MAD_LONGS_PER_METHOD_MASK (128 / (8 * sizeof (long)))
169
150/** 170/**
151 * ib_user_mad_reg_req - MAD registration request 171 * ib_user_mad_reg_req - MAD registration request
152 * @id - Set by the kernel; used to identify agent in future requests. 172 * @id - Set by the kernel; used to identify agent in future requests.
@@ -165,7 +185,7 @@ struct ib_user_mad {
165 */ 185 */
166struct ib_user_mad_reg_req { 186struct ib_user_mad_reg_req {
167 __u32 id; 187 __u32 id;
168 __u32 method_mask[4]; 188 packed_ulong method_mask[IB_USER_MAD_LONGS_PER_METHOD_MASK];
169 __u8 qpn; 189 __u8 qpn;
170 __u8 mgmt_class; 190 __u8 mgmt_class;
171 __u8 mgmt_class_version; 191 __u8 mgmt_class_version;