1aa0a1e58SJeff Roberson /* 2aa0a1e58SJeff Roberson * Copyright (c) 2005 Topspin Communications. All rights reserved. 3aa0a1e58SJeff Roberson * 4aa0a1e58SJeff Roberson * This software is available to you under a choice of one of two 5aa0a1e58SJeff Roberson * licenses. You may choose to be licensed under the terms of the GNU 6aa0a1e58SJeff Roberson * General Public License (GPL) Version 2, available from the file 7aa0a1e58SJeff Roberson * COPYING in the main directory of this source tree, or the 8aa0a1e58SJeff Roberson * OpenIB.org BSD license below: 9aa0a1e58SJeff Roberson * 10aa0a1e58SJeff Roberson * Redistribution and use in source and binary forms, with or 11aa0a1e58SJeff Roberson * without modification, are permitted provided that the following 12aa0a1e58SJeff Roberson * conditions are met: 13aa0a1e58SJeff Roberson * 14aa0a1e58SJeff Roberson * - Redistributions of source code must retain the above 15aa0a1e58SJeff Roberson * copyright notice, this list of conditions and the following 16aa0a1e58SJeff Roberson * disclaimer. 17aa0a1e58SJeff Roberson * 18aa0a1e58SJeff Roberson * - Redistributions in binary form must reproduce the above 19aa0a1e58SJeff Roberson * copyright notice, this list of conditions and the following 20aa0a1e58SJeff Roberson * disclaimer in the documentation and/or other materials 21aa0a1e58SJeff Roberson * provided with the distribution. 22aa0a1e58SJeff Roberson * 23aa0a1e58SJeff Roberson * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 24aa0a1e58SJeff Roberson * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 25aa0a1e58SJeff Roberson * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 26aa0a1e58SJeff Roberson * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 27aa0a1e58SJeff Roberson * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 28aa0a1e58SJeff Roberson * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 29aa0a1e58SJeff Roberson * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 30aa0a1e58SJeff Roberson * SOFTWARE. 31aa0a1e58SJeff Roberson */ 32*d6b92ffaSHans Petter Selasky #define _GNU_SOURCE 33aa0a1e58SJeff Roberson #include <config.h> 34aa0a1e58SJeff Roberson 35aa0a1e58SJeff Roberson #include <stdio.h> 36*d6b92ffaSHans Petter Selasky #include <infiniband/endian.h> 37*d6b92ffaSHans Petter Selasky #include <getopt.h> 38*d6b92ffaSHans Petter Selasky #include <string.h> 39aa0a1e58SJeff Roberson 40aa0a1e58SJeff Roberson #include <infiniband/verbs.h> 41aa0a1e58SJeff Roberson 42aa0a1e58SJeff Roberson static const char *event_name_str(enum ibv_event_type event_type) 43aa0a1e58SJeff Roberson { 44aa0a1e58SJeff Roberson switch (event_type) { 45aa0a1e58SJeff Roberson case IBV_EVENT_DEVICE_FATAL: 46aa0a1e58SJeff Roberson return "IBV_EVENT_DEVICE_FATAL"; 47aa0a1e58SJeff Roberson case IBV_EVENT_PORT_ACTIVE: 48aa0a1e58SJeff Roberson return "IBV_EVENT_PORT_ACTIVE"; 49aa0a1e58SJeff Roberson case IBV_EVENT_PORT_ERR: 50aa0a1e58SJeff Roberson return "IBV_EVENT_PORT_ERR"; 51aa0a1e58SJeff Roberson case IBV_EVENT_LID_CHANGE: 52aa0a1e58SJeff Roberson return "IBV_EVENT_LID_CHANGE"; 53aa0a1e58SJeff Roberson case IBV_EVENT_PKEY_CHANGE: 54aa0a1e58SJeff Roberson return "IBV_EVENT_PKEY_CHANGE"; 55aa0a1e58SJeff Roberson case IBV_EVENT_SM_CHANGE: 56aa0a1e58SJeff Roberson return "IBV_EVENT_SM_CHANGE"; 57aa0a1e58SJeff Roberson case IBV_EVENT_CLIENT_REREGISTER: 58aa0a1e58SJeff Roberson return "IBV_EVENT_CLIENT_REREGISTER"; 59aa0a1e58SJeff Roberson case IBV_EVENT_GID_CHANGE: 60aa0a1e58SJeff Roberson return "IBV_EVENT_GID_CHANGE"; 61aa0a1e58SJeff Roberson 62aa0a1e58SJeff Roberson case IBV_EVENT_CQ_ERR: 63aa0a1e58SJeff Roberson case IBV_EVENT_QP_FATAL: 64aa0a1e58SJeff Roberson case IBV_EVENT_QP_REQ_ERR: 65aa0a1e58SJeff Roberson case IBV_EVENT_QP_ACCESS_ERR: 66aa0a1e58SJeff Roberson case IBV_EVENT_COMM_EST: 67aa0a1e58SJeff Roberson case IBV_EVENT_SQ_DRAINED: 68aa0a1e58SJeff Roberson case IBV_EVENT_PATH_MIG: 69aa0a1e58SJeff Roberson case IBV_EVENT_PATH_MIG_ERR: 70aa0a1e58SJeff Roberson case IBV_EVENT_SRQ_ERR: 71aa0a1e58SJeff Roberson case IBV_EVENT_SRQ_LIMIT_REACHED: 72aa0a1e58SJeff Roberson case IBV_EVENT_QP_LAST_WQE_REACHED: 73aa0a1e58SJeff Roberson default: 74aa0a1e58SJeff Roberson return "unexpected"; 75aa0a1e58SJeff Roberson } 76aa0a1e58SJeff Roberson } 77aa0a1e58SJeff Roberson 78*d6b92ffaSHans Petter Selasky static void usage(const char *argv0) 79*d6b92ffaSHans Petter Selasky { 80*d6b92ffaSHans Petter Selasky printf("Usage:\n"); 81*d6b92ffaSHans Petter Selasky printf(" %s start an asyncwatch process\n", argv0); 82*d6b92ffaSHans Petter Selasky printf("\n"); 83*d6b92ffaSHans Petter Selasky printf("Options:\n"); 84*d6b92ffaSHans Petter Selasky printf(" -d, --ib-dev=<dev> use IB device <dev> (default first device found)\n"); 85*d6b92ffaSHans Petter Selasky printf(" -h, --help print a help text and exit\n"); 86*d6b92ffaSHans Petter Selasky } 87*d6b92ffaSHans Petter Selasky 88aa0a1e58SJeff Roberson int main(int argc, char *argv[]) 89aa0a1e58SJeff Roberson { 90aa0a1e58SJeff Roberson struct ibv_device **dev_list; 91aa0a1e58SJeff Roberson struct ibv_context *context; 92aa0a1e58SJeff Roberson struct ibv_async_event event; 93*d6b92ffaSHans Petter Selasky char *ib_devname = NULL; 94*d6b92ffaSHans Petter Selasky int i = 0; 95aa0a1e58SJeff Roberson 96aa0a1e58SJeff Roberson /* Force line-buffering in case stdout is redirected */ 97aa0a1e58SJeff Roberson setvbuf(stdout, NULL, _IOLBF, 0); 98aa0a1e58SJeff Roberson 99*d6b92ffaSHans Petter Selasky while (1) { 100*d6b92ffaSHans Petter Selasky int ret = 1; 101*d6b92ffaSHans Petter Selasky int c; 102*d6b92ffaSHans Petter Selasky static struct option long_options[] = { 103*d6b92ffaSHans Petter Selasky { .name = "ib-dev", .has_arg = 1, .val = 'd' }, 104*d6b92ffaSHans Petter Selasky { .name = "help", .has_arg = 0, .val = 'h' }, 105*d6b92ffaSHans Petter Selasky {} 106*d6b92ffaSHans Petter Selasky }; 107*d6b92ffaSHans Petter Selasky 108*d6b92ffaSHans Petter Selasky c = getopt_long(argc, argv, "d:h", long_options, NULL); 109*d6b92ffaSHans Petter Selasky if (c == -1) 110*d6b92ffaSHans Petter Selasky break; 111*d6b92ffaSHans Petter Selasky switch (c) { 112*d6b92ffaSHans Petter Selasky case 'd': 113*d6b92ffaSHans Petter Selasky ib_devname = strdupa(optarg); 114*d6b92ffaSHans Petter Selasky break; 115*d6b92ffaSHans Petter Selasky case 'h': 116*d6b92ffaSHans Petter Selasky ret = 0; 117*d6b92ffaSHans Petter Selasky SWITCH_FALLTHROUGH; 118*d6b92ffaSHans Petter Selasky default: 119*d6b92ffaSHans Petter Selasky usage(argv[0]); 120*d6b92ffaSHans Petter Selasky return ret; 121*d6b92ffaSHans Petter Selasky } 122*d6b92ffaSHans Petter Selasky } 123aa0a1e58SJeff Roberson dev_list = ibv_get_device_list(NULL); 124aa0a1e58SJeff Roberson if (!dev_list) { 125aa0a1e58SJeff Roberson perror("Failed to get IB devices list"); 126aa0a1e58SJeff Roberson return 1; 127aa0a1e58SJeff Roberson } 128*d6b92ffaSHans Petter Selasky if (ib_devname) { 129*d6b92ffaSHans Petter Selasky for (; dev_list[i]; ++i) { 130*d6b92ffaSHans Petter Selasky if (!strcmp(ibv_get_device_name(dev_list[i]), ib_devname)) 131*d6b92ffaSHans Petter Selasky break; 132*d6b92ffaSHans Petter Selasky } 133*d6b92ffaSHans Petter Selasky } 134aa0a1e58SJeff Roberson 135*d6b92ffaSHans Petter Selasky if (!dev_list[i]) { 136*d6b92ffaSHans Petter Selasky fprintf(stderr, "IB device %s not found\n", 137*d6b92ffaSHans Petter Selasky ib_devname ? ib_devname : ""); 138aa0a1e58SJeff Roberson return 1; 139aa0a1e58SJeff Roberson } 140aa0a1e58SJeff Roberson 141*d6b92ffaSHans Petter Selasky context = ibv_open_device(dev_list[i]); 142aa0a1e58SJeff Roberson if (!context) { 143aa0a1e58SJeff Roberson fprintf(stderr, "Couldn't get context for %s\n", 144*d6b92ffaSHans Petter Selasky ibv_get_device_name(dev_list[i])); 145aa0a1e58SJeff Roberson return 1; 146aa0a1e58SJeff Roberson } 147aa0a1e58SJeff Roberson 148aa0a1e58SJeff Roberson printf("%s: async event FD %d\n", 149*d6b92ffaSHans Petter Selasky ibv_get_device_name(dev_list[i]), context->async_fd); 150aa0a1e58SJeff Roberson 151aa0a1e58SJeff Roberson while (1) { 152aa0a1e58SJeff Roberson if (ibv_get_async_event(context, &event)) 153aa0a1e58SJeff Roberson return 1; 154aa0a1e58SJeff Roberson 155aa0a1e58SJeff Roberson printf(" event_type %s (%d), port %d\n", 156aa0a1e58SJeff Roberson event_name_str(event.event_type), 157aa0a1e58SJeff Roberson event.event_type, event.element.port_num); 158aa0a1e58SJeff Roberson 159aa0a1e58SJeff Roberson ibv_ack_async_event(&event); 160aa0a1e58SJeff Roberson } 161aa0a1e58SJeff Roberson 162aa0a1e58SJeff Roberson return 0; 163aa0a1e58SJeff Roberson } 164