aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladimir Kondratyev <wulf@FreeBSD.org>2023-12-24 08:19:59 +0000
committerVladimir Kondratyev <wulf@FreeBSD.org>2023-12-24 08:19:59 +0000
commitc7312643b7e5f01adc2a3094c5139f5dcab5f0a4 (patch)
tree76cb42275346d6df0e566b8d3c794790f3bc41f9
parentaf787b8e8b803dbb2c6bd06629974ba39bd0fb70 (diff)
downloadsrc-c7312643b7e5f01adc2a3094c5139f5dcab5f0a4.tar.gz
src-c7312643b7e5f01adc2a3094c5139f5dcab5f0a4.zip
LinuxKPI: Add ida_alloc_min()
ida_alloc_min() allocates an unused ID. between min and INT_MAX. While here allow end parameter of ida_simple_get() be larger than INT_MAX. Linux caps the value to INT_MAX. Sponsored by: Serenity Cyber Security, LLC Reviewers: manu, bz MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D42806
-rw-r--r--sys/compat/linuxkpi/common/include/linux/idr.h7
-rw-r--r--sys/compat/linuxkpi/common/src/linux_idr.c5
2 files changed, 9 insertions, 3 deletions
diff --git a/sys/compat/linuxkpi/common/include/linux/idr.h b/sys/compat/linuxkpi/common/include/linux/idr.h
index 2fb2e1734878..ca3f8171ff44 100644
--- a/sys/compat/linuxkpi/common/include/linux/idr.h
+++ b/sys/compat/linuxkpi/common/include/linux/idr.h
@@ -31,6 +31,7 @@
#include <sys/param.h>
#include <sys/lock.h>
+#include <sys/limits.h>
#include <sys/mutex.h>
#include <linux/types.h>
@@ -132,6 +133,12 @@ ida_get_new(struct ida *ida, int *p_id)
}
static inline int
+ida_alloc_min(struct ida *ida, unsigned int min, gfp_t gfp)
+{
+ return (ida_simple_get(ida, min, UINT_MAX, gfp));
+}
+
+static inline int
ida_alloc_max(struct ida *ida, unsigned int max, gfp_t gfp)
{
diff --git a/sys/compat/linuxkpi/common/src/linux_idr.c b/sys/compat/linuxkpi/common/src/linux_idr.c
index 3be106150513..dc64da0d7cf5 100644
--- a/sys/compat/linuxkpi/common/src/linux_idr.c
+++ b/sys/compat/linuxkpi/common/src/linux_idr.c
@@ -754,10 +754,9 @@ ida_simple_get(struct ida *ida, unsigned int start, unsigned int end,
unsigned int max;
MPASS((int)start >= 0);
- MPASS((int)end >= 0);
- if (end == 0)
- max = 0x80000000;
+ if ((int)end <= 0)
+ max = INT_MAX;
else {
MPASS(end > start);
max = end - 1;