summaryrefslogtreecommitdiffstats
path: root/sys/ofed
diff options
context:
space:
mode:
authormarkj <markj@FreeBSD.org>2015-07-30 18:28:37 +0000
committermarkj <markj@FreeBSD.org>2015-07-30 18:28:37 +0000
commitca7adff0b82acb3e94fa89704aade20774b85bd1 (patch)
tree627e911627f211695b77d1259d8945ba011ad3c5 /sys/ofed
parent34996cf7cdfd83f387f03c0079faad2bd83f1aa1 (diff)
downloadFreeBSD-src-ca7adff0b82acb3e94fa89704aade20774b85bd1.zip
FreeBSD-src-ca7adff0b82acb3e94fa89704aade20774b85bd1.tar.gz
ib mad: fix an incorrect use of list_for_each_entry
In tf_dequeue(), if we reach the end of the list without finding a non-cancelled element, "tmp" will be a pointer into the list head, so the tmp->canceled check is bogus. Use a flag instead. Submitted by: Tao Liu <Tao.Liu@isilon.com> Reviewed by: hselasky MFC after: 1 week Sponsored by: EMC / Isilon Storage Division Differential Revision: https://reviews.freebsd.org/D3244
Diffstat (limited to 'sys/ofed')
-rw-r--r--sys/ofed/drivers/infiniband/core/mad.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/sys/ofed/drivers/infiniband/core/mad.c b/sys/ofed/drivers/infiniband/core/mad.c
index 11b3ba3..3eedca1 100644
--- a/sys/ofed/drivers/infiniband/core/mad.c
+++ b/sys/ofed/drivers/infiniband/core/mad.c
@@ -292,6 +292,7 @@ static struct tf_entry *tf_dequeue(struct to_fifo *tf, u32 *time_left_ms)
unsigned long flags;
unsigned long time_left;
struct tf_entry *tmp, *tmp1;
+ bool found = false;
spin_lock_irqsave(&tf->lists_lock, flags);
if (list_empty(&tf->fifo_head)) {
@@ -300,11 +301,13 @@ static struct tf_entry *tf_dequeue(struct to_fifo *tf, u32 *time_left_ms)
}
list_for_each_entry(tmp, &tf->fifo_head, fifo_list) {
- if (!tmp->canceled)
+ if (!tmp->canceled) {
+ found = true;
break;
+ }
}
- if (tmp->canceled) {
+ if (!found) {
spin_unlock_irqrestore(&tf->lists_lock, flags);
return NULL;
}
OpenPOWER on IntegriCloud