svn commit: r299426 - head/sys/compat/linuxkpi/common/src

Hans Petter Selasky hselasky at FreeBSD.org
Wed May 11 10:35:17 UTC 2016


Author: hselasky
Date: Wed May 11 10:35:15 2016
New Revision: 299426
URL: https://svnweb.freebsd.org/changeset/base/299426

Log:
  Factor out common code into "idr_find_layer_locked()" and fix inverted
  bitmap test for free entry in "idr_replace()".
  
  Obtained from:	kmacy @
  MFC after:	1 week
  Sponsored by:	Mellanox Technologies

Modified:
  head/sys/compat/linuxkpi/common/src/linux_idr.c

Modified: head/sys/compat/linuxkpi/common/src/linux_idr.c
==============================================================================
--- head/sys/compat/linuxkpi/common/src/linux_idr.c	Wed May 11 10:19:44 2016	(r299425)
+++ head/sys/compat/linuxkpi/common/src/linux_idr.c	Wed May 11 10:35:15 2016	(r299426)
@@ -160,34 +160,43 @@ idr_remove(struct idr *idr, int id)
 	mtx_unlock(&idr->lock);
 }
 
-void *
-idr_replace(struct idr *idr, void *ptr, int id)
+
+static inline struct idr_layer *
+idr_find_layer_locked(struct idr *idr, int id)
 {
 	struct idr_layer *il;
-	void *res;
 	int layer;
-	int idx;
 
-	res = ERR_PTR(-EINVAL);
 	id &= MAX_ID_MASK;
-	mtx_lock(&idr->lock);
 	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--;
 	}
+	return (il);
+}
+
+void *
+idr_replace(struct idr *idr, void *ptr, int id)
+{
+	struct idr_layer *il;
+	void *res;
+	int idx;
+
+	mtx_lock(&idr->lock);
+	il = idr_find_layer_locked(idr, id);
 	idx = id & IDR_MASK;
-	/*
-	 * Replace still returns an error if the item was not allocated.
-	 */
-	if (il != NULL && (il->bitmap & (1 << idx)) != 0) {
+
+	/* Replace still returns an error if the item was not allocated. */
+	if (il == NULL || (il->bitmap & (1 << idx))) {
+		res = ERR_PTR(-ENOENT);
+	} else {
 		res = il->ary[idx];
 		il->ary[idx] = ptr;
 	}
-out:
 	mtx_unlock(&idr->lock);
 	return (res);
 }
@@ -197,22 +206,13 @@ idr_find_locked(struct idr *idr, int id)
 {
 	struct idr_layer *il;
 	void *res;
-	int layer;
 
 	mtx_assert(&idr->lock, MA_OWNED);
-
-	id &= MAX_ID_MASK;
-	res = NULL;
-	il = idr->top;
-	layer = idr->layers - 1;
-	if (il == NULL || id > idr_max(idr))
-		return (NULL);
-	while (layer && il) {
-		il = il->ary[idr_pos(id, layer)];
-		layer--;
-	}
+	il = idr_find_layer_locked(idr, id);
 	if (il != NULL)
 		res = il->ary[id & IDR_MASK];
+	else
+		res = NULL;
 	return (res);
 }
 


More information about the svn-src-all mailing list