-/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
- *
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+/*
+ * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
*
* This file is part of Portals, http://www.sf.net/projects/lustre/
*
*
*/
-#include <stdio.h>
-#include <sys/types.h>
-#ifdef HAVE_NETDB_H
-#include <netdb.h>
-#endif
-#include <sys/socket.h>
-#ifdef HAVE_NETINET_TCP_H
-#include <netinet/tcp.h>
-#endif
-#include <stdlib.h>
-#include <string.h>
-#include <fcntl.h>
-#ifdef HAVE_SYS_IOCTL_H
-#include <sys/ioctl.h>
-#endif
-#ifndef _IOWR
-#include "ioctl.h"
-#endif
-#include <errno.h>
-#include <unistd.h>
-#include <time.h>
-#include <stdarg.h>
-#ifdef HAVE_ENDIAN_H
-#include <endian.h>
-#endif
-
#include <libcfs/libcfsutil.h>
#include <lnet/api-support.h>
#include <lnet/lnetctl.h>
}
char *
-ptl_ipaddr_2_str (__u32 ipaddr, char *str, int lookup)
+ptl_ipaddr_2_str(__u32 ipaddr, char *str, size_t strsize, int lookup)
{
#ifdef HAVE_GETHOSTBYNAME
__u32 net_ip;
net_ip = htonl (ipaddr);
he = gethostbyaddr (&net_ip, sizeof (net_ip), AF_INET);
if (he != NULL) {
- strcpy(str, he->h_name);
+ strncpy(str, he->h_name, strsize - 1);
+ str[strsize - 1] = '\0';
return (str);
}
}
return (0);
}
+int
+lnet_parse_nid(char *nid_str, lnet_process_id_t *id_ptr)
+{
+ id_ptr->pid = LNET_PID_ANY;
+ id_ptr->nid = libcfs_str2nid(nid_str);
+ if (id_ptr->nid == LNET_NID_ANY) {
+ fprintf (stderr, "Can't parse nid \"%s\"\n", nid_str);
+ return -1;
+ }
+
+ return 0;
+}
+
int g_net_is_set (char *cmd)
{
if (g_net_set)
return -1;
}
+ if (LNET_NETTYP(net) == CIBLND ||
+ LNET_NETTYP(net) == OPENIBLND ||
+ LNET_NETTYP(net) == IIBLND ||
+ LNET_NETTYP(net) == VIBLND) {
+ fprintf(stderr, "Net %s obsoleted\n", libcfs_lnd2str(net));
+ return -1;
+ }
+
g_net_set = 1;
g_net = net;
return 0;
jt_ptl_print_interfaces (int argc, char **argv)
{
struct libcfs_ioctl_data data;
- char buffer[3][64];
+ char buffer[3][HOST_NAME_MAX + 1];
int index;
int rc;
break;
printf ("%s: (%s/%s) npeer %d nroute %d\n",
- ptl_ipaddr_2_str(data.ioc_u32[0], buffer[2], 1),
- ptl_ipaddr_2_str(data.ioc_u32[0], buffer[0], 0),
- ptl_ipaddr_2_str(data.ioc_u32[1], buffer[1], 0),
+ ptl_ipaddr_2_str(data.ioc_u32[0], buffer[2],
+ sizeof(buffer[2]), 1),
+ ptl_ipaddr_2_str(data.ioc_u32[0], buffer[0],
+ sizeof(buffer[0]), 0),
+ ptl_ipaddr_2_str(data.ioc_u32[1], buffer[1],
+ sizeof(buffer[1]), 0),
data.ioc_u32[2], data.ioc_u32[3]);
}
{
struct libcfs_ioctl_data data;
lnet_process_id_t id;
- char buffer[2][64];
+ char buffer[2][HOST_NAME_MAX + 1];
int index;
int rc;
if (!g_net_is_compatible (argv[0], SOCKLND, RALND, PTLLND, MXLND,
- OPENIBLND, CIBLND, IIBLND, VIBLND, O2IBLND, 0))
+ O2IBLND, GNILND, 0))
return -1;
for (index = 0;;index++) {
printf ("%-20s [%d]%s->%s:%d #%d\n",
libcfs_id2str(id),
data.ioc_count, /* persistence */
- ptl_ipaddr_2_str (data.ioc_u32[2], buffer[0], 1), /* my ip */
- ptl_ipaddr_2_str (data.ioc_u32[0], buffer[1], 1), /* peer ip */
+ /* my ip */
+ ptl_ipaddr_2_str(data.ioc_u32[2], buffer[0],
+ sizeof(buffer[0]), 1),
+ /* peer ip */
+ ptl_ipaddr_2_str(data.ioc_u32[0], buffer[1],
+ sizeof(buffer[1]), 1),
data.ioc_u32[1], /* peer port */
data.ioc_u32[3]); /* conn_count */
} else if (g_net_is_compatible(NULL, PTLLND, 0)) {
data.ioc_u32[5] & 0xffff, /* nactiveq */
data.ioc_u32[6] >> 16, /* credits */
data.ioc_u32[6] & 0xffff); /* outstanding_credits */
- } else if (g_net_is_compatible(NULL, RALND, OPENIBLND, CIBLND, VIBLND, 0)) {
+ } else if (g_net_is_compatible(NULL, RALND, 0)) {
printf ("%-20s [%d]@%s:%d\n",
libcfs_nid2str(data.ioc_nid), /* peer nid */
data.ioc_count, /* peer persistence */
- ptl_ipaddr_2_str (data.ioc_u32[0], buffer[1], 1), /* peer ip */
+ /* peer ip */
+ ptl_ipaddr_2_str(data.ioc_u32[0], buffer[1],
+ sizeof(buffer[1]), 1),
data.ioc_u32[1]); /* peer port */
+ } else if (g_net_is_compatible(NULL, GNILND, 0)) {
+ int disconn = data.ioc_flags >> 16;
+ char *state;
+
+ if (disconn)
+ state = "D";
+ else
+ state = data.ioc_flags & 0xffff ? "C" : "U";
+
+ printf ("%-20s (%d) %s [%d] "LPU64" "
+ "sq %d/%d tx %d/%d/%d\n",
+ libcfs_nid2str(data.ioc_nid), /* peer nid */
+ data.ioc_net, /* gemini device id */
+ state, /* peer is Connecting, Up, or Down */
+ data.ioc_count, /* peer refcount */
+ data.ioc_u64[0], /* peerstamp */
+ data.ioc_u32[2], data.ioc_u32[3], /* tx and rx seq */
+ /* fmaq, nfma, nrdma */
+ data.ioc_u32[0], data.ioc_u32[1], data.ioc_u32[4]
+ );
} else {
printf ("%-20s [%d]\n",
libcfs_nid2str(data.ioc_nid), data.ioc_count);
int port = 0;
int rc;
- if (!g_net_is_compatible (argv[0], SOCKLND, RALND,
- OPENIBLND, CIBLND, IIBLND, VIBLND, 0))
+ if (!g_net_is_compatible (argv[0], SOCKLND, RALND,
+ GNILND, 0))
return -1;
- if (g_net_is_compatible(NULL, SOCKLND, OPENIBLND, CIBLND, RALND, 0)) {
- if (argc != 4) {
- fprintf (stderr, "usage(tcp,openib,cib,ra): %s nid ipaddr port\n",
- argv[0]);
- return 0;
- }
- } else if (g_net_is_compatible(NULL, VIBLND, 0)) {
- if (argc != 3) {
- fprintf (stderr, "usage(vib): %s nid ipaddr\n",
- argv[0]);
- return 0;
- }
- } else if (argc != 2) {
- fprintf (stderr, "usage(iib): %s nid\n", argv[0]);
+ if (argc != 4) {
+ fprintf (stderr, "usage(tcp,ra,gni): %s nid ipaddr port\n",
+ argv[0]);
return 0;
}
return -1;
}
- if (g_net_is_compatible (NULL, SOCKLND, OPENIBLND, CIBLND, VIBLND, RALND, 0) &&
- lnet_parse_ipaddr (&ip, argv[2]) != 0) {
+ if (lnet_parse_ipaddr (&ip, argv[2]) != 0) {
fprintf (stderr, "Can't parse ip addr: %s\n", argv[2]);
return -1;
}
- if (g_net_is_compatible (NULL, SOCKLND, OPENIBLND, CIBLND, RALND, 0) &&
- lnet_parse_port (&port, argv[3]) != 0) {
+ if (lnet_parse_port (&port, argv[3]) != 0) {
fprintf (stderr, "Can't parse port: %s\n", argv[3]);
return -1;
}
int rc;
if (!g_net_is_compatible (argv[0], SOCKLND, RALND, MXLND, PTLLND,
- OPENIBLND, CIBLND, IIBLND, VIBLND, O2IBLND, 0))
+ O2IBLND, GNILND, 0))
return -1;
if (g_net_is_compatible(NULL, SOCKLND, 0)) {
{
struct libcfs_ioctl_data data;
lnet_process_id_t id;
- char buffer[2][64];
+ char buffer[2][HOST_NAME_MAX + 1];
int index;
int rc;
- if (!g_net_is_compatible (argv[0], SOCKLND, RALND, MXLND,
- OPENIBLND, CIBLND, IIBLND, VIBLND, O2IBLND, 0))
+ if (!g_net_is_compatible (argv[0], SOCKLND, RALND, MXLND, O2IBLND,
+ GNILND, 0))
return -1;
for (index = 0; ; index++) {
(data.ioc_u32[3] == SOCKLND_CONN_BULK_IN) ? "I" :
(data.ioc_u32[3] == SOCKLND_CONN_BULK_OUT) ? "O" : "?",
data.ioc_u32[4], /* scheduler */
- ptl_ipaddr_2_str (data.ioc_u32[2], buffer[0], 1), /* local IP addr */
- ptl_ipaddr_2_str (data.ioc_u32[0], buffer[1], 1), /* remote IP addr */
+ /* local IP addr */
+ ptl_ipaddr_2_str(data.ioc_u32[2], buffer[0],
+ sizeof(buffer[0]), 1),
+ /* remote IP addr */
+ ptl_ipaddr_2_str(data.ioc_u32[0], buffer[1],
+ sizeof(buffer[1]), 1),
data.ioc_u32[1], /* remote port */
data.ioc_count, /* tx buffer size */
data.ioc_u32[5], /* rx buffer size */
printf ("%-20s [%d]\n",
libcfs_nid2str(data.ioc_nid),
data.ioc_u32[0] /* device id */);
+ } else if (g_net_is_compatible (NULL, O2IBLND, 0)) {
+ printf ("%s mtu %d\n",
+ libcfs_nid2str(data.ioc_nid),
+ data.ioc_u32[0]); /* path MTU */
+ } else if (g_net_is_compatible (NULL, GNILND, 0)) {
+ printf ("%-20s [%d]\n",
+ libcfs_nid2str(data.ioc_nid),
+ data.ioc_u32[0] /* device id */);
} else {
printf ("%s\n", libcfs_nid2str(data.ioc_nid));
}
return 0;
}
- if (!g_net_is_compatible (NULL, SOCKLND, RALND, MXLND,
- OPENIBLND, CIBLND, IIBLND, VIBLND, O2IBLND, 0))
+ if (!g_net_is_compatible (NULL, SOCKLND, RALND, MXLND, O2IBLND,
+ GNILND, 0))
return 0;
if (argc >= 2 &&
return 0;
}
- if (!g_net_is_compatible (argv[0], SOCKLND, 0))
+ if (!g_net_is_compatible (argv[0], SOCKLND, GNILND, 0))
return -1;
if (argc > 1 &&
sep = strchr(argv[1], '-');
if (sep == NULL) {
- id.pid = LNET_PID_ANY;
- id.nid = libcfs_str2nid(argv[1]);
- if (id.nid == LNET_NID_ANY) {
- fprintf (stderr, "Can't parse nid \"%s\"\n", argv[1]);
+ rc = lnet_parse_nid(argv[1], &id);
+ if (rc != 0)
return -1;
- }
} else {
char *end;
else
id.pid = strtoul(argv[1], &end, 0);
- id.nid = libcfs_str2nid(sep + 1);
+ if (end != sep) { /* assuming '-' is part of hostname */
+ rc = lnet_parse_nid(argv[1], &id);
+ if (rc != 0)
+ return -1;
+ } else {
+ id.nid = libcfs_str2nid(sep + 1);
- if (end != sep ||
- id.nid == LNET_NID_ANY) {
- fprintf(stderr, "Can't parse process id \"%s\"\n", argv[1]);
- return -1;
+ if (id.nid == LNET_NID_ANY) {
+ fprintf(stderr,
+ "Can't parse process id \"%s\"\n",
+ argv[1]);
+ return -1;
+ }
}
}
}
static int
-lwt_snapshot(cycles_t *now, int *ncpu, int *totalsize,
+lwt_snapshot(cfs_cycles_t *now, int *ncpu, int *totalsize,
lwt_event_t *events, int size)
{
struct libcfs_ioctl_data data;
}
static int
-lwt_print(FILE *f, cycles_t t0, cycles_t tlast, double mhz, int cpu, lwt_event_t *e)
+lwt_print(FILE *f, cfs_cycles_t t0, cfs_cycles_t tlast, double mhz, int cpu,
+ lwt_event_t *e)
{
#ifndef __WORDSIZE
# error "__WORDSIZE not defined"
return (1000.0);
}
+#define LWT_MAX_CPUS (32)
+
int
jt_ptl_lwt(int argc, char **argv)
{
- const int lwt_max_cpus = 32;
int ncpus;
int totalspace;
int nevents_per_cpu;
lwt_event_t *events;
- lwt_event_t *cpu_event[lwt_max_cpus + 1];
- lwt_event_t *next_event[lwt_max_cpus];
- lwt_event_t *first_event[lwt_max_cpus];
+ lwt_event_t *cpu_event[LWT_MAX_CPUS + 1];
+ lwt_event_t *next_event[LWT_MAX_CPUS];
+ lwt_event_t *first_event[LWT_MAX_CPUS];
int cpu;
lwt_event_t *e;
int rc;
int i;
double mhz;
- cycles_t t0;
- cycles_t tlast;
- cycles_t tnow;
+ cfs_cycles_t t0;
+ cfs_cycles_t tlast;
+ cfs_cycles_t tnow;
struct timeval tvnow;
int printed_date = 0;
int nlines = 0;
if (lwt_snapshot(NULL, &ncpus, &totalspace, NULL, 0) != 0)
return (-1);
- if (ncpus > lwt_max_cpus) {
+ if (ncpus > LWT_MAX_CPUS) {
fprintf(stderr, "Too many cpus: %d (%d)\n",
- ncpus, lwt_max_cpus);
+ ncpus, LWT_MAX_CPUS);
return (-1);
}
if (t0 <= next_event[cpu]->lwte_when) {
/* on or after the first event */
if (!printed_date) {
- cycles_t du = (tnow - t0) / mhz;
+ cfs_cycles_t du = (tnow - t0) / mhz;
time_t then = tvnow.tv_sec - du/1000000;
if (du % 1000000 > tvnow.tv_usec)