aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband
diff options
context:
space:
mode:
authorMark Debbage <mark.debbage@qlogic.com>2007-03-15 17:44:59 -0400
committerRoland Dreier <rolandd@cisco.com>2007-04-18 23:20:57 -0400
commitc7e29ff11f23ec78b3caf691789c2b791bb596bf (patch)
tree4cba69e809f422e7cd5c7297335ba551496ddce5 /drivers/infiniband
parent0a5a83cffc03592c2102ad07b7532b596a16f8cd (diff)
IB/ipath: Allow receive ports mapped into userspace to be shared
Improve port-sharing performance by allowing any process to receive packets from the shared hardware port under a spin lock for mutual exclusion. Previously, one process was nominated as the master and that process was responsible for receiving all packets from the shared hardware port and either consuming them or forwarding them to their destination. This led to starvation problems for other processes when the master process was busy in computation phases. Signed-off-by: Bryan O'Sullivan <bryan.osullivan@qlogic.com> Signed-off-by: Roland Dreier <rolandd@cisco.com>
Diffstat (limited to 'drivers/infiniband')
-rw-r--r--drivers/infiniband/hw/ipath/ipath_common.h16
-rw-r--r--drivers/infiniband/hw/ipath/ipath_file_ops.c171
2 files changed, 104 insertions, 83 deletions
diff --git a/drivers/infiniband/hw/ipath/ipath_common.h b/drivers/infiniband/hw/ipath/ipath_common.h
index a41367803529..048b928bb4bf 100644
--- a/drivers/infiniband/hw/ipath/ipath_common.h
+++ b/drivers/infiniband/hw/ipath/ipath_common.h
@@ -1,5 +1,5 @@
1/* 1/*
2 * Copyright (c) 2006 QLogic, Inc. All rights reserved. 2 * Copyright (c) 2006, 2007 QLogic Corporation. All rights reserved.
3 * Copyright (c) 2003, 2004, 2005, 2006 PathScale, Inc. All rights reserved. 3 * Copyright (c) 2003, 2004, 2005, 2006 PathScale, Inc. All rights reserved.
4 * 4 *
5 * This software is available to you under a choice of one of two 5 * This software is available to you under a choice of one of two
@@ -318,11 +318,17 @@ struct ipath_base_info {
318 /* address of readonly memory copy of the rcvhdrq tail register. */ 318 /* address of readonly memory copy of the rcvhdrq tail register. */
319 __u64 spi_rcvhdr_tailaddr; 319 __u64 spi_rcvhdr_tailaddr;
320 320
321 /* shared memory pages for subports if IPATH_RUNTIME_MASTER is set */ 321 /* shared memory pages for subports if port is shared */
322 __u64 spi_subport_uregbase; 322 __u64 spi_subport_uregbase;
323 __u64 spi_subport_rcvegrbuf; 323 __u64 spi_subport_rcvegrbuf;
324 __u64 spi_subport_rcvhdr_base; 324 __u64 spi_subport_rcvhdr_base;
325 325
326 /* shared memory page for hardware port if it is shared */
327 __u64 spi_port_uregbase;
328 __u64 spi_port_rcvegrbuf;
329 __u64 spi_port_rcvhdr_base;
330 __u64 spi_port_rcvhdr_tailaddr;
331
326} __attribute__ ((aligned(8))); 332} __attribute__ ((aligned(8)));
327 333
328 334
@@ -346,7 +352,7 @@ struct ipath_base_info {
346 * may not be implemented; the user code must deal with this if it 352 * may not be implemented; the user code must deal with this if it
347 * cares, or it must abort after initialization reports the difference. 353 * cares, or it must abort after initialization reports the difference.
348 */ 354 */
349#define IPATH_USER_SWMINOR 3 355#define IPATH_USER_SWMINOR 4
350 356
351#define IPATH_USER_SWVERSION ((IPATH_USER_SWMAJOR<<16) | IPATH_USER_SWMINOR) 357#define IPATH_USER_SWVERSION ((IPATH_USER_SWMAJOR<<16) | IPATH_USER_SWMINOR)
352 358
@@ -420,7 +426,7 @@ struct ipath_user_info {
420#define IPATH_CMD_TID_UPDATE 19 /* update expected TID entries */ 426#define IPATH_CMD_TID_UPDATE 19 /* update expected TID entries */
421#define IPATH_CMD_TID_FREE 20 /* free expected TID entries */ 427#define IPATH_CMD_TID_FREE 20 /* free expected TID entries */
422#define IPATH_CMD_SET_PART_KEY 21 /* add partition key */ 428#define IPATH_CMD_SET_PART_KEY 21 /* add partition key */
423#define IPATH_CMD_SLAVE_INFO 22 /* return info on slave processes */ 429#define __IPATH_CMD_SLAVE_INFO 22 /* return info on slave processes (for old user code) */
424#define IPATH_CMD_ASSIGN_PORT 23 /* allocate HCA and port */ 430#define IPATH_CMD_ASSIGN_PORT 23 /* allocate HCA and port */
425#define IPATH_CMD_USER_INIT 24 /* set up userspace */ 431#define IPATH_CMD_USER_INIT 24 /* set up userspace */
426 432
@@ -432,7 +438,7 @@ struct ipath_port_info {
432 __u16 port; /* port on unit assigned to caller */ 438 __u16 port; /* port on unit assigned to caller */
433 __u16 subport; /* subport on unit assigned to caller */ 439 __u16 subport; /* subport on unit assigned to caller */
434 __u16 num_ports; /* number of ports available on unit */ 440 __u16 num_ports; /* number of ports available on unit */
435 __u16 num_subports; /* number of subport slaves opened on port */ 441 __u16 num_subports; /* number of subports opened on port */
436}; 442};
437 443
438struct ipath_tid_info { 444struct ipath_tid_info {
diff --git a/drivers/infiniband/hw/ipath/ipath_file_ops.c b/drivers/infiniband/hw/ipath/ipath_file_ops.c
index a1cfedf8fb1c..bb53bde80ee8 100644
--- a/drivers/infiniband/hw/ipath/ipath_file_ops.c
+++ b/drivers/infiniband/hw/ipath/ipath_file_ops.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * Copyright (c) 2006 QLogic, Inc. All rights reserved. 2 * Copyright (c) 2006, 2007 QLogic Corporation. All rights reserved.
3 * Copyright (c) 2003, 2004, 2005, 2006 PathScale, Inc. All rights reserved. 3 * Copyright (c) 2003, 2004, 2005, 2006 PathScale, Inc. All rights reserved.
4 * 4 *
5 * This software is available to you under a choice of one of two 5 * This software is available to you under a choice of one of two
@@ -99,7 +99,7 @@ static int ipath_get_base_info(struct file *fp,
99 sz = sizeof(*kinfo); 99 sz = sizeof(*kinfo);
100 /* If port sharing is not requested, allow the old size structure */ 100 /* If port sharing is not requested, allow the old size structure */
101 if (!shared) 101 if (!shared)
102 sz -= 3 * sizeof(u64); 102 sz -= 7 * sizeof(u64);
103 if (ubase_size < sz) { 103 if (ubase_size < sz) {
104 ipath_cdbg(PROC, 104 ipath_cdbg(PROC,
105 "Base size %zu, need %zu (version mismatch?)\n", 105 "Base size %zu, need %zu (version mismatch?)\n",
@@ -177,22 +177,41 @@ static int ipath_get_base_info(struct file *fp,
177 kinfo->spi_piobufbase = (u64) pd->port_piobufs + 177 kinfo->spi_piobufbase = (u64) pd->port_piobufs +
178 dd->ipath_palign * 178 dd->ipath_palign *
179 (dd->ipath_pbufsport - kinfo->spi_piocnt); 179 (dd->ipath_pbufsport - kinfo->spi_piocnt);
180 kinfo->__spi_uregbase = (u64) dd->ipath_uregbase +
181 dd->ipath_palign * pd->port_port;
182 } else { 180 } else {
183 unsigned slave = subport_fp(fp) - 1; 181 unsigned slave = subport_fp(fp) - 1;
184 182
185 kinfo->spi_piocnt = dd->ipath_pbufsport / subport_cnt; 183 kinfo->spi_piocnt = dd->ipath_pbufsport / subport_cnt;
186 kinfo->spi_piobufbase = (u64) pd->port_piobufs + 184 kinfo->spi_piobufbase = (u64) pd->port_piobufs +
187 dd->ipath_palign * kinfo->spi_piocnt * slave; 185 dd->ipath_palign * kinfo->spi_piocnt * slave;
186 }
187 if (shared) {
188 kinfo->spi_port_uregbase = (u64) dd->ipath_uregbase +
189 dd->ipath_palign * pd->port_port;
190 kinfo->spi_port_rcvegrbuf = kinfo->spi_rcv_egrbufs;
191 kinfo->spi_port_rcvhdr_base = kinfo->spi_rcvhdr_base;
192 kinfo->spi_port_rcvhdr_tailaddr = kinfo->spi_rcvhdr_tailaddr;
193
188 kinfo->__spi_uregbase = cvt_kvaddr(pd->subport_uregbase + 194 kinfo->__spi_uregbase = cvt_kvaddr(pd->subport_uregbase +
189 PAGE_SIZE * slave); 195 PAGE_SIZE * subport_fp(fp));
190 196
191 kinfo->spi_rcvhdr_base = cvt_kvaddr(pd->subport_rcvhdr_base + 197 kinfo->spi_rcvhdr_base = cvt_kvaddr(pd->subport_rcvhdr_base +
192 pd->port_rcvhdrq_size * slave); 198 pd->port_rcvhdrq_size * subport_fp(fp));
193 kinfo->spi_rcvhdr_tailaddr = 0; 199 kinfo->spi_rcvhdr_tailaddr = 0;
194 kinfo->spi_rcv_egrbufs = cvt_kvaddr(pd->subport_rcvegrbuf + 200 kinfo->spi_rcv_egrbufs = cvt_kvaddr(pd->subport_rcvegrbuf +
195 dd->ipath_rcvegrcnt * dd->ipath_rcvegrbufsize * slave); 201 pd->port_rcvegrbuf_chunks * pd->port_rcvegrbuf_size *
202 subport_fp(fp));
203
204 kinfo->spi_subport_uregbase =
205 cvt_kvaddr(pd->subport_uregbase);
206 kinfo->spi_subport_rcvegrbuf =
207 cvt_kvaddr(pd->subport_rcvegrbuf);
208 kinfo->spi_subport_rcvhdr_base =
209 cvt_kvaddr(pd->subport_rcvhdr_base);
210 ipath_cdbg(PROC, "port %u flags %x %llx %llx %llx\n",
211 kinfo->spi_port, kinfo->spi_runtime_flags,
212 (unsigned long long) kinfo->spi_subport_uregbase,
213 (unsigned long long) kinfo->spi_subport_rcvegrbuf,
214 (unsigned long long) kinfo->spi_subport_rcvhdr_base);
196 } 215 }
197 216
198 kinfo->spi_pioindex = (kinfo->spi_piobufbase - dd->ipath_piobufbase) / 217 kinfo->spi_pioindex = (kinfo->spi_piobufbase - dd->ipath_piobufbase) /
@@ -209,20 +228,10 @@ static int ipath_get_base_info(struct file *fp,
209 228
210 if (master) { 229 if (master) {
211 kinfo->spi_runtime_flags |= IPATH_RUNTIME_MASTER; 230 kinfo->spi_runtime_flags |= IPATH_RUNTIME_MASTER;
212 kinfo->spi_subport_uregbase =
213 cvt_kvaddr(pd->subport_uregbase);
214 kinfo->spi_subport_rcvegrbuf =
215 cvt_kvaddr(pd->subport_rcvegrbuf);
216 kinfo->spi_subport_rcvhdr_base =
217 cvt_kvaddr(pd->subport_rcvhdr_base);
218 ipath_cdbg(PROC, "port %u flags %x %llx %llx %llx\n",
219 kinfo->spi_port, kinfo->spi_runtime_flags,
220 (unsigned long long) kinfo->spi_subport_uregbase,
221 (unsigned long long) kinfo->spi_subport_rcvegrbuf,
222 (unsigned long long) kinfo->spi_subport_rcvhdr_base);
223 } 231 }
224 232
225 if (copy_to_user(ubase, kinfo, sizeof(*kinfo))) 233 sz = (ubase_size < sizeof(*kinfo)) ? ubase_size : sizeof(*kinfo);
234 if (copy_to_user(ubase, kinfo, sz))
226 ret = -EFAULT; 235 ret = -EFAULT;
227 236
228bail: 237bail:
@@ -1152,50 +1161,47 @@ static int mmap_kvaddr(struct vm_area_struct *vma, u64 pgaddr,
1152 size = pd->port_rcvegrbuf_chunks * pd->port_rcvegrbuf_size; 1161 size = pd->port_rcvegrbuf_chunks * pd->port_rcvegrbuf_size;
1153 1162
1154 /* 1163 /*
1155 * Master has all the slave uregbase, rcvhdrq, and 1164 * Each process has all the subport uregbase, rcvhdrq, and
1156 * rcvegrbufs mmapped. 1165 * rcvegrbufs mmapped - as an array for all the processes,
1166 * and also separately for this process.
1157 */ 1167 */
1158 if (subport == 0) { 1168 if (pgaddr == cvt_kvaddr(pd->subport_uregbase)) {
1159 unsigned num_slaves = pd->port_subport_cnt - 1; 1169 addr = pd->subport_uregbase;
1160 1170 size = PAGE_SIZE * pd->port_subport_cnt;
1161 if (pgaddr == cvt_kvaddr(pd->subport_uregbase)) { 1171 } else if (pgaddr == cvt_kvaddr(pd->subport_rcvhdr_base)) {
1162 addr = pd->subport_uregbase; 1172 addr = pd->subport_rcvhdr_base;
1163 size = PAGE_SIZE * num_slaves; 1173 size = pd->port_rcvhdrq_size * pd->port_subport_cnt;
1164 } else if (pgaddr == cvt_kvaddr(pd->subport_rcvhdr_base)) { 1174 } else if (pgaddr == cvt_kvaddr(pd->subport_rcvegrbuf)) {
1165 addr = pd->subport_rcvhdr_base; 1175 addr = pd->subport_rcvegrbuf;
1166 size = pd->port_rcvhdrq_size * num_slaves; 1176 size *= pd->port_subport_cnt;
1167 } else if (pgaddr == cvt_kvaddr(pd->subport_rcvegrbuf)) { 1177 } else if (pgaddr == cvt_kvaddr(pd->subport_uregbase +
1168 addr = pd->subport_rcvegrbuf; 1178 PAGE_SIZE * subport)) {
1169 size *= num_slaves; 1179 addr = pd->subport_uregbase + PAGE_SIZE * subport;
1170 } else 1180 size = PAGE_SIZE;
1171 goto bail; 1181 } else if (pgaddr == cvt_kvaddr(pd->subport_rcvhdr_base +
1172 } else if (pgaddr == cvt_kvaddr(pd->subport_uregbase + 1182 pd->port_rcvhdrq_size * subport)) {
1173 PAGE_SIZE * (subport - 1))) { 1183 addr = pd->subport_rcvhdr_base +
1174 addr = pd->subport_uregbase + PAGE_SIZE * (subport - 1); 1184 pd->port_rcvhdrq_size * subport;
1175 size = PAGE_SIZE; 1185 size = pd->port_rcvhdrq_size;
1176 } else if (pgaddr == cvt_kvaddr(pd->subport_rcvhdr_base + 1186 } else if (pgaddr == cvt_kvaddr(pd->subport_rcvegrbuf +
1177 pd->port_rcvhdrq_size * (subport - 1))) { 1187 size * subport)) {
1178 addr = pd->subport_rcvhdr_base + 1188 addr = pd->subport_rcvegrbuf + size * subport;
1179 pd->port_rcvhdrq_size * (subport - 1); 1189 /* rcvegrbufs are read-only on the slave */
1180 size = pd->port_rcvhdrq_size; 1190 if (vma->vm_flags & VM_WRITE) {
1181 } else if (pgaddr == cvt_kvaddr(pd->subport_rcvegrbuf + 1191 dev_info(&dd->pcidev->dev,
1182 size * (subport - 1))) { 1192 "Can't map eager buffers as "
1183 addr = pd->subport_rcvegrbuf + size * (subport - 1); 1193 "writable (flags=%lx)\n", vma->vm_flags);
1184 /* rcvegrbufs are read-only on the slave */ 1194 ret = -EPERM;
1185 if (vma->vm_flags & VM_WRITE) { 1195 goto bail;
1186 dev_info(&dd->pcidev->dev, 1196 }
1187 "Can't map eager buffers as " 1197 /*
1188 "writable (flags=%lx)\n", vma->vm_flags); 1198 * Don't allow permission to later change to writeable
1189 ret = -EPERM; 1199 * with mprotect.
1190 goto bail; 1200 */
1191 } 1201 vma->vm_flags &= ~VM_MAYWRITE;
1192 /* 1202 } else {
1193 * Don't allow permission to later change to writeable
1194 * with mprotect.
1195 */
1196 vma->vm_flags &= ~VM_MAYWRITE;
1197 } else
1198 goto bail; 1203 goto bail;
1204 }
1199 len = vma->vm_end - vma->vm_start; 1205 len = vma->vm_end - vma->vm_start;
1200 if (len > size) { 1206 if (len > size) {
1201 ipath_cdbg(MM, "FAIL: reqlen %lx > %zx\n", len, size); 1207 ipath_cdbg(MM, "FAIL: reqlen %lx > %zx\n", len, size);
@@ -1273,14 +1279,13 @@ static int ipath_mmap(struct file *fp, struct vm_area_struct *vma)
1273 goto bail; 1279 goto bail;
1274 } 1280 }
1275 1281
1282 ureg = dd->ipath_uregbase + dd->ipath_palign * pd->port_port;
1276 if (!pd->port_subport_cnt) { 1283 if (!pd->port_subport_cnt) {
1277 /* port is not shared */ 1284 /* port is not shared */
1278 ureg = dd->ipath_uregbase + dd->ipath_palign * pd->port_port;
1279 piocnt = dd->ipath_pbufsport; 1285 piocnt = dd->ipath_pbufsport;
1280 piobufs = pd->port_piobufs; 1286 piobufs = pd->port_piobufs;
1281 } else if (!subport_fp(fp)) { 1287 } else if (!subport_fp(fp)) {
1282 /* caller is the master */ 1288 /* caller is the master */
1283 ureg = dd->ipath_uregbase + dd->ipath_palign * pd->port_port;
1284 piocnt = (dd->ipath_pbufsport / pd->port_subport_cnt) + 1289 piocnt = (dd->ipath_pbufsport / pd->port_subport_cnt) +
1285 (dd->ipath_pbufsport % pd->port_subport_cnt); 1290 (dd->ipath_pbufsport % pd->port_subport_cnt);
1286 piobufs = pd->port_piobufs + 1291 piobufs = pd->port_piobufs +
@@ -1289,7 +1294,6 @@ static int ipath_mmap(struct file *fp, struct vm_area_struct *vma)
1289 unsigned slave = subport_fp(fp) - 1; 1294 unsigned slave = subport_fp(fp) - 1;
1290 1295
1291 /* caller is a slave */ 1296 /* caller is a slave */
1292 ureg = 0;
1293 piocnt = dd->ipath_pbufsport / pd->port_subport_cnt; 1297 piocnt = dd->ipath_pbufsport / pd->port_subport_cnt;
1294 piobufs = pd->port_piobufs + dd->ipath_palign * piocnt * slave; 1298 piobufs = pd->port_piobufs + dd->ipath_palign * piocnt * slave;
1295 } 1299 }
@@ -1303,9 +1307,6 @@ static int ipath_mmap(struct file *fp, struct vm_area_struct *vma)
1303 ret = ipath_mmap_mem(vma, pd, PAGE_SIZE, 0, 1307 ret = ipath_mmap_mem(vma, pd, PAGE_SIZE, 0,
1304 (void *) dd->ipath_pioavailregs_dma, 1308 (void *) dd->ipath_pioavailregs_dma,
1305 "pioavail registers"); 1309 "pioavail registers");
1306 else if (subport_fp(fp))
1307 /* Subports don't mmap the physical receive buffers */
1308 ret = -EINVAL;
1309 else if (pgaddr == pd->port_rcvegr_phys) 1310 else if (pgaddr == pd->port_rcvegr_phys)
1310 ret = mmap_rcvegrbufs(vma, pd); 1311 ret = mmap_rcvegrbufs(vma, pd);
1311 else if (pgaddr == (u64) pd->port_rcvhdrq_phys) 1312 else if (pgaddr == (u64) pd->port_rcvhdrq_phys)
@@ -1403,32 +1404,41 @@ static int init_subports(struct ipath_devdata *dd,
1403 const struct ipath_user_info *uinfo) 1404 const struct ipath_user_info *uinfo)
1404{ 1405{
1405 int ret = 0; 1406 int ret = 0;
1406 unsigned num_slaves; 1407 unsigned num_subports;
1407 size_t size; 1408 size_t size;
1408 1409
1409 /* Old user binaries don't know about subports */
1410 if ((uinfo->spu_userversion & 0xffff) != IPATH_USER_SWMINOR)
1411 goto bail;
1412 /* 1410 /*
1413 * If the user is requesting zero or one port, 1411 * If the user is requesting zero or one port,
1414 * skip the subport allocation. 1412 * skip the subport allocation.
1415 */ 1413 */
1416 if (uinfo->spu_subport_cnt <= 1) 1414 if (uinfo->spu_subport_cnt <= 1)
1417 goto bail; 1415 goto bail;
1416
1417 /* Old user binaries don't know about new subport implementation */
1418 if ((uinfo->spu_userversion & 0xffff) != IPATH_USER_SWMINOR) {
1419 dev_info(&dd->pcidev->dev,
1420 "Mismatched user minor version (%d) and driver "
1421 "minor version (%d) while port sharing. Ensure "
1422 "that driver and library are from the same "
1423 "release.\n",
1424 (int) (uinfo->spu_userversion & 0xffff),
1425 IPATH_USER_SWMINOR);
1426 goto bail;
1427 }
1418 if (uinfo->spu_subport_cnt > INFINIPATH_MAX_SUBPORT) { 1428 if (uinfo->spu_subport_cnt > INFINIPATH_MAX_SUBPORT) {
1419 ret = -EINVAL; 1429 ret = -EINVAL;
1420 goto bail; 1430 goto bail;
1421 } 1431 }
1422 1432
1423 num_slaves = uinfo->spu_subport_cnt - 1; 1433 num_subports = uinfo->spu_subport_cnt;
1424 pd->subport_uregbase = vmalloc(PAGE_SIZE * num_slaves); 1434 pd->subport_uregbase = vmalloc(PAGE_SIZE * num_subports);
1425 if (!pd->subport_uregbase) { 1435 if (!pd->subport_uregbase) {
1426 ret = -ENOMEM; 1436 ret = -ENOMEM;
1427 goto bail; 1437 goto bail;
1428 } 1438 }
1429 /* Note: pd->port_rcvhdrq_size isn't initialized yet. */ 1439 /* Note: pd->port_rcvhdrq_size isn't initialized yet. */
1430 size = ALIGN(dd->ipath_rcvhdrcnt * dd->ipath_rcvhdrentsize * 1440 size = ALIGN(dd->ipath_rcvhdrcnt * dd->ipath_rcvhdrentsize *
1431 sizeof(u32), PAGE_SIZE) * num_slaves; 1441 sizeof(u32), PAGE_SIZE) * num_subports;
1432 pd->subport_rcvhdr_base = vmalloc(size); 1442 pd->subport_rcvhdr_base = vmalloc(size);
1433 if (!pd->subport_rcvhdr_base) { 1443 if (!pd->subport_rcvhdr_base) {
1434 ret = -ENOMEM; 1444 ret = -ENOMEM;
@@ -1437,7 +1447,7 @@ static int init_subports(struct ipath_devdata *dd,
1437 1447
1438 pd->subport_rcvegrbuf = vmalloc(pd->port_rcvegrbuf_chunks * 1448 pd->subport_rcvegrbuf = vmalloc(pd->port_rcvegrbuf_chunks *
1439 pd->port_rcvegrbuf_size * 1449 pd->port_rcvegrbuf_size *
1440 num_slaves); 1450 num_subports);
1441 if (!pd->subport_rcvegrbuf) { 1451 if (!pd->subport_rcvegrbuf) {
1442 ret = -ENOMEM; 1452 ret = -ENOMEM;
1443 goto bail_rhdr; 1453 goto bail_rhdr;
@@ -1447,6 +1457,11 @@ static int init_subports(struct ipath_devdata *dd,
1447 pd->port_subport_id = uinfo->spu_subport_id; 1457 pd->port_subport_id = uinfo->spu_subport_id;
1448 pd->active_slaves = 1; 1458 pd->active_slaves = 1;
1449 set_bit(IPATH_PORT_MASTER_UNINIT, &pd->port_flag); 1459 set_bit(IPATH_PORT_MASTER_UNINIT, &pd->port_flag);
1460 memset(pd->subport_uregbase, 0, PAGE_SIZE * num_subports);
1461 memset(pd->subport_rcvhdr_base, 0, size);
1462 memset(pd->subport_rcvegrbuf, 0, pd->port_rcvegrbuf_chunks *
1463 pd->port_rcvegrbuf_size *
1464 num_subports);
1450 goto bail; 1465 goto bail;
1451 1466
1452bail_rhdr: 1467bail_rhdr:
@@ -1588,7 +1603,7 @@ static int find_best_unit(struct file *fp,
1588 if (curcpu != -1) { 1603 if (curcpu != -1) {
1589 if (npresent) { 1604 if (npresent) {
1590 prefunit = curcpu / (ncpus / npresent); 1605 prefunit = curcpu / (ncpus / npresent);
1591 ipath_dbg("%s[%u] %d chips, %d cpus, " 1606 ipath_cdbg(PROC,"%s[%u] %d chips, %d cpus, "
1592 "%d cpus/chip, select unit %d\n", 1607 "%d cpus/chip, select unit %d\n",
1593 current->comm, current->pid, 1608 current->comm, current->pid,
1594 npresent, ncpus, ncpus / npresent, 1609 npresent, ncpus, ncpus / npresent,
@@ -2086,7 +2101,7 @@ static ssize_t ipath_write(struct file *fp, const char __user *data,
2086 dest = &cmd.cmd.part_key; 2101 dest = &cmd.cmd.part_key;
2087 src = &ucmd->cmd.part_key; 2102 src = &ucmd->cmd.part_key;
2088 break; 2103 break;
2089 case IPATH_CMD_SLAVE_INFO: 2104 case __IPATH_CMD_SLAVE_INFO:
2090 copy = sizeof(cmd.cmd.slave_mask_addr); 2105 copy = sizeof(cmd.cmd.slave_mask_addr);
2091 dest = &cmd.cmd.slave_mask_addr; 2106 dest = &cmd.cmd.slave_mask_addr;
2092 src = &ucmd->cmd.slave_mask_addr; 2107 src = &ucmd->cmd.slave_mask_addr;
@@ -2152,7 +2167,7 @@ static ssize_t ipath_write(struct file *fp, const char __user *data,
2152 case IPATH_CMD_SET_PART_KEY: 2167 case IPATH_CMD_SET_PART_KEY:
2153 ret = ipath_set_part_key(pd, cmd.cmd.part_key); 2168 ret = ipath_set_part_key(pd, cmd.cmd.part_key);
2154 break; 2169 break;
2155 case IPATH_CMD_SLAVE_INFO: 2170 case __IPATH_CMD_SLAVE_INFO:
2156 ret = ipath_get_slave_info(pd, 2171 ret = ipath_get_slave_info(pd,
2157 (void __user *) (unsigned long) 2172 (void __user *) (unsigned long)
2158 cmd.cmd.slave_mask_addr); 2173 cmd.cmd.slave_mask_addr);