@@ -2,6 +2,7 @@
* Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved.
* Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved.
* Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
+ * Copyright (c) 2009 HNR Consulting. All rights reserved.
*
* This software is available to you under a choice of one of two
* licenses. You may choose to be licensed under the terms of the GNU
@@ -115,6 +116,7 @@ static void vl15_poller(IN void *p_ptr)
osm_madw_t *p_madw;
osm_vl15_t *p_vl = p_ptr;
cl_qlist_t *p_fifo;
+ uint32_t ufifo_count = 0;
OSM_LOG_ENTER(p_vl->p_log);
@@ -132,10 +134,15 @@ static void vl15_poller(IN void *p_ptr)
*/
cl_spinlock_acquire(&p_vl->lock);
- if (cl_qlist_count(&p_vl->ufifo) != 0)
+ if (ufifo_count)
p_fifo = &p_vl->ufifo;
- else
- p_fifo = &p_vl->rfifo;
+ else {
+ ufifo_count = cl_qlist_count(&p_vl->ufifo);
+ if (ufifo_count != 0)
+ p_fifo = &p_vl->ufifo;
+ else
+ p_fifo = &p_vl->rfifo;
+ }
p_madw = (osm_madw_t *) cl_qlist_remove_head(p_fifo);
@@ -157,7 +164,14 @@ static void vl15_poller(IN void *p_ptr)
status = cl_event_wait_on(&p_vl->signal,
EVENT_NO_TIMEOUT, TRUE);
- while (p_vl->p_stats->qp0_mads_outstanding_on_wire >=
+ if (ufifo_count) {
+ cl_spinlock_acquire(&p_vl->lock);
+ ufifo_count = cl_qlist_count(&p_vl->ufifo);
+ cl_spinlock_release(&p_vl->lock);
+ }
+
+ while (!ufifo_count &&
+ p_vl->p_stats->qp0_mads_outstanding_on_wire >=
(int32_t) p_vl->max_wire_smps &&
p_vl->thread_state == OSM_THREAD_STATE_RUN) {
status = cl_event_wait_on(&p_vl->signal,