/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
* vim:expandtab:shiftwidth=8:tabstop=8:
*
- * Copyright (C) 2005 Cluster File Systems, Inc. All rights reserved.
- * Author: PJ Kirner <pjkirner@clusterfs.com>
+ * GPL HEADER START
*
- * This file is part of the Lustre file system, http://www.lustre.org
- * Lustre is a trademark of Cluster File Systems, Inc.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
- * This file is confidential source code owned by Cluster File Systems.
- * No viewing, modification, compilation, redistribution, or any other
- * form of use is permitted except through a signed license agreement.
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 only,
+ * as published by the Free Software Foundation.
*
- * If you have not signed such an agreement, then you have no rights to
- * this file. Please destroy it immediately and contact CFS.
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License version 2 for more details (a copy is included
+ * in the LICENSE file that accompanied this code).
*
+ * You should have received a copy of the GNU General Public License
+ * version 2 along with this program; If not, see
+ * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ * GPL HEADER END
+ */
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved
+ * Use is subject to license terms.
+ */
+/*
+ * This file is part of Lustre, http://www.lustre.org/
+ * Lustre is a trademark of Sun Microsystems, Inc.
+ *
+ * lnet/klnds/ptllnd/ptllnd.h
+ *
+ * Author: PJ Kirner <pjkirner@clusterfs.com>
*/
#ifndef EXPORT_SYMTAB
# define EXPORT_SYMTAB
#endif
-
+#ifndef AUTOCONF_INCLUDED
#include <linux/config.h>
+#endif
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/mm.h>
#define DEBUG_SUBSYSTEM S_LND
-#include <libcfs/kp30.h>
+#include <libcfs/libcfs.h>
#include <lnet/lnet.h>
#include <lnet/lib-lnet.h>
+#include <lnet/lnet-sysctl.h>
#include <portals/p30.h>
#ifdef CRAY_XT3
#include <portals/ptltrace.h>
int *kptl_ack_puts; /* make portals ack PUTs */
#ifdef CRAY_XT3
int *kptl_ptltrace_on_timeout; /* dump pltrace on timeout? */
+ int *kptl_ptltrace_on_fail; /* dump pltrace on PTL_NAL_FAILED? */
char **kptl_ptltrace_basename; /* ptltrace dump file basename */
#endif
#ifdef PJK_DEBUGGING
int *kptl_simulation_bitmap;/* simulation bitmap */
#endif
-#if CONFIG_SYSCTL && !CFS_SYSFS_MODULE_PARM
- struct ctl_table_header *kptl_sysctl; /* sysctl interface */
+#if defined(CONFIG_SYSCTL) && !CFS_SYSFS_MODULE_PARM
+ cfs_sysctl_table_header_t *kptl_sysctl; /* sysctl interface */
#endif
} kptl_tunables_t;
char rx_space[0]; /* copy of incoming request */
} kptl_rx_t;
+#define PTLLND_POSTRX_DONT_POST 0 /* don't post */
+#define PTLLND_POSTRX_NO_CREDIT 1 /* post: no credits */
+#define PTLLND_POSTRX_PEER_CREDIT 2 /* post: give peer back 1 credit */
+
typedef struct kptl_rx_buffer_pool
{
spinlock_t rxbp_lock;
atomic_t peer_refcount; /* The current refrences */
enum kptllnd_peer_state peer_state;
spinlock_t peer_lock; /* serialize */
+ struct list_head peer_noops; /* PTLLND_MSG_TYPE_NOOP txs */
struct list_head peer_sendq; /* txs waiting for mh handles */
struct list_head peer_activeq; /* txs awaiting completion */
lnet_process_id_t peer_id; /* Peer's LNET id */
int peer_sent_credits; /* #msg buffers posted for peer */
int peer_max_msg_size; /* peer's rx buffer size */
int peer_error; /* errno on closing this peer */
+ int peer_retry_noop; /* need to retry returning credits */
+ int peer_check_stamp; /* watchdog check stamp */
cfs_time_t peer_last_alive; /* when (in jiffies) I was last alive */
__u64 peer_next_matchbits; /* Next value to register RDMA from peer */
__u64 peer_last_matchbits_seen; /* last matchbits used to RDMA to peer */
struct list_head kptl_sched_rxbq; /* rxb requiring reposting */
wait_queue_head_t kptl_watchdog_waitq; /* watchdog sleeps here */
+ atomic_t kptl_needs_ptltrace; /* watchdog thread to dump ptltrace */
kptl_rx_buffer_pool_t kptl_rx_buffer_pool; /* rx buffer pool */
cfs_mem_cache_t* kptl_rx_cache; /* rx descripter cache */
#endif
}
+static inline void
+kptllnd_schedule_ptltrace_dump (void)
+{
+#ifdef CRAY_XT3
+ if (*kptllnd_tunables.kptl_ptltrace_on_fail) {
+ atomic_inc(&kptllnd_data.kptl_needs_ptltrace);
+ wake_up(&kptllnd_data.kptl_watchdog_waitq);
+ }
+#endif
+}
+
int kptllnd_startup(lnet_ni_t *ni);
void kptllnd_shutdown(lnet_ni_t *ni);
int kptllnd_ctl(lnet_ni_t *ni, unsigned int cmd, void *arg);
+void kptllnd_query (struct lnet_ni *ni, lnet_nid_t nid, time_t *when);
int kptllnd_send(lnet_ni_t *ni, void *private, lnet_msg_t *lntmsg);
int kptllnd_recv(lnet_ni_t *ni, void *private, lnet_msg_t *lntmsg,
int delayed, unsigned int niov,
/*
* RX SUPPORT FUNCTIONS
*/
-void kptllnd_rx_done(kptl_rx_t *rx);
void kptllnd_rx_parse(kptl_rx_t *rx);
+void kptllnd_rx_done(kptl_rx_t *rx, int post_credit);
/*
* PEER SUPPORT FUNCTIONS
void kptllnd_handle_closing_peers(void);
int kptllnd_peer_connect(kptl_tx_t *tx, lnet_nid_t nid);
void kptllnd_peer_check_sends(kptl_peer_t *peer);
-void kptllnd_peer_check_bucket(int idx);
+void kptllnd_peer_check_bucket(int idx, int stamp);
void kptllnd_tx_launch(kptl_peer_t *peer, kptl_tx_t *tx, int nfrag);
int kptllnd_find_target(kptl_peer_t **peerp, lnet_process_id_t target);
kptl_peer_t *kptllnd_peer_handle_hello(ptl_process_id_t initiator,
#else
#define IS_SIMULATION_ENABLED(x) 0
#endif
-