/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
* vim:expandtab:shiftwidth=8:tabstop=8:
*
- * api/api-ni.c
- * Network Interface code
- *
* Copyright (c) 2001-2003 Cluster File Systems, Inc.
- * Copyright (c) 2001-2002 Sandia National Laboratories
*
* This file is part of Lustre, http://www.sf.net/projects/lustre/
*
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
+#define DEBUG_SUBSYSTEM S_PORTALS
#include <portals/api-support.h>
int ptl_init;
#define NI_HANDLE_MAGIC 0xebc0de00
#define NI_HANDLE_MASK 0x000000ff
-static struct nal_t *ptl_nal_table[NAL_MAX_NR];
+static struct nal_t *ptl_nal_table[NAL_MAX_NR + 1];
#ifdef __KERNEL__
-DECLARE_MUTEX(ptl_mutex);
+struct semaphore ptl_mutex;
static void ptl_mutex_enter (void)
{
- down (&ptl_mutex);
+ mutex_down (&ptl_mutex);
}
static void ptl_mutex_exit (void)
{
- up (&ptl_mutex);
+ mutex_up (&ptl_mutex);
}
#else
static void ptl_mutex_enter (void)
* invalidated out from under her (or worse, swapped for a
* completely different interface!) */
+ LASSERT (ptl_init);
+
if (((idx ^ NI_HANDLE_MAGIC) & ~NI_HANDLE_MASK) != 0)
return NULL;
idx &= NI_HANDLE_MASK;
- if (idx >= NAL_MAX_NR ||
+ if (idx > NAL_MAX_NR ||
ptl_nal_table[idx] == NULL ||
ptl_nal_table[idx]->nal_refct == 0)
return NULL;
ptl_mutex_enter();
- if (interface < 0 || interface >= NAL_MAX_NR)
+ if (interface < 0 || interface > NAL_MAX_NR)
rc = PTL_IFACE_INVALID;
else if (ptl_nal_table[interface] != NULL)
rc = PTL_IFACE_DUP;
void ptl_unregister_nal (ptl_interface_t interface)
{
- LASSERT(interface >= 0 && interface < NAL_MAX_NR);
+ LASSERT(interface >= 0 && interface <= NAL_MAX_NR);
LASSERT(ptl_nal_table[interface] != NULL);
LASSERT(ptl_nal_table[interface]->nal_refct == 0);
ptl_mutex_exit();
}
-int ptl_ni_init(void)
+int PtlInit(int *max_interfaces)
{
+ LASSERT(!strcmp(ptl_err_str[PTL_MAX_ERRNO], "PTL_MAX_ERRNO"));
+
/* If this assertion fails, we need more bits in NI_HANDLE_MASK and
* to shift NI_HANDLE_MAGIC left appropriately */
- LASSERT (NAL_MAX_NR <= (NI_HANDLE_MASK + 1));
+ LASSERT (NAL_MAX_NR < (NI_HANDLE_MASK + 1));
+ if (max_interfaces != NULL)
+ *max_interfaces = NAL_MAX_NR + 1;
+
ptl_mutex_enter();
if (!ptl_init) {
return PTL_OK;
}
-void ptl_ni_fini(void)
+void PtlFini(void)
{
nal_t *nal;
int i;
ptl_mutex_enter();
if (ptl_init) {
- for (i = 0; i < NAL_MAX_NR; i++) {
+ for (i = 0; i <= NAL_MAX_NR; i++) {
nal = ptl_nal_table[i];
if (nal == NULL)
continue;
if (nal->nal_refct != 0) {
- CWARN("NAL %d has outstanding refcount %d\n",
+ CWARN("NAL %x has outstanding refcount %d\n",
i, nal->nal_refct);
- nal->shutdown(nal);
+ nal->nal_ni_fini(nal);
}
ptl_nal_table[i] = NULL;
ptl_mutex_enter ();
if (interface == PTL_IFACE_DEFAULT) {
- for (i = 0; i < NAL_MAX_NR; i++)
+ for (i = 0; i <= NAL_MAX_NR; i++)
if (ptl_nal_table[i] != NULL) {
interface = i;
break;
}
if (interface < 0 ||
- interface >= NAL_MAX_NR ||
+ interface > NAL_MAX_NR ||
ptl_nal_table[interface] == NULL) {
GOTO(out, rc = PTL_IFACE_INVALID);
}
nal = ptl_nal_table[interface];
-
- CDEBUG(D_OTHER, "Starting up NAL (%d) refs %d\n", interface, nal->nal_refct);
- rc = nal->startup(nal, requested_pid, desired_limits, actual_limits);
+ nal->nal_handle.nal_idx = (NI_HANDLE_MAGIC & ~NI_HANDLE_MASK) | interface;
+ nal->nal_handle.cookie = 0;
+
+ CDEBUG(D_OTHER, "Starting up NAL (%x) refs %d\n", interface, nal->nal_refct);
+ rc = nal->nal_ni_init(nal, requested_pid, desired_limits, actual_limits);
if (rc != PTL_OK) {
- CERROR("Error %d starting up NAL %d, refs %d\n", rc,
+ CERROR("Error %d starting up NAL %x, refs %d\n", rc,
interface, nal->nal_refct);
GOTO(out, rc);
}
}
nal->nal_refct++;
- handle->nal_idx = (NI_HANDLE_MAGIC & ~NI_HANDLE_MASK) | interface;
+ *handle = nal->nal_handle;
out:
ptl_mutex_exit ();
+
return rc;
}
nal->nal_refct--;
/* nal_refct == 0 tells nal->shutdown to really shut down */
- nal->shutdown(nal);
+ nal->nal_ni_fini(nal);
ptl_mutex_exit ();
return PTL_OK;
}
-
-int PtlNIHandle(ptl_handle_any_t handle_in, ptl_handle_ni_t * ni_out)
-{
- *ni_out = handle_in;
-
- return PTL_OK;
-}