[openib-general] [PATCHv3][RFC] kDAPL: use cm timers instead of own

Tom Duffy tduffy at sun.com
Wed Jun 1 12:48:44 PDT 2005


This patch takes into account some of the feedback by Sean, it sets the
retry to 0, so it will do the timeout right.  It also stops the
conversion of ms to ib at 63 since 64 overflows.  I have tested this
version using kdapltest in quit, performance, and transaction modes.

James, do you think it good enough to apply?

Signed-off-by: Tom Duffy <tduffy at sun.com>

Index: linux-kernel-timer/test/dapltest/test/dapl_performance_util.c
===================================================================
--- linux-kernel-timer/test/dapltest/test/dapl_performance_util.c	(revision 2518)
+++ linux-kernel-timer/test/dapltest/test/dapl_performance_util.c	(working copy)
@@ -538,7 +538,7 @@ DT_performance_wait (
     pre_ts = DT_Mdep_GetTimeStamp ();
 
     ret = DT_Tdep_evd_wait ( evd_handle,
-			DAT_TIMEOUT_INFINITE,
+			MAX_SCHEDULE_TIMEOUT,
 			&event);
 
     post_ts = DT_Mdep_GetTimeStamp ();
Index: linux-kernel-timer/test/dapltest/test/dapl_performance_client.c
===================================================================
--- linux-kernel-timer/test/dapltest/test/dapl_performance_client.c	(revision 2518)
+++ linux-kernel-timer/test/dapltest/test/dapl_performance_client.c	(working copy)
@@ -105,7 +105,7 @@ retry:
     ret = dat_ep_connect (test_ptr->ep_context.ep_handle,
 			 test_ptr->remote_ia_addr,
 			 test_ptr->ep_context.port,
-			 DAT_TIMEOUT_INFINITE,
+			 MAX_SCHEDULE_TIMEOUT,
 			 0,
 			 (void *) 0,	  /* no private data */
 			 test_ptr->cmd->qos,
Index: linux-kernel-timer/test/dapltest/test/dapl_server.c
===================================================================
--- linux-kernel-timer/test/dapltest/test/dapl_server.c	(revision 2518)
+++ linux-kernel-timer/test/dapltest/test/dapl_server.c	(working copy)
@@ -580,7 +580,7 @@ DT_cs_Server (Params_t * params_ptr)
 
 	DT_Mdep_wait_object_wait (
 		&pt_ptr->synch_wait_object,
-		DAT_TIMEOUT_INFINITE);
+		MAX_SCHEDULE_TIMEOUT);
 
 	/* Send the Server_Info */
 	DT_Tdep_PT_Debug (1,(phead,"%s: Send Server_Info\n", module));
Index: linux-kernel-timer/test/dapltest/test/dapl_transaction_test.c
===================================================================
--- linux-kernel-timer/test/dapltest/test/dapl_transaction_test.c	(revision 2518)
+++ linux-kernel-timer/test/dapltest/test/dapl_transaction_test.c	(working copy)
@@ -712,7 +712,7 @@ retry:
 	    ret = dat_ep_connect (test_ptr->ep_context[i].ep_handle,
 				 test_ptr->remote_ia_addr,
 				 test_ptr->ep_context[i].ia_port,
-				 DAT_TIMEOUT_INFINITE,
+				 MAX_SCHEDULE_TIMEOUT,
 				  strlen (private_data_str), private_data_str,
 				 pt_ptr->Params.ReliabilityLevel,
 				 DAT_CONNECT_DEFAULT_FLAG);
Index: linux-kernel-timer/test/dapltest/test/dapl_test_util.c
===================================================================
--- linux-kernel-timer/test/dapltest/test/dapl_test_util.c	(revision 2518)
+++ linux-kernel-timer/test/dapltest/test/dapl_test_util.c	(working copy)
@@ -261,7 +261,7 @@ DT_cr_event_wait ( DT_Tdep_Print_Head *p
 	u32      ret;
 	struct dat_event       event;
 
-	ret = DT_Tdep_evd_wait (evd_handle, DAT_TIMEOUT_INFINITE, &event);
+	ret = DT_Tdep_evd_wait (evd_handle, MAX_SCHEDULE_TIMEOUT, &event);
 	if (ret != DAT_SUCCESS)
 	{
 	    DT_Tdep_PT_Printf (phead, "Test Error: dapl_event_wait (CR) failed: %s\n",
@@ -316,7 +316,7 @@ DT_conn_event_wait (DT_Tdep_Print_Head *
 	u32      ret;
 	struct dat_event       event;
 
-	ret = DT_Tdep_evd_wait (evd_handle, DAT_TIMEOUT_INFINITE, &event);
+	ret = DT_Tdep_evd_wait (evd_handle, MAX_SCHEDULE_TIMEOUT, &event);
 	if (ret != DAT_SUCCESS)
 	{
 	    DT_Tdep_PT_Printf (phead, "Test Error: dapl_event_wait (CONN) failed: %s\n",
@@ -369,7 +369,7 @@ DT_disco_event_wait ( DT_Tdep_Print_Head
 	u32      ret;
 	struct dat_event       event;
 
-	ret = DT_Tdep_evd_wait (evd_handle, DAT_TIMEOUT_INFINITE, &event);
+	ret = DT_Tdep_evd_wait (evd_handle, MAX_SCHEDULE_TIMEOUT, &event);
 	if (ret != DAT_SUCCESS)
 	{
 	    DT_Tdep_PT_Printf (phead, "Test Error: dapl_event_wait (DISCONN) failed: %s\n",
@@ -492,7 +492,7 @@ DT_dto_event_wait (DT_Tdep_Print_Head *p
 	u32      ret;
 	struct dat_event       event;
 
-	ret = DT_Tdep_evd_wait (evd_handle, DAT_TIMEOUT_INFINITE, &event);
+	ret = DT_Tdep_evd_wait (evd_handle, MAX_SCHEDULE_TIMEOUT, &event);
 	if (ret != DAT_SUCCESS)
 	{
 	    DT_Tdep_PT_Printf (phead, "Test Error: dapl_event_wait (DTO) failed: %s\n",
@@ -536,7 +536,7 @@ DT_rmr_event_wait (DT_Tdep_Print_Head *p
 	u32      ret;
 	struct dat_event       event;
 
-	ret = DT_Tdep_evd_wait (evd_handle, DAT_TIMEOUT_INFINITE, &event);
+	ret = DT_Tdep_evd_wait (evd_handle, MAX_SCHEDULE_TIMEOUT, &event);
 	if (ret != DAT_SUCCESS)
 	{
 	    DT_Tdep_PT_Printf (phead, "Test Error: dapl_event_wait (RMR) failed: %s\n",
Index: linux-kernel-timer/test/dapltest/test/dapl_client.c
===================================================================
--- linux-kernel-timer/test/dapltest/test/dapl_client.c	(revision 2518)
+++ linux-kernel-timer/test/dapltest/test/dapl_client.c	(working copy)
@@ -256,7 +256,7 @@ retry:
     ret = dat_ep_connect (ep_handle,
 			 server_netaddr,
 			 SERVER_PORT_NUMBER,
-			 DAT_TIMEOUT_INFINITE,
+			 MAX_SCHEDULE_TIMEOUT,
 			 0, (void *) 0,  /* no private data */
 			 params_ptr->ReliabilityLevel,
 			 DAT_CONNECT_DEFAULT_FLAG);
Index: linux-kernel-timer/test/dapltest/include/dapl_tdep.h
===================================================================
--- linux-kernel-timer/test/dapltest/include/dapl_tdep.h	(revision 2518)
+++ linux-kernel-timer/test/dapltest/include/dapl_tdep.h	(working copy)
@@ -56,7 +56,7 @@ DT_Tdep_evd_free (DAT_EVD_HANDLE 	evd_ha
 
 u32
 DT_Tdep_evd_wait (DAT_EVD_HANDLE 	evd_handle,
-		  DAT_TIMEOUT   	timeout,
+		  unsigned long   	timeout,
 		  struct dat_event    	*event);
 u32
 DT_Tdep_evd_dequeue (DAT_EVD_HANDLE	evd_handle,
Index: linux-kernel-timer/test/dapltest/include/dapl_proto.h
===================================================================
--- linux-kernel-timer/test/dapltest/include/dapl_proto.h	(revision 2518)
+++ linux-kernel-timer/test/dapltest/include/dapl_proto.h	(working copy)
@@ -185,7 +185,7 @@ void 			DT_Mdep_Thread_EXIT ( void * thr
 int				DT_Mdep_wait_object_init ( DT_WAIT_OBJECT *wait_obj);
 int 			DT_Mdep_wait_object_wait (
 						    DT_WAIT_OBJECT *wait_obj,
-						     int timeout_val);
+						     unsigned long timeout_val);
 int 			DT_Mdep_wait_object_wakeup ( DT_WAIT_OBJECT *wait_obj);
 int 			DT_Mdep_wait_object_destroy ( DT_WAIT_OBJECT *wait_obj);
 
Index: linux-kernel-timer/test/dapltest/include/dapl_transaction_test.h
===================================================================
--- linux-kernel-timer/test/dapltest/include/dapl_transaction_test.h	(revision 2518)
+++ linux-kernel-timer/test/dapltest/include/dapl_transaction_test.h	(working copy)
@@ -79,7 +79,7 @@ typedef struct
     Transaction_Cmd_t       *cmd;
     struct sockaddr *     remote_ia_addr;
     DAT_CONN_QUAL           base_port;
-    DAT_TIMEOUT             time_out;
+    unsigned long             time_out;
     int               evd_length;
     Thread                  *thread;
 
Index: linux-kernel-timer/test/dapltest/mdep/linux/dapl_mdep_user.c
===================================================================
--- linux-kernel-timer/test/dapltest/mdep/linux/dapl_mdep_user.c	(revision 2518)
+++ linux-kernel-timer/test/dapltest/mdep/linux/dapl_mdep_user.c	(working copy)
@@ -411,7 +411,7 @@ DT_Mdep_wait_object_init (
 int
 DT_Mdep_wait_object_wait (
 	DT_WAIT_OBJECT *wait_obj,
-	 int timeout_val)
+	 unsigned long timeout_val)
 {
     int 		dat_status;
     int 		pthread_status;
Index: linux-kernel-timer/test/dapltest/mdep/linux/dapl_mdep_kernel.c
===================================================================
--- linux-kernel-timer/test/dapltest/mdep/linux/dapl_mdep_kernel.c	(revision 2518)
+++ linux-kernel-timer/test/dapltest/mdep/linux/dapl_mdep_kernel.c	(working copy)
@@ -252,13 +252,13 @@ DT_Mdep_wait_object_init (
 int
 DT_Mdep_wait_object_wait (
 	DT_WAIT_OBJECT *wait_obj,
-	 int timeout_val)
+	 unsigned long timeout_val)
 {
     int     expire;
     int 	dat_status;
 
     dat_status = DAT_SUCCESS;
-    if ( DAT_TIMEOUT_INFINITE == timeout_val)
+    if ( MAX_SCHEDULE_TIMEOUT == timeout_val)
     {
 	interruptible_sleep_on (wait_obj);
     }
Index: linux-kernel-timer/test/dapltest/kdapl/kdapl_tdep_evd.c
===================================================================
--- linux-kernel-timer/test/dapltest/kdapl/kdapl_tdep_evd.c	(revision 2518)
+++ linux-kernel-timer/test/dapltest/kdapl/kdapl_tdep_evd.c	(working copy)
@@ -213,7 +213,7 @@ DT_Tdep_evd_dequeue (DAT_EVD_HANDLE evd_
 
 u32
 DT_Tdep_evd_wait (DAT_EVD_HANDLE evd_handle,
-		  DAT_TIMEOUT   timeout,
+		  unsigned long   timeout,
 		  struct dat_event      *dat_event)
 {
     u32  dat_status;
@@ -239,7 +239,7 @@ DT_Tdep_evd_wait (DAT_EVD_HANDLE evd_han
 	return dat_status;
     }
     /* wait for an event */
-    if (timeout == DAT_TIMEOUT_INFINITE) 
+    if (timeout == MAX_SCHEDULE_TIMEOUT) 
     {
 	rc = wait_event_interruptible (evd_ptr->wait_object, 
 				       evd_ptr->event_next != NULL);
Index: linux-kernel-timer/dat-provider/dapl_ep_connect.c
===================================================================
--- linux-kernel-timer/dat-provider/dapl_ep_connect.c	(revision 2518)
+++ linux-kernel-timer/dat-provider/dapl_ep_connect.c	(working copy)
@@ -35,7 +35,6 @@
 #include "dapl_ep_util.h"
 #include "dapl_openib_util.h"
 #include "dapl_evd_util.h"
-#include "dapl_timer_util.h"
 
 /*
  * Request a connection be established between the local Endpoint
@@ -44,7 +43,7 @@
  */
 u32 dapl_ep_connect(DAT_EP_HANDLE ep_handle,
 		    struct sockaddr *remote_ia_address,
-		    DAT_CONN_QUAL remote_conn_qual, DAT_TIMEOUT timeout,
+		    DAT_CONN_QUAL remote_conn_qual, unsigned long timeout,
 		    int private_data_size, const void *private_data,
 		    enum dat_qos qos, enum dat_connect_flags connect_flags)
 {
@@ -277,23 +276,13 @@ u32 dapl_ep_connect(DAT_EP_HANDLE ep_han
 		spin_lock_irqsave(&ep_ptr->header.lock, ep_ptr->header.flags);
 		if (ep_ptr->param.ep_state == 
 			DAT_EP_STATE_ACTIVE_CONNECTION_PENDING
-		    && timeout != DAT_TIMEOUT_INFINITE) {
-			ep_ptr->cxn_timer = kmalloc(sizeof *ep_ptr->cxn_timer,
-						    GFP_ATOMIC);
-			if (!ep_ptr->cxn_timer) {
-				dat_status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,
-						       DAT_RESOURCE_MEMORY);
-				goto bail;
-			}
-
-			dapl_timer_set(ep_ptr->cxn_timer,
-				       dapl_ep_timeout, ep_ptr, timeout);
-		}
+		    && timeout != MAX_SCHEDULE_TIMEOUT)
+			ep_ptr->timeout = timeout;
 		spin_unlock_irqrestore(&ep_ptr->header.lock, 
 				       ep_ptr->header.flags);
 	}
 
-      bail:
+bail:
 	dapl_dbg_log(DAPL_DBG_TYPE_RTN | DAPL_DBG_TYPE_CM,
 		     "dapl_ep_connect () returns 0x%x\n", dat_status);
 
Index: linux-kernel-timer/dat-provider/dapl_evd_connection_callb.c
===================================================================
--- linux-kernel-timer/dat-provider/dapl_evd_connection_callb.c	(revision 2518)
+++ linux-kernel-timer/dat-provider/dapl_evd_connection_callb.c	(working copy)
@@ -32,7 +32,6 @@
 #include "dapl.h"
 #include "dapl_evd_util.h"
 #include "dapl_ep_util.h"
-#include "dapl_timer_util.h"
 
 /*
  * dapl_evd_connection_callback
@@ -87,15 +86,6 @@ void dapl_evd_connection_callback(struct
 	 */
 	spin_lock_irqsave(&ep_ptr->header.lock, ep_ptr->header.flags);
 
-	/*
-	 * If a connection timer has been set up on this EP, cancel it now
-	 */
-	if (ep_ptr->cxn_timer != NULL) {
-		dapl_timer_cancel(ep_ptr->cxn_timer);
-		kfree(ep_ptr->cxn_timer);
-		ep_ptr->cxn_timer = NULL;
-	}
-
 	switch (event) {
 	case DAT_CONNECTION_EVENT_ESTABLISHED:
 		{
Index: linux-kernel-timer/dat-provider/dapl_ep_free.c
===================================================================
--- linux-kernel-timer/dat-provider/dapl_ep_free.c	(revision 2518)
+++ linux-kernel-timer/dat-provider/dapl_ep_free.c	(working copy)
@@ -34,7 +34,6 @@
 #include "dapl_ep_util.h"
 #include "dapl_openib_util.h"
 #include "dapl_ring_buffer_util.h"
-#include "dapl_timer_util.h"
 
 /*
  * dapl_ep_free
@@ -107,12 +106,6 @@ u32 dapl_ep_free(DAT_EP_HANDLE ep_handle
 	 */
 	spin_lock_irqsave(&ep_ptr->header.lock, ep_ptr->header.flags);
 
-	if (ep_ptr->cxn_timer != NULL) {
-		dapl_timer_cancel(ep_ptr->cxn_timer);
-		kfree(ep_ptr->cxn_timer);
-		ep_ptr->cxn_timer = NULL;
-	}
-
 	/* Remove the EP from the IA */
 	dapl_ia_unlink_ep(ia_ptr, ep_ptr);
 
Index: linux-kernel-timer/dat-provider/dapl_provider.c
===================================================================
--- linux-kernel-timer/dat-provider/dapl_provider.c	(revision 2518)
+++ linux-kernel-timer/dat-provider/dapl_provider.c	(working copy)
@@ -39,7 +39,6 @@
 #include "dapl_mr_util.h"
 #include "dapl_util.h"
 #include "dapl_openib_util.h"
-#include "dapl_timer_util.h"
 
 MODULE_LICENSE("Dual BSD/GPL");
 MODULE_DESCRIPTION("DAT Provider for InfiniBand");
@@ -393,7 +392,6 @@ module_exit(dapl_fini);
 static int __init dapl_init(void)
 {
 	dapl_dbg_log(DAPL_DBG_TYPE_UTIL, "provider started\n");
-	dapl_timer_init();
 	return ib_register_client(&dapl_client);
 }
 
Index: linux-kernel-timer/dat-provider/dapl_openib_cm.c
===================================================================
--- linux-kernel-timer/dat-provider/dapl_openib_cm.c	(revision 2518)
+++ linux-kernel-timer/dat-provider/dapl_openib_cm.c	(working copy)
@@ -291,6 +291,26 @@ static int dapl_cm_passive_cb_handler(st
 	return ret;
 }
 
+/*
+ * approximately transforms miliseconds to 4.096us*2^x
+ * 63(+8) is max return
+ */
+static inline u8 dapl_convert_ms_to_kookyib(unsigned long ms) {
+	unsigned long converged = 2;
+	u8 i;
+
+	if (2 > ms)
+		return 8;
+
+	for (i = 1; i < 63; i++) {
+		if (converged >= ms)
+			break;
+		converged = 2*converged;
+	}
+	
+	return i+8;
+}
+
 static void dapl_path_comp_handler(u64 req_id, void *context, int rec_num)
 {
 	struct dapl_cm_id *conn = context;
@@ -324,6 +344,12 @@ static void dapl_path_comp_handler(u64 r
 	if (conn->dapl_path.mtu > IB_MTU_1024)    
 		conn->dapl_path.mtu = IB_MTU_1024;
 
+	if (conn->ep && conn->ep->timeout != 0) {
+		conn->param.remote_cm_response_timeout =
+				dapl_convert_ms_to_kookyib(conn->ep->timeout/1000);
+		conn->param.retry_count = 0;
+	}
+
 	conn->param.primary_path = &conn->dapl_path;
 	conn->param.alternate_path = NULL;
 
Index: linux-kernel-timer/dat-provider/dapl_timer_util.c
===================================================================
--- linux-kernel-timer/dat-provider/dapl_timer_util.c	(revision 2518)
+++ linux-kernel-timer/dat-provider/dapl_timer_util.c	(working copy)
@@ -1,313 +0,0 @@
-/*
- * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved.
- *
- * This Software is licensed under one of the following licenses:
- *
- * 1) under the terms of the "Common Public License 1.0" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/cpl.php.
- *
- * 2) under the terms of the "The BSD License" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/bsd-license.php.
- *
- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
- *    copy of which is available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/gpl-license.php.
- *
- * Licensee has the right to choose one of the above licenses.
- *
- * Redistributions of source code must retain the above copyright
- * notice and one of the license notices.
- *
- * Redistributions in binary form must reproduce both the above copyright
- * notice, one of the license notices in the documentation
- * and/or other materials provided with the distribution.
- */
-
-/*
- * Routines to add and cancel timer records. A timer record
- * is put on the global timer queue. If the timer thread is
- * not running, start it. The timer thread will sleep
- * until a timer event or until a process wakes it up
- * to notice a new timer is available; we use a DAPL_WAIT_OBJ
- * for synchronization.
- *
- * If a timer is cancelled, it is simlpy removed from the
- * queue. The timer may wakeup and notice there is no timer
- * record to awaken at this time, so it will reset for the
- * next entry. When there are no timer records to manage,
- * the timer thread just sleeps until awakened.
- *
- * This file also contains the timer handler thread,
- * embodied in dapl_timer_thread().
- *
- * $Id$
- */
-
-#include "dapl.h"
-#include "dapl_timer_util.h"
-
-struct dapl_timer_head {
-	struct dapl_llist_entry *timer_list_head;
-	spinlock_t lock;
-	unsigned long flags;
-	DAPL_OS_WAIT_OBJECT wait_object;
-	int thread_id;
-};
-
-static struct dapl_timer_head g_dapl_timer_head;
-
-static int dapl_timer_thread(void *arg);
-
-void dapl_timer_init(void)
-{
-	/*
-	 * Set up the timer thread elements. The timer thread isn't
-	 * started until it is actually needed
-	 */
-	g_dapl_timer_head.timer_list_head = NULL;
-	spin_lock_init(&g_dapl_timer_head.lock);
-	dapl_os_wait_object_init(&g_dapl_timer_head.wait_object);
-	g_dapl_timer_head.thread_id = -1;
-}
-
-/*
- * dapl_timer_set
- *
- * Set a timer. The timer will invoke the specified function
- * after a number of useconds expires.
- *
- * Input:
- *      timer    User provided timer structure
- *      func     Function to invoke when timer expires
- *      data     Argument passed to func()
- *      expires  microseconds until timer fires
- *
- * Returns:
- *	no return value
- *
- */
-u32 dapl_timer_set(struct dapl_timer_entry *timer, void (*func) (void *),
-		   void *data, DAPL_OS_TIMEVAL expires)
-{
-	struct dapl_timer_entry *list_ptr;
-	DAPL_OS_TIMEVAL cur_time;
-	boolean_t wakeup_tmo_thread;
-
-	/*
-	 * Start the timer thread the first time we need a timer
-	 */
-	if ( -1 == g_dapl_timer_head.thread_id ) {
-		g_dapl_timer_head.thread_id = 
-			kernel_thread(dapl_timer_thread, &g_dapl_timer_head, 0);
-	}
-
-	dapl_llist_init_entry(&timer->list_entry);
-	wakeup_tmo_thread = FALSE;
-	dapl_os_get_time(&cur_time);
-	timer->expires = cur_time + expires;	/* calculate future time */
-	timer->function = func;
-	timer->data = data;
-
-	/*
-	 * Put the element on the queue: sorted by wakeup time, eariliest
-	 * first.
-	 */
-	spin_lock_irqsave(&g_dapl_timer_head.lock, g_dapl_timer_head.flags);
-	/*
-	 * Deal with 3 cases due to our list structure:
-	 * 1) list is empty: become the list head
-	 * 2) New timer is sooner than list head: become the list head
-	 * 3) otherwise, sort the timer into the list, no need to wake
-	 *    the timer thread up
-	 */
-	if (dapl_llist_is_empty(&g_dapl_timer_head.timer_list_head)) {
-		/* Case 1: add entry to head of list */
-		dapl_llist_add_head(&g_dapl_timer_head.timer_list_head,
-				    (struct dapl_llist_entry *)
-					&timer->list_entry,
-				    timer);
-		wakeup_tmo_thread = TRUE;
-	} else {
-		list_ptr = (struct dapl_timer_entry *)
-		    dapl_llist_peek_head(&g_dapl_timer_head.timer_list_head);
-
-		if (timer->expires < list_ptr->expires) {
-			/* Case 2: add entry to head of list */
-			dapl_llist_add_head(&g_dapl_timer_head.timer_list_head,
-					    (struct dapl_llist_entry *)
-						&timer->list_entry, timer);
-			wakeup_tmo_thread = TRUE;
-		} else {
-			/* Case 3: figure out where entry goes in sorted list */
-			list_ptr =
-			    dapl_llist_next_entry(&g_dapl_timer_head.
-						  timer_list_head,
-						  (struct dapl_llist_entry *)
-							&list_ptr->list_entry);
-
-			while (list_ptr != NULL) {
-				if (timer->expires < list_ptr->expires) {
-					dapl_llist_add_entry(&g_dapl_timer_head.
-							     timer_list_head,
-							     (struct dapl_llist_entry *)
-								&list_ptr->list_entry,
-							     (struct dapl_llist_entry *)
-								&timer->list_entry,
-							     timer);
-					break;
-
-				}
-				list_ptr =
-				    dapl_llist_next_entry(&g_dapl_timer_head.
-							  timer_list_head,
-							  (struct dapl_llist_entry *)
-							  &list_ptr->list_entry);
-			}
-			if (list_ptr == NULL) {
-				/* entry goes to the end of the list */
-				dapl_llist_add_tail(&g_dapl_timer_head.
-						    timer_list_head,
-						    (struct dapl_llist_entry *)
-						    &timer->list_entry, timer);
-			}
-		}
-
-	}
-	spin_unlock_irqrestore(&g_dapl_timer_head.lock, 
-			       g_dapl_timer_head.flags);
-
-	if (wakeup_tmo_thread == TRUE) {
-		dapl_os_wait_object_wakeup(&g_dapl_timer_head.wait_object);
-	}
-
-	return DAT_SUCCESS;
-}
-
-/*
- * dapl_timer_cancel
- *
- * Cancel a timer. Simply deletes the timer with no function invocations
- *
- * Input:
- *      timer    User provided timer structure
- *
- * Returns:
- *	no return value
- */
-void dapl_timer_cancel(struct dapl_timer_entry *timer)
-{
-	spin_lock_irqsave(&g_dapl_timer_head.lock, g_dapl_timer_head.flags);
-	/*
-	 * make sure the entry has not been removed by another thread
-	 */
-	if (!dapl_llist_is_empty(&g_dapl_timer_head.timer_list_head) &&
-	    timer->list_entry.list_head == &g_dapl_timer_head.timer_list_head) {
-		dapl_llist_remove_entry(&g_dapl_timer_head.timer_list_head,
-					(struct dapl_llist_entry *)
-						&timer->list_entry);
-	}
-	/*
-	 * If this was the first entry on the queue we could awaken the
-	 * thread and have it reset the list; but it will just wake up
-	 * and find that the timer entry has been removed, then go back
-	 * to sleep, so don't bother.
-	 */
-	spin_unlock_irqrestore(&g_dapl_timer_head.lock, 
-			       g_dapl_timer_head.flags);
-}
-
-/*
- * dapl_timer_thread
- *
- * Core worker thread dealing with all timers. Basic algorithm:
- *	- Sleep until work shows up
- *	- Take first element of sorted timer list and wake
- *	  invoke the callback if expired
- *	- Sleep for the timeout period if not expired
- *
- * Input:
- *      timer_head    Timer head structure to manage timer lists
- *
- * Returns:
- *	int
- */
-int dapl_timer_thread(void *arg)
-{
-	struct dapl_timer_entry *list_ptr;
-	DAPL_OS_TIMEVAL cur_time;
-	struct dapl_timer_head *timer_head;
-	u32 dat_status;
-
-	timer_head = arg;
-
-	for (;;) {
-		if (dapl_llist_is_empty(&timer_head->timer_list_head)) {
-			dat_status =
-			    dapl_os_wait_object_wait(&timer_head->wait_object,
-						     DAT_TIMEOUT_INFINITE);
-		}
-
-		/*
-		 * Lock policy:
-		 * While this thread is accessing the timer list, it holds the
-		 * lock.  Otherwise, it doesn't.
-		 */
-		spin_lock_irqsave(&timer_head->lock, timer_head->flags);
-		while (!dapl_llist_is_empty(&timer_head->timer_list_head)) {
-			list_ptr = (struct dapl_timer_entry *)
-			    dapl_llist_peek_head(&g_dapl_timer_head.
-						 timer_list_head);
-			dapl_os_get_time(&cur_time);
-
-			if (list_ptr->expires <= cur_time) {
-				/*
-				 * Remove the entry from the list. Sort out how much
-				 * time we need to sleep for the next one
-				 */
-				list_ptr =
-				    dapl_llist_remove_head(&timer_head->
-							   timer_list_head);
-				spin_unlock_irqrestore(&timer_head->lock, 
-						       timer_head->flags);
-
-				/*
-				 * Invoke the user callback
-				 */
-				list_ptr->function(list_ptr->data);
-				/* timer structure was allocated by caller, we don't
-				 * free it here.
-				 */
-
-				/* reacquire the lock */
-				spin_lock_irqsave(&timer_head->lock, 
-					          timer_head->flags);
-			} else {
-				spin_unlock_irqrestore(&timer_head->lock, 
-						       timer_head->flags);
-				dat_status =
-				    dapl_os_wait_object_wait(&timer_head->
-							     wait_object,
-							     (DAT_TIMEOUT)
-							     (list_ptr->
-							      expires -
-							      cur_time));
-				spin_lock_irqsave(&timer_head->lock, 
-						  timer_head->flags);
-			}
-		}
-		/*
-		 * release the lock before going back to the top to sleep
-		 */
-		spin_unlock_irqrestore(&timer_head->lock, timer_head->flags);
-
-		if (dat_status == DAT_INTERNAL_ERROR) {
-			/*
-			 * XXX What do we do here?
-			 */
-		}
-	} /* for (;;) */
-
-	return 0;
-}
Index: linux-kernel-timer/dat-provider/dapl_timer_util.h
===================================================================
--- linux-kernel-timer/dat-provider/dapl_timer_util.h	(revision 2518)
+++ linux-kernel-timer/dat-provider/dapl_timer_util.h	(working copy)
@@ -1,42 +0,0 @@
-/*
- * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved.
- *
- * This Software is licensed under one of the following licenses:
- *
- * 1) under the terms of the "Common Public License 1.0" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/cpl.php.
- *
- * 2) under the terms of the "The BSD License" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/bsd-license.php.
- *
- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
- *    copy of which is available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/gpl-license.php.
- *
- * Licensee has the right to choose one of the above licenses.
- *
- * Redistributions of source code must retain the above copyright
- * notice and one of the license notices.
- *
- * Redistributions in binary form must reproduce both the above copyright
- * notice, one of the license notices in the documentation
- * and/or other materials provided with the distribution.
- */
-
-/*
- * $Id$
- */
-
-#ifndef DAPL_TIMER_UTIL_H
-#define DAPL_TIMER_UTIL_H
-
-void dapl_timer_init(void);
-
-u32 dapl_timer_set(struct dapl_timer_entry *timer, void (*func) (void *),
-		   void *data, DAPL_OS_TIMEVAL expires);
-
-void dapl_timer_cancel(struct dapl_timer_entry *timer);
-
-#endif /*  DAPL_TIMER_UTIL_H */
Index: linux-kernel-timer/dat-provider/dapl_ep_util.c
===================================================================
--- linux-kernel-timer/dat-provider/dapl_ep_util.c	(revision 2518)
+++ linux-kernel-timer/dat-provider/dapl_ep_util.c	(working copy)
@@ -168,9 +168,6 @@ void dapl_ep_dealloc(struct dapl_ep *ep_
 	if (ep_ptr->send_iov)
 		kfree(ep_ptr->send_iov);
 
-	if (ep_ptr->cxn_timer)
-		kfree(ep_ptr->cxn_timer);
-
 	kfree(ep_ptr);
 }
 
@@ -242,32 +239,6 @@ bail:
 }
 
 /*
- * dapl_ep_timeout
- *
- * If this routine is invoked before a connection occurs, generate an
- * event
- */
-void dapl_ep_timeout(void *arg)
-{
-	struct dapl_ep *ep_ptr;
-
-	dapl_dbg_log(DAPL_DBG_TYPE_CM, "--> dapl_ep_timeout! ep %lx\n", arg);
-
-	ep_ptr = (struct dapl_ep *)arg;
-
-	/* reset the EP state */
-	ep_ptr->param.ep_state = DAT_EP_STATE_DISCONNECTED;
-
-	/* Clean up the EP and put the underlying QP into the ERROR state. */
-	dapl_ib_disconnect_clean(ep_ptr, TRUE);
-
-	(void)dapl_evd_post_connection_event((struct dapl_evd *)ep_ptr->param.
-					     connect_evd_handle,
-					     DAT_CONNECTION_EVENT_TIMED_OUT,
-					     (DAT_HANDLE) ep_ptr, 0, NULL);
-}
-
-/*
  * dapl_ep_state_subtype
  *
  * Return the INVALID_STATE connection subtype associated with an
Index: linux-kernel-timer/dat-provider/dapl_ep_util.h
===================================================================
--- linux-kernel-timer/dat-provider/dapl_ep_util.h	(revision 2518)
+++ linux-kernel-timer/dat-provider/dapl_ep_util.h	(working copy)
@@ -52,8 +52,6 @@ extern u32 dapl_ep_post_send_req(DAT_EP_
 				 DAPL_DTO_TYPE dto_type,
 				 enum ib_wr_opcode op_type);
 
-void dapl_ep_timeout(void *arg);
-
 enum dat_return_subtype dapl_ep_state_subtype(struct dapl_ep *ep_ptr);
 
 #endif				/*  DAPL_EP_UTIL_H */
Index: linux-kernel-timer/dat-provider/dapl_util.c
===================================================================
--- linux-kernel-timer/dat-provider/dapl_util.c	(revision 2518)
+++ linux-kernel-timer/dat-provider/dapl_util.c	(working copy)
@@ -33,104 +33,6 @@
 #include "dapl_provider.h"
 #include "dapl_util.h"
 
-/*
- * dapl_os_get_time
- *
- * Return 64 bit value of current time in microseconds.
- *
- * Input:
- *      loc       User location to place current time
- *
- * Returns:
- *	DAT_SUCCESS
- */
-
-u32 dapl_os_get_time(DAPL_OS_TIMEVAL *loc)
-{
-	struct timeval tv;
-
-	do_gettimeofday(&tv);
-	*loc = ((u64) (tv.tv_sec) * 1000000L) + (u64) tv.tv_usec;
-
-	return DAT_SUCCESS;
-}
-
-/*
- * Wait object routines
- */
-
-/*
- * dapl_os_wait_object_init
- *
- * Initialize a wait object
- *
- * Input:
- *	wait_obj
- *
- * Returns:
- *	DAT_SUCCESS
- *	DAT_INTERNAL_ERROR
- */
-u32 dapl_os_wait_object_init(DAPL_OS_WAIT_OBJECT *wait_obj)
-{
-	init_waitqueue_head(&wait_obj->wait_queue);
-
-	return DAT_SUCCESS;
-}
-
-/* Wait on the supplied wait object, up to the specified time_out.
- * A timeout of DAT_TIMEOUT_INFINITE will wait indefinitely.
- * Timeout should be specified in micro seconds.
- *
- * Functional returns:
- *	DAT_SUCCESS -- another thread invoked dapl_os_wait object_wakeup
- * 	DAT_INVALID_STATE -- someone else is already waiting in this wait
- * 	object.
- *			     only one waiter is allowed at a time.
- *	DAT_ABORT -- another thread invoked dapl_os_wait_object_destroy
- *	DAT_TIMEOUT -- the specified time limit was reached.
- */
-
-u32 dapl_os_wait_object_wait(DAPL_OS_WAIT_OBJECT *wait_obj,
-			     DAT_TIMEOUT timeout_val)
-{
-	u32 dat_status = DAT_SUCCESS;
-
-	if (DAT_TIMEOUT_INFINITE == timeout_val) {
-		interruptible_sleep_on(&wait_obj->wait_queue);
-	} else {
-		int expire;
-
-		expire = timeout_val * HZ / 1000000;
-
-		while (expire) {
-			current->state = TASK_INTERRUPTIBLE;
-			expire = schedule_timeout(expire);
-		}
-		dat_status = DAT_ERROR(DAT_TIMEOUT_EXPIRED, 0);
-	}
-	return dat_status;
-}
-
-/*
- * dapl_os_wait_object_wakeup
- *
- * Wakeup a thread waiting on a wait object
- *
- * Input:
- *      wait_obj
- *
- * Returns:
- *	DAT_SUCCESS
- *	DAT_INTERNAL_ERROR
- */
-u32 dapl_os_wait_object_wakeup(DAPL_OS_WAIT_OBJECT *wait_obj)
-{
-	wake_up_interruptible(&wait_obj->wait_queue);
-
-	return DAT_SUCCESS;
-}
-
 #ifdef DAPL_DBG
 
 void dapl_dbg_log(DAPL_DBG_TYPE type, const char *fmt, ...)
Index: linux-kernel-timer/dat-provider/dapl_util.h
===================================================================
--- linux-kernel-timer/dat-provider/dapl_util.h	(revision 2518)
+++ linux-kernel-timer/dat-provider/dapl_util.h	(working copy)
@@ -107,24 +107,6 @@ static inline int dapl_os_atomic_assign(
  */
 
 /*
- * The wait object invariant: Presuming a call to dapl_os_wait_object_wait
- * occurs at some point, there will be at least one wakeup after each call
- * to dapl_os_wait_object_signal.  I.e. Signals are not ignored, though
- * they may be coallesced.
- */
-typedef struct dapl_os_wait_object {
-	wait_queue_head_t wait_queue;
-} DAPL_OS_WAIT_OBJECT;
-
-/* function prototypes */
-u32 dapl_os_wait_object_init(DAPL_OS_WAIT_OBJECT *wait_obj);
-
-u32 dapl_os_wait_object_wait(DAPL_OS_WAIT_OBJECT *wait_obj,
-			     DAT_TIMEOUT timeout_val);
-
-u32 dapl_os_wait_object_wakeup(DAPL_OS_WAIT_OBJECT *wait_obj);
-
-/*
  * Memory Functions
  */
 
@@ -154,15 +136,6 @@ static inline char *dapl_os_strdup(const
 }
 
 /*
- * Timer Functions
- */
-
-typedef u64 DAPL_OS_TIMEVAL;
-
-/* timer function prototype */
-u32 dapl_os_get_time(DAPL_OS_TIMEVAL *);
-
-/*
  * *printf format helper. We use the C string constant concatenation
  * ability to define 64 bit formats, which unfortunatly are non standard
  * in the C compiler world. 
Index: linux-kernel-timer/dat-provider/dapl_ep_dup_connect.c
===================================================================
--- linux-kernel-timer/dat-provider/dapl_ep_dup_connect.c	(revision 2518)
+++ linux-kernel-timer/dat-provider/dapl_ep_dup_connect.c	(working copy)
@@ -32,7 +32,6 @@
 #include "dapl.h"
 #include "dapl_ep_util.h"
 #include "dapl_openib_util.h"
-#include "dapl_timer_util.h"
 
 /*
  * dapl_ep_dup_connect
@@ -63,7 +62,7 @@
  *	DAT_MODEL_NOT_SUPPORTED
  */
 u32 dapl_ep_dup_connect(DAT_EP_HANDLE ep_handle, DAT_EP_HANDLE ep_dup_handle,
-			DAT_TIMEOUT timeout, int private_data_size,
+			unsigned long timeout, int private_data_size,
 			const void *private_data, enum dat_qos qos)
 {
 	struct dapl_ep *ep_dup_ptr;
@@ -114,6 +113,6 @@ u32 dapl_ep_dup_connect(DAT_EP_HANDLE ep
 				     private_data_size,
 				     private_data,
 				     qos, DAT_CONNECT_DEFAULT_FLAG);
-      bail:
+bail:
 	return dat_status;
 }
Index: linux-kernel-timer/dat-provider/dapl.h
===================================================================
--- linux-kernel-timer/dat-provider/dapl.h	(revision 2518)
+++ linux-kernel-timer/dat-provider/dapl.h	(working copy)
@@ -236,14 +236,6 @@ struct dapl_evd {
 	struct dapl_cno		*cno_ptr;
 };
 
-/* DAPL timer entry, used to queue timeouts */
-struct dapl_timer_entry {
-	struct dapl_llist_entry list_entry;	/* link entry on ia struct */
-	DAPL_OS_TIMEVAL expires;
-	void (*function) (void *);
-	void *data;
-};
-
 /* struct dapl_ep maps to DAT_EP_HANDLE */
 struct dapl_ep {
 	struct dapl_header header;
@@ -264,8 +256,7 @@ struct dapl_ep {
 	/* For passive connections we maintain a back pointer to the CR */
 	void *cr_ptr;
 
-	/* pointer to connection timer, if set */
-	struct dapl_timer_entry *cxn_timer;
+	unsigned long timeout;
 
 	/* private data container */
 	char private_data[DAPL_MAX_PRIVATE_DATA_SIZE];
@@ -500,14 +491,15 @@ extern u32 dapl_ep_modify(DAT_EP_HANDLE 
 extern u32 dapl_ep_connect(DAT_EP_HANDLE ep_handle,
 			   struct sockaddr *remote_ia_address,
 			   DAT_CONN_QUAL remote_conn_qual,
-			   DAT_TIMEOUT timeout,
+			   unsigned long timeout,
 			   int private_data_size,
 			   const void *private_data,
 			   enum dat_qos quality_of_service,
 			   enum dat_connect_flags connect_flags);
 
 extern u32 dapl_ep_dup_connect(DAT_EP_HANDLE ep_handle,
-			       DAT_EP_HANDLE ep_dup_handle, DAT_TIMEOUT timeout,
+			       DAT_EP_HANDLE ep_dup_handle,
+			       unsigned long timeout,
 			       int private_data_size,
 			       const void *private_data,
 			       enum dat_qos quality_of_service);
Index: linux-kernel-timer/patches/alt_dat_provider_makefile
===================================================================
--- linux-kernel-timer/patches/alt_dat_provider_makefile	(revision 2518)
+++ linux-kernel-timer/patches/alt_dat_provider_makefile	(working copy)
@@ -71,7 +71,6 @@ PROVIDER_MODULES := \
         dapl_set_consumer_context     	\
         dapl_sp_util                  	\
         dapl_srq                 	\
-        dapl_timer_util 		\
 	dapl_util
 
 PROVIDER_OBJS := $(foreach s, $(PROVIDER_MODULES), $(s).o)
@@ -97,4 +96,4 @@ default:
 endif
 
 clean:
-	rm -f *.o *.ko
+	rm -rf *.o *.ko .*.cmd *.mod.* .tmp_versions .*.d .*.o.tmp cscope.out
Index: linux-kernel-timer/dat/dat.h
===================================================================
--- linux-kernel-timer/dat/dat.h	(revision 2518)
+++ linux-kernel-timer/dat/dat.h	(working copy)
@@ -383,11 +383,6 @@ enum dat_completion_flags {
 	DAT_COMPLETION_BARRIER_FENCE_FLAG = 0x08,
 };
 
-typedef u32 DAT_TIMEOUT;	/* microseconds */
-
-/* timeout = infinity */
-#define DAT_TIMEOUT_INFINITE    ((DAT_TIMEOUT) ~0)
-
 /* dat handles */
 typedef void *DAT_HANDLE;
 typedef DAT_HANDLE DAT_CR_HANDLE;
@@ -1139,12 +1134,12 @@ typedef u32 (*DAT_EP_MODIFY_FUNC)(DAT_EP
 				  const struct dat_ep_param *);
 
 typedef u32 (*DAT_EP_CONNECT_FUNC)(DAT_EP_HANDLE, struct sockaddr *,
-				   DAT_CONN_QUAL, DAT_TIMEOUT, int,
+				   DAT_CONN_QUAL, unsigned long timeout, int,
 				   const void *, enum dat_qos,
 				   enum dat_connect_flags);
 
 typedef u32 (*DAT_EP_DUP_CONNECT_FUNC)(DAT_EP_HANDLE, DAT_EP_HANDLE,
-				       DAT_TIMEOUT, int, const void *,
+				       unsigned long timeout, int, const void *,
 				       enum dat_qos);
 
 typedef u32 (*DAT_EP_DISCONNECT_FUNC)(DAT_EP_HANDLE, enum dat_close_flags);
@@ -1493,7 +1488,7 @@ static inline u32 dat_evd_resize(DAT_EVD
 }
 
 static inline u32 dat_ep_connect(DAT_EP_HANDLE ep, struct sockaddr *ia_addr,
-				 DAT_CONN_QUAL conn_qual, DAT_TIMEOUT timeout,
+				 DAT_CONN_QUAL conn_qual, unsigned long timeout,
 				 int private_data_size,
 				 const void *private_data, enum dat_qos qos,
 				 enum dat_connect_flags flags)
@@ -1533,7 +1528,8 @@ static inline u32 dat_ep_disconnect(DAT_
 }
 
 static inline u32 dat_ep_dup_connect(DAT_EP_HANDLE ep, DAT_EP_HANDLE dup_ep,
-				     DAT_TIMEOUT timeout, int private_data_size,
+				     unsigned long timeout,
+				     int private_data_size,
 				     const void *private_data, enum dat_qos qos)
 {
         return DAT_CALL_PROVIDER_FUNC(ep_dup_connect_func, ep, dup_ep, timeout, 




More information about the general mailing list