-/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
- *
+/*
* Copyright (C) 2009-2012 Cray, Inc.
+ *
+ * Copyright (c) 2014, Intel Corporation.
+ *
* Author: Nic Henke <nic@cray.com>, James Shimek <jshimek@cray.com>
*
* This file is part of Lustre, http://www.lustre.org.
#ifndef _GNILND_ARIES_H
#define _GNILND_ARIES_H
-/* for libcfs_ipif_query */
-#include <libcfs/libcfs.h>
+/* for lnet_ipif_query */
+#include <lnet/lib-lnet.h>
#ifndef _GNILND_HSS_OPS_H
# error "must include gnilnd_hss_ops.h first"
#endif
/* Set HW related values */
+#ifdef CONFIG_CRAY_XT
#include <aries/aries_timeouts_gpl.h>
+#else
+/* from aries_timeouts_gpl.h when building for generic kernel */
+#define TIMEOUT_SECS(x) ((uint64_t)(((x) / 1000.0) + 0.5))
+#ifndef TO_GNILND_timeout
+#define TO_GNILND_timeout (60000.000000)
+#endif /* TO_GNILND_timeout */
+#endif /* CONFIG_CRAY_XT */
#define GNILND_BASE_TIMEOUT TIMEOUT_SECS(TO_GNILND_timeout)
#define GNILND_CHECKSUM_DEFAULT 0 /* all off for Aries */
#else
#define GNILND_REVERSE_RDMA GNILND_REVERSE_GET
#define GNILND_RDMA_DLVR_OPTION GNI_DLVMODE_PERFORMANCE
+#define GNILND_SCHED_THREADS 7 /* scheduler threads */
#endif
+/* Thread-safe kgni implemented in minor ver 45, code rev 0xb9 */
+#define GNILND_KGNI_TS_MINOR_VER 0x45
+
/* plug in our functions for use on the simulator */
#if !defined(GNILND_USE_RCA)
#define kgnilnd_hw_hb() do {} while(0)
+#ifdef CONFIG_CRAY_XT
+
/* Aries Sim doesn't have hardcoded tables, so we'll hijack the nic_pe
* and decode our address and nic addr from that - the rest are just offsets */
return -EINVAL;
}
if (nid < kgnilnd_data.kgn_nid_trans_private) {
- CERROR("Request for invalid nid translation %u, minimum %Lu\n",
+ CERROR("Request for invalid nid translation %u,"
+ "minimum "LPU64"\n",
nid, kgnilnd_data.kgn_nid_trans_private);
return -ESRCH;
}
LCONSOLE_INFO("using Aries SIM IP info for RCA translation\n");
- rc = libcfs_ipif_query(if_name, &up, &ipaddr, &netmask);
+ rc = lnet_ipif_query(if_name, &up, &ipaddr, &netmask);
if (rc != 0) {
CERROR ("can't get IP interface for %s: %d\n", if_name, rc);
return rc;
}
my_nid = ((ipaddr >> 8) & 0xFF) + (ipaddr & 0xFF);
-
kgnilnd_data.kgn_nid_trans_private = my_nid - device_id;
return 0;
}
+#else /* CONFIG_CRAY_XT */
+#include <net/inet_common.h>
+#include <linux/if_arp.h>
+
+static inline int
+kgnilnd_nid_to_nicaddrs(__u32 nid, int numnic, __u32 *nicaddrs)
+{
+ int rc;
+
+#define NID_MASK ((1ULL << 18) - 1)
+ mm_segment_t fs;
+ struct arpreq req = {
+ .arp_dev = "ipogif0",
+ };
+
+ req.arp_pa.sa_family = AF_INET;
+ ((struct sockaddr_in *)&req.arp_pa)->sin_addr.s_addr = htonl(nid);
+
+ fs = get_fs();
+ set_fs(get_ds());
+
+ rc = inet_ioctl(kgnilnd_data.kgn_sock, SIOCGARP, (unsigned long)&req);
+ set_fs(fs);
+
+ if (rc < 0) {
+ CDEBUG(D_NETERROR, "inet_ioctl returned %d\n", rc);
+ return 0;
+ }
+
+ /* use the lower 18 bits of the mac address to use as a nid value */
+ *nicaddrs = *(__u32 *)&req.arp_ha.sa_data[2];
+ *nicaddrs = ntohl(*nicaddrs) & NID_MASK;
+
+ CDEBUG(D_NETTRACE, "nid %s -> nic 0x%x\n", libcfs_nid2str(nid),
+ nicaddrs[0]);
+
+ return 1;
+}
+
+static inline int
+kgnilnd_nicaddr_to_nid(__u32 nicaddr, __u32 *nid)
+{
+ int rc;
+ mm_segment_t fs;
+ struct ifreq ifr = {
+ .ifr_name = "ipogif0",
+ };
+
+ struct sockaddr_in* ipaddr = (struct sockaddr_in*)&ifr.ifr_addr;
+
+ fs = get_fs();
+ set_fs(get_ds());
+ rc = inet_ioctl(kgnilnd_data.kgn_sock, SIOCGIFADDR, (unsigned long)&ifr);
+ set_fs(fs);
+
+ if (rc < 0) {
+ CDEBUG(D_NETERROR, "inet_ioctl returned %d\n", rc);
+ return 1;
+ }
+
+ CDEBUG(D_NETTRACE, "ipaddr %08x\n", htonl(ipaddr->sin_addr.s_addr));
+
+ *nid = htonl(ipaddr->sin_addr.s_addr);
+ CDEBUG(D_NETTRACE, "nic 0x%x -> nid %s\n", nicaddr,
+ libcfs_nid2str(*nid));
+ return 0;
+}
+
+static inline int
+kgnilnd_setup_nic_translation(__u32 device_id)
+{
+ return 0;
+}
+
+#endif /* CONFIG_CRAY_XT */
+
#endif /* GNILND_USE_RCA */
#endif /* _GNILND_ARIES_H */