svn commit: r283675 - stable/10/sys/ofed/include/linux
Mark Johnston
markj at FreeBSD.org
Fri May 29 03:47:37 UTC 2015
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);
}
More information about the svn-src-stable-10
mailing list