Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 29 May 2015 03:47:35 +0000 (UTC)
From:      Mark Johnston <markj@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r283675 - stable/10/sys/ofed/include/linux
Message-ID:  <201505290347.t4T3lZ2p060468@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: markj
Date: Fri May 29 03:47:35 2015
New Revision: 283675
URL: https://svnweb.freebsd.org/changeset/base/283675

Log:
  MFC r282331:
  Don't drop the idr lock before verifying that the newly-inserted element
  is present in the tree.
  
  MFC r282741:
  find_next_bit() and find_next_zero_bit(): if the caller-specified offset
  lies within the last block of the bit set and no bits are set beyond the
  offset, terminate the search immediately instead of continuing as though
  there are further blocks in the set and subsequently returning an incorrect
  result.
  
  MFC r282743:
  Ensure that msecs_to_jiffies(0) == 0.

Modified:
  stable/10/sys/ofed/include/linux/bitops.h
  stable/10/sys/ofed/include/linux/jiffies.h
  stable/10/sys/ofed/include/linux/linux_idr.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/ofed/include/linux/bitops.h
==============================================================================
--- stable/10/sys/ofed/include/linux/bitops.h	Fri May 29 02:16:40 2015	(r283674)
+++ stable/10/sys/ofed/include/linux/bitops.h	Fri May 29 03:47:35 2015	(r283675)
@@ -165,6 +165,8 @@ find_next_bit(unsigned long *addr, unsig
 		mask = (*addr) & ~BIT_MASK(offs);
 		if (mask)
 			return (bit + __ffsl(mask));
+		if (size - bit <= BITS_PER_LONG)
+			return (size);
 		bit += BITS_PER_LONG;
 		addr++;
 	}
@@ -203,6 +205,8 @@ find_next_zero_bit(unsigned long *addr, 
 		mask = ~(*addr) & ~BIT_MASK(offs);
 		if (mask)
 			return (bit + __ffsl(mask));
+		if (size - bit <= BITS_PER_LONG)
+			return (size);
 		bit += BITS_PER_LONG;
 		addr++;
 	}

Modified: stable/10/sys/ofed/include/linux/jiffies.h
==============================================================================
--- stable/10/sys/ofed/include/linux/jiffies.h	Fri May 29 02:16:40 2015	(r283674)
+++ stable/10/sys/ofed/include/linux/jiffies.h	Fri May 29 03:47:35 2015	(r283675)
@@ -42,7 +42,7 @@ msecs_to_jiffies(int msec)
 
 	tv.tv_sec = msec / 1000;
 	tv.tv_usec = (msec % 1000) * 1000;
-	return (tvtohz(&tv));
+	return (tvtohz(&tv) - 1);
 }
 
 #define jiffies                 ticks

Modified: stable/10/sys/ofed/include/linux/linux_idr.c
==============================================================================
--- stable/10/sys/ofed/include/linux/linux_idr.c	Fri May 29 02:16:40 2015	(r283674)
+++ stable/10/sys/ofed/include/linux/linux_idr.c	Fri May 29 03:47:35 2015	(r283675)
@@ -185,27 +185,37 @@ out:
 	return (res);
 }
 
-void *
-idr_find(struct idr *idr, int id)
+static inline void *
+idr_find_locked(struct idr *idr, int id)
 {
 	struct idr_layer *il;
 	void *res;
 	int layer;
 
-	res = NULL;
+	mtx_assert(&idr->lock, MA_OWNED);
+
 	id &= MAX_ID_MASK;
-	mtx_lock(&idr->lock);
+	res = NULL;
 	il = idr->top;
 	layer = idr->layers - 1;
 	if (il == NULL || id > idr_max(idr))
-		goto out;
+		return (NULL);
 	while (layer && il) {
 		il = il->ary[idr_pos(id, layer)];
 		layer--;
 	}
 	if (il != NULL)
 		res = il->ary[id & IDR_MASK];
-out:
+	return (res);
+}
+
+void *
+idr_find(struct idr *idr, int id)
+{
+	void *res;
+
+	mtx_lock(&idr->lock);
+	res = idr_find_locked(idr, id);
 	mtx_unlock(&idr->lock);
 	return (res);
 }
@@ -331,13 +341,13 @@ idr_get_new(struct idr *idr, void *ptr, 
 	}
 	error = 0;
 out:
-	mtx_unlock(&idr->lock);
 #ifdef INVARIANTS
-	if (error == 0 && idr_find(idr, id) != ptr) {
+	if (error == 0 && idr_find_locked(idr, id) != ptr) {
 		panic("idr_get_new: Failed for idr %p, id %d, ptr %p\n",
 		    idr, id, ptr);
 	}
 #endif
+	mtx_unlock(&idr->lock);
 	return (error);
 }
 
@@ -438,12 +448,12 @@ restart:
 	}
 	error = 0;
 out:
-	mtx_unlock(&idr->lock);
 #ifdef INVARIANTS
-	if (error == 0 && idr_find(idr, id) != ptr) {
+	if (error == 0 && idr_find_locked(idr, id) != ptr) {
 		panic("idr_get_new_above: Failed for idr %p, id %d, ptr %p\n",
 		    idr, id, ptr);
 	}
 #endif
+	mtx_unlock(&idr->lock);
 	return (error);
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201505290347.t4T3lZ2p060468>