1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2 * vim:expandtab:shiftwidth=8:tabstop=8:
4 * Copyright (c) 2003 Los Alamos National Laboratory (LANL)
6 * This file is part of Lustre, http://www.lustre.org/
8 * Lustre is free software; you can redistribute it and/or
9 * modify it under the terms of version 2 of the GNU General Public
10 * License as published by the Free Software Foundation.
12 * Lustre is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Lustre; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 gmnal_free_netbuf_pages (gmnal_netbuf_t *nb, int npages)
29 for (i = 0; i < npages; i++)
30 __free_page(nb->nb_kiov[i].kiov_page);
34 gmnal_alloc_netbuf_pages (gmnal_ni_t *gmni, gmnal_netbuf_t *nb, int npages)
41 for (i = 0; i < npages; i++) {
43 nb->nb_kiov[i].kiov_page = alloc_page(GFP_KERNEL);
44 nb->nb_kiov[i].kiov_offset = 0;
45 nb->nb_kiov[i].kiov_len = PAGE_SIZE;
47 if (nb->nb_kiov[i].kiov_page == NULL) {
48 CERROR("Can't allocate page\n");
49 gmnal_free_netbuf_pages(nb, i);
53 CDEBUG(D_NET,"[%3d] page %p, phys "LPX64", @ "LPX64"\n",
54 i, nb->nb_kiov[i].kiov_page,
55 lnet_page2phys(nb->nb_kiov[i].kiov_page),
56 gmni->gmni_netaddr_base);
58 gmrc = gm_register_memory_ex_phys(
60 lnet_page2phys(nb->nb_kiov[i].kiov_page),
62 gmni->gmni_netaddr_base);
63 CDEBUG(D_NET,"[%3d] page %p: %d\n",
64 i, nb->nb_kiov[i].kiov_page, gmrc);
66 if (gmrc != GM_SUCCESS) {
67 CERROR("Can't map page: %d(%s)\n", gmrc,
68 gmnal_gmstatus2str(gmrc));
69 gmnal_free_netbuf_pages(nb, i+1);
74 nb->nb_netaddr = gmni->gmni_netaddr_base;
76 gmni->gmni_netaddr_base += PAGE_SIZE;
83 gmnal_free_ltxbuf (gmnal_ni_t *gmni, gmnal_txbuf_t *txb)
85 int npages = gmni->gmni_large_pages;
87 LASSERT (gmni->gmni_port == NULL);
88 /* No unmapping; the port has been closed */
90 gmnal_free_netbuf_pages(&txb->txb_buf, gmni->gmni_large_pages);
91 LIBCFS_FREE(txb, offsetof(gmnal_txbuf_t, txb_buf.nb_kiov[npages]));
95 gmnal_alloc_ltxbuf (gmnal_ni_t *gmni)
97 int npages = gmni->gmni_large_pages;
98 int sz = offsetof(gmnal_txbuf_t, txb_buf.nb_kiov[npages]);
102 LIBCFS_ALLOC(txb, sz);
104 CERROR("Can't allocate large txbuffer\n");
108 rc = gmnal_alloc_netbuf_pages(gmni, &txb->txb_buf, npages);
110 LIBCFS_FREE(txb, sz);
114 list_add_tail(&txb->txb_list, &gmni->gmni_idle_ltxbs);
116 txb->txb_next = gmni->gmni_ltxbs;
117 gmni->gmni_ltxbs = txb;
123 gmnal_free_tx (gmnal_tx_t *tx)
125 LASSERT (tx->tx_gmni->gmni_port == NULL);
127 gmnal_free_netbuf_pages(&tx->tx_buf, 1);
128 LIBCFS_FREE(tx, sizeof(*tx));
132 gmnal_alloc_tx (gmnal_ni_t *gmni)
137 LIBCFS_ALLOC(tx, sizeof(*tx));
139 CERROR("Failed to allocate tx\n");
143 memset(tx, 0, sizeof(*tx));
145 rc = gmnal_alloc_netbuf_pages(gmni, &tx->tx_buf, 1);
147 LIBCFS_FREE(tx, sizeof(*tx));
153 list_add_tail(&tx->tx_list, &gmni->gmni_idle_txs);
155 tx->tx_next = gmni->gmni_txs;
162 gmnal_free_rx(gmnal_ni_t *gmni, gmnal_rx_t *rx)
164 int npages = rx->rx_islarge ? gmni->gmni_large_pages : 1;
166 LASSERT (gmni->gmni_port == NULL);
168 gmnal_free_netbuf_pages(&rx->rx_buf, npages);
169 LIBCFS_FREE(rx, offsetof(gmnal_rx_t, rx_buf.nb_kiov[npages]));
173 gmnal_alloc_rx (gmnal_ni_t *gmni, int islarge)
175 int npages = islarge ? gmni->gmni_large_pages : 1;
176 int sz = offsetof(gmnal_rx_t, rx_buf.nb_kiov[npages]);
181 LIBCFS_ALLOC(rx, sz);
183 CERROR("Failed to allocate rx\n");
187 memset(rx, 0, sizeof(*rx));
189 rc = gmnal_alloc_netbuf_pages(gmni, &rx->rx_buf, npages);
195 rx->rx_islarge = islarge;
196 rx->rx_next = gmni->gmni_rxs;
199 gmrc = gm_hash_insert(gmni->gmni_rx_hash,
200 GMNAL_NETBUF_LOCAL_NETADDR(&rx->rx_buf), rx);
201 if (gmrc != GM_SUCCESS) {
202 CERROR("Couldn't add rx to hash table: %d\n", gmrc);
210 gmnal_free_ltxbufs (gmnal_ni_t *gmni)
214 while ((txb = gmni->gmni_ltxbs) != NULL) {
215 gmni->gmni_ltxbs = txb->txb_next;
216 gmnal_free_ltxbuf(gmni, txb);
221 gmnal_alloc_ltxbufs (gmnal_ni_t *gmni)
223 int nlarge_tx_bufs = *gmnal_tunables.gm_nlarge_tx_bufs;
227 for (i = 0; i < nlarge_tx_bufs; i++) {
228 rc = gmnal_alloc_ltxbuf(gmni);
238 gmnal_free_txs(gmnal_ni_t *gmni)
242 while ((tx = gmni->gmni_txs) != NULL) {
243 gmni->gmni_txs = tx->tx_next;
249 gmnal_alloc_txs(gmnal_ni_t *gmni)
251 int ntxcred = gm_num_send_tokens(gmni->gmni_port);
252 int ntx = *gmnal_tunables.gm_ntx;
256 CDEBUG(D_NET, "ntxcred: %d\n", ntxcred);
257 gmni->gmni_tx_credits = ntxcred;
259 for (i = 0; i < ntx; i++) {
260 rc = gmnal_alloc_tx(gmni);
269 gmnal_free_rxs(gmnal_ni_t *gmni)
273 while ((rx = gmni->gmni_rxs) != NULL) {
274 gmni->gmni_rxs = rx->rx_next;
276 gmnal_free_rx(gmni, rx);
279 LASSERT (gmni->gmni_port == NULL);
281 /* GM releases all resources allocated to a port when it closes */
282 if (gmni->gmni_rx_hash != NULL)
283 gm_destroy_hash(gmni->gmni_rx_hash);
288 gmnal_alloc_rxs (gmnal_ni_t *gmni)
290 int nrxcred = gm_num_receive_tokens(gmni->gmni_port);
291 int nrx_small = *gmnal_tunables.gm_nrx_small;
292 int nrx_large = *gmnal_tunables.gm_nrx_large;
293 int nrx = nrx_large + nrx_small;
297 CDEBUG(D_NET, "nrxcred: %d(%dL+%dS)\n", nrxcred, nrx_large, nrx_small);
300 int nlarge = (nrx_large * nrxcred)/nrx;
301 int nsmall = nrxcred - nlarge;
303 CWARN("Only %d rx credits: "
304 "reducing large %d->%d, small %d->%d\n", nrxcred,
305 nrx_large, nlarge, nrx_small, nsmall);
307 *gmnal_tunables.gm_nrx_large = nrx_large = nlarge;
308 *gmnal_tunables.gm_nrx_small = nrx_small = nsmall;
309 nrx = nlarge + nsmall;
312 gmni->gmni_rx_hash = gm_create_hash(gm_hash_compare_ptrs,
313 gm_hash_hash_ptr, 0, 0, nrx, 0);
314 if (gmni->gmni_rx_hash == NULL) {
315 CERROR("Failed to create hash table\n");
319 for (i = 0; i < nrx; i++ ) {
320 rc = gmnal_alloc_rx(gmni, i < nrx_large);
329 gmnal_gmstatus2str(gm_status_t status)
331 return(gm_strerror(status));
338 case(GM_INPUT_BUFFER_TOO_SMALL):
339 return("INPUT_BUFFER_TOO_SMALL");
340 case(GM_OUTPUT_BUFFER_TOO_SMALL):
341 return("OUTPUT_BUFFER_TOO_SMALL");
346 case(GM_MEMORY_FAULT):
347 return("MEMORY_FAULT");
348 case(GM_INTERRUPTED):
349 return("INTERRUPTED");
350 case(GM_INVALID_PARAMETER):
351 return("INVALID_PARAMETER");
352 case(GM_OUT_OF_MEMORY):
353 return("OUT_OF_MEMORY");
354 case(GM_INVALID_COMMAND):
355 return("INVALID_COMMAND");
356 case(GM_PERMISSION_DENIED):
357 return("PERMISSION_DENIED");
358 case(GM_INTERNAL_ERROR):
359 return("INTERNAL_ERROR");
361 return("UNATTACHED");
362 case(GM_UNSUPPORTED_DEVICE):
363 return("UNSUPPORTED_DEVICE");
364 case(GM_SEND_TIMED_OUT):
365 return("GM_SEND_TIMEDOUT");
366 case(GM_SEND_REJECTED):
367 return("GM_SEND_REJECTED");
368 case(GM_SEND_TARGET_PORT_CLOSED):
369 return("GM_SEND_TARGET_PORT_CLOSED");
370 case(GM_SEND_TARGET_NODE_UNREACHABLE):
371 return("GM_SEND_TARGET_NODE_UNREACHABLE");
372 case(GM_SEND_DROPPED):
373 return("GM_SEND_DROPPED");
374 case(GM_SEND_PORT_CLOSED):
375 return("GM_SEND_PORT_CLOSED");
376 case(GM_NODE_ID_NOT_YET_SET):
377 return("GM_NODE_ID_NOT_YET_SET");
378 case(GM_STILL_SHUTTING_DOWN):
379 return("GM_STILL_SHUTTING_DOWN");
381 return("GM_CLONE_BUSY");
382 case(GM_NO_SUCH_DEVICE):
383 return("GM_NO_SUCH_DEVICE");
385 return("GM_ABORTED");
386 case(GM_INCOMPATIBLE_LIB_AND_DRIVER):
387 return("GM_INCOMPATIBLE_LIB_AND_DRIVER");
388 case(GM_UNTRANSLATED_SYSTEM_ERROR):
389 return("GM_UNTRANSLATED_SYSTEM_ERROR");
390 case(GM_ACCESS_DENIED):
391 return("GM_ACCESS_DENIED");
395 * These ones are in the docs but aren't in the header file
396 case(GM_DEV_NOT_FOUND):
397 return("GM_DEV_NOT_FOUND");
398 case(GM_INVALID_PORT_NUMBER):
399 return("GM_INVALID_PORT_NUMBER");
401 return("GM_US_ERROR");
402 case(GM_PAGE_TABLE_FULL):
403 return("GM_PAGE_TABLE_FULL");
404 case(GM_MINOR_OVERFLOW):
405 return("GM_MINOR_OVERFLOW");
406 case(GM_SEND_ORPHANED):
407 return("GM_SEND_ORPHANED");
408 case(GM_HARDWARE_FAULT):
409 return("GM_HARDWARE_FAULT");
410 case(GM_DATA_CORRUPTED):
411 return("GM_DATA_CORRUPTED");
413 return("GM_TIMED_OUT");
415 return("GM_USER_ERROR");
417 return("GM_NOMATCH");
418 case(GM_NOT_SUPPORTED_IN_KERNEL):
419 return("GM_NOT_SUPPORTED_IN_KERNEL");
420 case(GM_NOT_SUPPORTED_ON_ARCH):
421 return("GM_NOT_SUPPORTED_ON_ARCH");
422 case(GM_PTE_REF_CNT_OVERFLOW):
423 return("GM_PTR_REF_CNT_OVERFLOW");
424 case(GM_NO_DRIVER_SUPPORT):
425 return("GM_NO_DRIVER_SUPPORT");
426 case(GM_FIRMWARE_NOT_RUNNING):
427 return("GM_FIRMWARE_NOT_RUNNING");
428 * These ones are in the docs but aren't in the header file
432 return("UNKNOWN GM ERROR CODE");
438 gmnal_rxevent2str(gm_recv_event_t *ev)
441 event = GM_RECV_EVENT_TYPE(ev);
443 case(GM_NO_RECV_EVENT):
444 return("GM_NO_RECV_EVENT");
445 case(GM_SENDS_FAILED_EVENT):
446 return("GM_SEND_FAILED_EVENT");
447 case(GM_ALARM_EVENT):
448 return("GM_ALARM_EVENT");
450 return("GM_SENT_EVENT");
451 case(_GM_SLEEP_EVENT):
452 return("_GM_SLEEP_EVENT");
453 case(GM_RAW_RECV_EVENT):
454 return("GM_RAW_RECV_EVENT");
455 case(GM_BAD_SEND_DETECTED_EVENT):
456 return("GM_BAD_SEND_DETECTED_EVENT");
457 case(GM_SEND_TOKEN_VIOLATION_EVENT):
458 return("GM_SEND_TOKEN_VIOLATION_EVENT");
459 case(GM_RECV_TOKEN_VIOLATION_EVENT):
460 return("GM_RECV_TOKEN_VIOLATION_EVENT");
461 case(GM_BAD_RECV_TOKEN_EVENT):
462 return("GM_BAD_RECV_TOKEN_EVENT");
463 case(GM_ALARM_VIOLATION_EVENT):
464 return("GM_ALARM_VIOLATION_EVENT");
466 return("GM_RECV_EVENT");
467 case(GM_HIGH_RECV_EVENT):
468 return("GM_HIGH_RECV_EVENT");
469 case(GM_PEER_RECV_EVENT):
470 return("GM_PEER_RECV_EVENT");
471 case(GM_HIGH_PEER_RECV_EVENT):
472 return("GM_HIGH_PEER_RECV_EVENT");
473 case(GM_FAST_RECV_EVENT):
474 return("GM_FAST_RECV_EVENT");
475 case(GM_FAST_HIGH_RECV_EVENT):
476 return("GM_FAST_HIGH_RECV_EVENT");
477 case(GM_FAST_PEER_RECV_EVENT):
478 return("GM_FAST_PEER_RECV_EVENT");
479 case(GM_FAST_HIGH_PEER_RECV_EVENT):
480 return("GM_FAST_HIGH_PEER_RECV_EVENT");
481 case(GM_REJECTED_SEND_EVENT):
482 return("GM_REJECTED_SEND_EVENT");
483 case(GM_ORPHANED_SEND_EVENT):
484 return("GM_ORPHANED_SEND_EVENT");
485 case(GM_BAD_RESEND_DETECTED_EVENT):
486 return("GM_BAD_RESEND_DETETED_EVENT");
487 case(GM_DROPPED_SEND_EVENT):
488 return("GM_DROPPED_SEND_EVENT");
489 case(GM_BAD_SEND_VMA_EVENT):
490 return("GM_BAD_SEND_VMA_EVENT");
491 case(GM_BAD_RECV_VMA_EVENT):
492 return("GM_BAD_RECV_VMA_EVENT");
493 case(_GM_FLUSHED_ALARM_EVENT):
494 return("GM_FLUSHED_ALARM_EVENT");
495 case(GM_SENT_TOKENS_EVENT):
496 return("GM_SENT_TOKENS_EVENTS");
497 case(GM_IGNORE_RECV_EVENT):
498 return("GM_IGNORE_RECV_EVENT");
499 case(GM_ETHERNET_RECV_EVENT):
500 return("GM_ETHERNET_RECV_EVENT");
501 case(GM_NEW_NO_RECV_EVENT):
502 return("GM_NEW_NO_RECV_EVENT");
503 case(GM_NEW_SENDS_FAILED_EVENT):
504 return("GM_NEW_SENDS_FAILED_EVENT");
505 case(GM_NEW_ALARM_EVENT):
506 return("GM_NEW_ALARM_EVENT");
507 case(GM_NEW_SENT_EVENT):
508 return("GM_NEW_SENT_EVENT");
509 case(_GM_NEW_SLEEP_EVENT):
510 return("GM_NEW_SLEEP_EVENT");
511 case(GM_NEW_RAW_RECV_EVENT):
512 return("GM_NEW_RAW_RECV_EVENT");
513 case(GM_NEW_BAD_SEND_DETECTED_EVENT):
514 return("GM_NEW_BAD_SEND_DETECTED_EVENT");
515 case(GM_NEW_SEND_TOKEN_VIOLATION_EVENT):
516 return("GM_NEW_SEND_TOKEN_VIOLATION_EVENT");
517 case(GM_NEW_RECV_TOKEN_VIOLATION_EVENT):
518 return("GM_NEW_RECV_TOKEN_VIOLATION_EVENT");
519 case(GM_NEW_BAD_RECV_TOKEN_EVENT):
520 return("GM_NEW_BAD_RECV_TOKEN_EVENT");
521 case(GM_NEW_ALARM_VIOLATION_EVENT):
522 return("GM_NEW_ALARM_VIOLATION_EVENT");
523 case(GM_NEW_RECV_EVENT):
524 return("GM_NEW_RECV_EVENT");
525 case(GM_NEW_HIGH_RECV_EVENT):
526 return("GM_NEW_HIGH_RECV_EVENT");
527 case(GM_NEW_PEER_RECV_EVENT):
528 return("GM_NEW_PEER_RECV_EVENT");
529 case(GM_NEW_HIGH_PEER_RECV_EVENT):
530 return("GM_NEW_HIGH_PEER_RECV_EVENT");
531 case(GM_NEW_FAST_RECV_EVENT):
532 return("GM_NEW_FAST_RECV_EVENT");
533 case(GM_NEW_FAST_HIGH_RECV_EVENT):
534 return("GM_NEW_FAST_HIGH_RECV_EVENT");
535 case(GM_NEW_FAST_PEER_RECV_EVENT):
536 return("GM_NEW_FAST_PEER_RECV_EVENT");
537 case(GM_NEW_FAST_HIGH_PEER_RECV_EVENT):
538 return("GM_NEW_FAST_HIGH_PEER_RECV_EVENT");
539 case(GM_NEW_REJECTED_SEND_EVENT):
540 return("GM_NEW_REJECTED_SEND_EVENT");
541 case(GM_NEW_ORPHANED_SEND_EVENT):
542 return("GM_NEW_ORPHANED_SEND_EVENT");
543 case(_GM_NEW_PUT_NOTIFICATION_EVENT):
544 return("_GM_NEW_PUT_NOTIFICATION_EVENT");
545 case(GM_NEW_FREE_SEND_TOKEN_EVENT):
546 return("GM_NEW_FREE_SEND_TOKEN_EVENT");
547 case(GM_NEW_FREE_HIGH_SEND_TOKEN_EVENT):
548 return("GM_NEW_FREE_HIGH_SEND_TOKEN_EVENT");
549 case(GM_NEW_BAD_RESEND_DETECTED_EVENT):
550 return("GM_NEW_BAD_RESEND_DETECTED_EVENT");
551 case(GM_NEW_DROPPED_SEND_EVENT):
552 return("GM_NEW_DROPPED_SEND_EVENT");
553 case(GM_NEW_BAD_SEND_VMA_EVENT):
554 return("GM_NEW_BAD_SEND_VMA_EVENT");
555 case(GM_NEW_BAD_RECV_VMA_EVENT):
556 return("GM_NEW_BAD_RECV_VMA_EVENT");
557 case(_GM_NEW_FLUSHED_ALARM_EVENT):
558 return("GM_NEW_FLUSHED_ALARM_EVENT");
559 case(GM_NEW_SENT_TOKENS_EVENT):
560 return("GM_NEW_SENT_TOKENS_EVENT");
561 case(GM_NEW_IGNORE_RECV_EVENT):
562 return("GM_NEW_IGNORE_RECV_EVENT");
563 case(GM_NEW_ETHERNET_RECV_EVENT):
564 return("GM_NEW_ETHERNET_RECV_EVENT");
566 return("Unknown Recv event");
567 /* _GM_PUT_NOTIFICATION_EVENT */
568 /* GM_FREE_SEND_TOKEN_EVENT */
569 /* GM_FREE_HIGH_SEND_TOKEN_EVENT */
575 gmnal_yield(int delay)
577 set_current_state(TASK_INTERRUPTIBLE);
578 schedule_timeout(delay);