lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20220703181739.387584-1-dakr@redhat.com>
Date:   Sun,  3 Jul 2022 20:17:38 +0200
From:   Danilo Krummrich <dakr@...hat.com>
To:     willy@...radead.org, linux-fsdevel@...r.kernel.org,
        linux-kernel@...r.kernel.org
Cc:     Danilo Krummrich <dakr@...hat.com>
Subject: [PATCH 1/2] treewide: idr: align IDR and IDA APIs

For allocating IDs the ID allocator (IDA) provides the following
functions: ida_alloc(), ida_alloc_range(), ida_alloc_min() and
ida_alloc_max() whereas for IDRs only idr_alloc() is available.

In contrast to ida_alloc(), idr_alloc() behaves like ida_alloc_range(),
which takes MIN and MAX arguments to define the bounds within an ID
should be allocated - ida_alloc() instead implicitly uses the maximal
bounds possible for MIN and MAX without taking those arguments.

In order to align the IDR and IDA APIs this patch provides
implementations for idr_alloc(), idr_alloc_range(), idr_alloc_min() and
idr_alloc_max(), which are analogue to the IDA API.

As a result of this change users of the original idr_alloc() function
must adjust to the new API.

The original idr_alloc() occurs 182 times. This patch converts them to

idr_alloc()		37 times
idr_alloc_range()	63 times
idr_alloc_min()		42 times
idr_alloc_max()		40 times

which shows that just ~1/3 of the callers need the full set of
arguments and therefore ~2/3 of the calls can be simplified.

In order to do this conversion the following script was used:

```
	#!/bin/bash

	REGEX_SYM="[][()0-9a-zA-Z&>_\*\.\-]"

	REGEX_GREP_BASE="idr_alloc_range\(${REGEX_SYM}{1,}[, ]{1,}${REGEX_SYM}{1,}"
	REGEX_GREP_RANGE="${REGEX_GREP_BASE}[, ]{1,}0[, ]{1,}0"
	REGEX_GREP_MIN="${REGEX_GREP_BASE}[, ]{1,}${REGEX_SYM}{1,}[, ]{1,}0"
	REGEX_GREP_MAX="${REGEX_GREP_BASE}[, ]{1,}0[, ]{1,}${REGEX_SYM}{1,}"

	REGEX_SED_BASE="s/idr_alloc_range(\(${REGEX_SYM}\{1,\}[, ]\{1,\}${REGEX_SYM}\{1,\}\)"
	REGEX_SED_RANGE="${REGEX_SED_BASE}[, ]\{1,\}0[, ]\{1,\}0/idr_alloc(\1/g"
	REGEX_SED_MIN="${REGEX_SED_BASE}\([, ]\{1,\}${REGEX_SYM}\{1,\}\)[, ]\{1,\}0/idr_alloc_min(\1\2/g"
	REGEX_SED_MAX="${REGEX_SED_BASE}[, ]\{1,\}0\([, ]\{1,\}${REGEX_SYM}\{1,\}\)/idr_alloc_max(\1\2/g"

	# Replace all occurences of idr_alloc() with idr_alloc_range()
	for ff in $(grep -REHli "idr_alloc\(" --exclude-dir=include --exclude-dir=lib --exclude-dir=Documentation)
	do
		sed -i 's/idr_alloc(/idr_alloc_range(/g' $ff
	done

	# Find all occurences of idr_alloc_range() where @start and @end are 0, replace
	# it with idr_alloc() and remove @start and @end parameters.
	for ff in $(grep -REHli "${REGEX_GREP_RANGE}")
	do
		sed -i "$REGEX_SED_RANGE" $ff
	done

	# Find all occurences of idr_alloc_range() where only @end is 0, replace it
	# with idr_alloc_min() and remove the @end parameter.
	for ff in $(grep -REHli "${REGEX_GREP_MIN}")
	do
		sed -i "$REGEX_SED_MIN" $ff
	done

	# Find all occurences of idr_alloc_range() where only @start is 0, replace it
	# with idr_alloc_max() and remove the @start parameter.
	for ff in $(grep -REHli "${REGEX_GREP_MAX}")
	do
		sed -i "$REGEX_SED_MAX" $ff
	done
```

Statements spanning multiple lines as well as indentation were done by
hand.

This patch was compile-time tested building a x86_64 kernel with
`make allyesconfig'.

Additionally, idr-test from tools/testing/radix-tree/ completed
successfully:

	vvv Ignore these warnings
	assertion failed at idr.c:269
	assertion failed at idr.c:206
	^^^ Warnings over
	IDA: 75339420 of 75339420 tests passed

Signed-off-by: Danilo Krummrich <dakr@...hat.com>
---
This patch is based on Linus' master branch, there is one known conflict with
next/master in file drivers/net/ethernet/mellanox/mlxsw/spectrum_pgt.c which
introduces another usage of the old idr_alloc().
---
 arch/powerpc/kvm/book3s_hv_nested.c           |  4 +-
 arch/x86/kvm/hyperv.c                         |  4 +-
 arch/x86/kvm/xen.c                            |  4 +-
 drivers/atm/nicstar.c                         |  4 +-
 drivers/block/drbd/drbd_main.c                |  7 +-
 drivers/block/loop.c                          |  4 +-
 drivers/block/nbd.c                           |  6 +-
 drivers/block/zram/zram_drv.c                 |  2 +-
 drivers/char/tpm/tpm-chip.c                   |  2 +-
 drivers/crypto/hisilicon/hpre/hpre_crypto.c   |  2 +-
 drivers/dca/dca-sysfs.c                       |  2 +-
 drivers/firewire/core-cdev.c                  |  2 +-
 drivers/firewire/core-device.c                |  4 +-
 drivers/firmware/arm_scmi/bus.c               |  4 +-
 drivers/firmware/arm_scmi/driver.c            | 16 ++---
 drivers/fpga/dfl.c                            |  2 +-
 drivers/gpio/gpio-aggregator.c                |  2 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c   |  2 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c       |  2 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c       | 12 ++--
 drivers/gpu/drm/amd/amdkfd/kfd_chardev.c      |  4 +-
 drivers/gpu/drm/amd/amdkfd/kfd_events.c       | 20 +++---
 drivers/gpu/drm/amd/amdkfd/kfd_process.c      |  2 +-
 drivers/gpu/drm/display/drm_dp_aux_dev.c      |  2 +-
 drivers/gpu/drm/drm_auth.c                    |  4 +-
 drivers/gpu/drm/drm_connector.c               |  2 +-
 drivers/gpu/drm/drm_context.c                 |  4 +-
 drivers/gpu/drm/drm_drv.c                     | 10 +--
 drivers/gpu/drm/drm_gem.c                     |  4 +-
 drivers/gpu/drm/drm_lease.c                   |  8 +--
 drivers/gpu/drm/drm_mode_object.c             |  4 +-
 drivers/gpu/drm/drm_syncobj.c                 |  4 +-
 .../drm/i915/gem/selftests/i915_gem_context.c |  4 +-
 drivers/gpu/drm/i915/gvt/dmabuf.c             |  2 +-
 drivers/gpu/drm/i915/gvt/vgpu.c               |  4 +-
 drivers/gpu/drm/i915/i915_perf.c              |  5 +-
 drivers/gpu/drm/i915/selftests/i915_perf.c    |  2 +-
 drivers/gpu/drm/qxl/qxl_cmd.c                 |  2 +-
 drivers/gpu/drm/qxl/qxl_release.c             |  2 +-
 drivers/gpu/drm/sis/sis_mm.c                  |  2 +-
 drivers/gpu/drm/tegra/drm.c                   |  2 +-
 drivers/gpu/drm/v3d/v3d_perfmon.c             |  4 +-
 drivers/gpu/drm/vc4/vc4_perfmon.c             |  4 +-
 drivers/gpu/drm/vgem/vgem_fence.c             |  2 +-
 drivers/gpu/drm/via/via_mm.c                  |  2 +-
 drivers/gpu/drm/vmwgfx/ttm_object.c           |  2 +-
 drivers/gpu/drm/vmwgfx/vmwgfx_resource.c      |  2 +-
 .../hwtracing/coresight/coresight-tmc-etr.c   |  2 +-
 drivers/i2c/i2c-core-base.c                   |  7 +-
 drivers/i3c/master.c                          |  2 +-
 drivers/interconnect/core.c                   |  2 +-
 drivers/md/dm.c                               |  4 +-
 drivers/memstick/core/memstick.c              |  2 +-
 drivers/memstick/core/ms_block.c              |  2 +-
 drivers/memstick/core/mspro_block.c           |  2 +-
 drivers/misc/c2port/core.c                    |  2 +-
 drivers/misc/cardreader/rtsx_pcr.c            |  2 +-
 drivers/misc/cxl/context.c                    |  4 +-
 drivers/misc/cxl/main.c                       |  2 +-
 .../habanalabs/common/command_submission.c    |  2 +-
 drivers/misc/habanalabs/common/context.c      |  2 +-
 .../misc/habanalabs/common/habanalabs_drv.c   |  6 +-
 drivers/misc/habanalabs/common/memory.c       |  4 +-
 drivers/misc/habanalabs/common/memory_mgr.c   |  2 +-
 drivers/misc/mei/main.c                       |  2 +-
 drivers/misc/ocxl/afu_irq.c                   |  4 +-
 drivers/misc/ocxl/context.c                   |  4 +-
 drivers/misc/ocxl/file.c                      |  2 +-
 drivers/misc/tifm_core.c                      |  2 +-
 drivers/mtd/mtdcore.c                         |  4 +-
 drivers/mtd/ubi/block.c                       |  2 +-
 .../ethernet/intel/ice/ice_virtchnl_fdir.c    |  4 +-
 .../mellanox/mlxsw/spectrum_policer.c         |  4 +-
 .../ethernet/mellanox/mlxsw/spectrum_router.c |  4 +-
 .../net/ethernet/netronome/nfp/flower/main.c  |  5 +-
 drivers/net/ppp/ppp_generic.c                 |  4 +-
 drivers/net/tap.c                             |  2 +-
 drivers/net/wireless/ath/ath10k/htt_tx.c      |  4 +-
 drivers/net/wireless/ath/ath10k/wmi-tlv.c     |  5 +-
 drivers/net/wireless/ath/ath11k/dbring.c      |  2 +-
 drivers/net/wireless/ath/ath11k/dp_rx.c       | 14 ++--
 drivers/net/wireless/ath/ath11k/dp_tx.c       |  4 +-
 drivers/net/wireless/ath/ath11k/mac.c         |  5 +-
 drivers/net/wireless/marvell/mwifiex/main.c   |  4 +-
 drivers/net/wireless/mediatek/mt76/mt76.h     |  2 +-
 drivers/net/wireless/mediatek/mt76/tx.c       |  6 +-
 drivers/of/overlay.c                          |  2 +-
 drivers/pci/endpoint/pci-ep-cfs.c             |  2 +-
 drivers/power/supply/bq2415x_charger.c        |  2 +-
 drivers/power/supply/bq27xxx_battery_i2c.c    |  2 +-
 drivers/power/supply/ds2782_battery.c         |  2 +-
 drivers/powercap/powercap_sys.c               |  2 +-
 drivers/pps/pps.c                             |  4 +-
 drivers/ptp/ptp_ocp.c                         |  2 +-
 drivers/remoteproc/remoteproc_core.c          |  2 +-
 drivers/reset/reset-ti-sci.c                  |  2 +-
 drivers/rpmsg/qcom_glink_native.c             |  6 +-
 drivers/rpmsg/virtio_rpmsg_bus.c              |  2 +-
 drivers/scsi/bfa/bfad_im.c                    |  2 +-
 drivers/scsi/ch.c                             |  2 +-
 drivers/scsi/cxlflash/ocxl_hw.c               |  2 +-
 drivers/scsi/lpfc/lpfc_init.c                 |  2 +-
 drivers/scsi/scsi_transport_iscsi.c           |  3 +-
 drivers/scsi/sg.c                             |  2 +-
 drivers/scsi/st.c                             |  2 +-
 drivers/soc/qcom/apr.c                        |  2 +-
 drivers/spi/spi.c                             | 12 ++--
 drivers/staging/greybus/uart.c                |  2 +-
 drivers/staging/pi433/pi433_if.c              |  2 +-
 .../vc04_services/vchiq-mmal/mmal-vchiq.c     |  3 +-
 drivers/target/iscsi/iscsi_target.c           |  2 +-
 drivers/tee/optee/supp.c                      |  2 +-
 drivers/tee/tee_shm.c                         |  4 +-
 drivers/tty/rpmsg_tty.c                       |  2 +-
 drivers/tty/serial/mps2-uart.c                |  2 +-
 drivers/uio/uio.c                             |  2 +-
 drivers/usb/class/cdc-acm.c                   |  2 +-
 drivers/usb/core/hcd.c                        |  2 +-
 drivers/usb/host/xhci-dbgtty.c                |  2 +-
 drivers/usb/serial/usb-serial.c               |  5 +-
 drivers/vdpa/vdpa_user/vduse_dev.c            |  2 +-
 fs/cifs/cifs_swn.c                            |  2 +-
 fs/dlm/lock.c                                 |  2 +-
 fs/dlm/recover.c                              |  2 +-
 fs/erofs/super.c                              |  4 +-
 fs/nfs/nfs4client.c                           |  2 +-
 fs/ocfs2/cluster/tcp.c                        |  2 +-
 include/linux/idr.h                           | 68 ++++++++++++++++++-
 ipc/util.c                                    |  4 +-
 kernel/cgroup/cgroup.c                        |  2 +-
 kernel/events/core.c                          |  2 +-
 kernel/irq/timings.c                          |  2 +-
 kernel/pid.c                                  |  4 +-
 kernel/workqueue.c                            |  4 +-
 lib/idr.c                                     |  6 +-
 mm/memcontrol.c                               |  4 +-
 mm/vmscan.c                                   |  2 +-
 net/9p/client.c                               |  6 +-
 net/bluetooth/hci_core.c                      |  4 +-
 net/core/net_namespace.c                      |  2 +-
 net/mac80211/cfg.c                            | 10 +--
 net/mac80211/tx.c                             |  4 +-
 net/tipc/topsrv.c                             |  2 +-
 security/apparmor/secid.c                     |  2 +-
 sound/ac97/bus.c                              |  2 +-
 sound/soc/qcom/qdsp6/q6apm.c                  |  2 +-
 sound/soc/qcom/qdsp6/topology.c               |  9 +--
 tools/testing/radix-tree/idr-test.c           | 56 +++++++--------
 148 files changed, 356 insertions(+), 282 deletions(-)

diff --git a/arch/powerpc/kvm/book3s_hv_nested.c b/arch/powerpc/kvm/book3s_hv_nested.c
index 0644732d1a25..3ebba1512f1f 100644
--- a/arch/powerpc/kvm/book3s_hv_nested.c
+++ b/arch/powerpc/kvm/book3s_hv_nested.c
@@ -665,8 +665,8 @@ static struct kvm_nested_guest *__find_nested(struct kvm *kvm, int lpid)
 
 static bool __prealloc_nested(struct kvm *kvm, int lpid)
 {
-	if (idr_alloc(&kvm->arch.kvm_nested_guest_idr,
-				NULL, lpid, lpid + 1, GFP_KERNEL) != lpid)
+	if (idr_alloc_range(&kvm->arch.kvm_nested_guest_idr, NULL,
+			    lpid, lpid + 1, GFP_KERNEL) != lpid)
 		return false;
 	return true;
 }
diff --git a/arch/x86/kvm/hyperv.c b/arch/x86/kvm/hyperv.c
index e2e95a6fccfd..db762513b596 100644
--- a/arch/x86/kvm/hyperv.c
+++ b/arch/x86/kvm/hyperv.c
@@ -2390,8 +2390,8 @@ static int kvm_hv_eventfd_assign(struct kvm *kvm, u32 conn_id, int fd)
 		return PTR_ERR(eventfd);
 
 	mutex_lock(&hv->hv_lock);
-	ret = idr_alloc(&hv->conn_to_evt, eventfd, conn_id, conn_id + 1,
-			GFP_KERNEL_ACCOUNT);
+	ret = idr_alloc_range(&hv->conn_to_evt, eventfd, conn_id, conn_id + 1,
+			      GFP_KERNEL_ACCOUNT);
 	mutex_unlock(&hv->hv_lock);
 
 	if (ret >= 0)
diff --git a/arch/x86/kvm/xen.c b/arch/x86/kvm/xen.c
index 610beba35907..186b1c40d919 100644
--- a/arch/x86/kvm/xen.c
+++ b/arch/x86/kvm/xen.c
@@ -1707,8 +1707,8 @@ static int kvm_xen_eventfd_assign(struct kvm *kvm,
 	}
 
 	mutex_lock(&kvm->lock);
-	ret = idr_alloc(&kvm->arch.xen.evtchn_ports, evtchnfd, port, port + 1,
-			GFP_KERNEL);
+	ret = idr_alloc_range(&kvm->arch.xen.evtchn_ports, evtchnfd, port,
+			      port + 1, GFP_KERNEL);
 	mutex_unlock(&kvm->lock);
 	if (ret >= 0)
 		return 0;
diff --git a/drivers/atm/nicstar.c b/drivers/atm/nicstar.c
index 1a50de39f5b5..02f45b1d48cc 100644
--- a/drivers/atm/nicstar.c
+++ b/drivers/atm/nicstar.c
@@ -1016,11 +1016,11 @@ static void push_rxbufs(ns_dev * card, struct sk_buff *skb)
 				card->lbfqc += 2;
 		}
 
-		id1 = idr_alloc(&card->idr, handle1, 0, 0, GFP_ATOMIC);
+		id1 = idr_alloc(&card->idr, handle1, GFP_ATOMIC);
 		if (id1 < 0)
 			goto out;
 
-		id2 = idr_alloc(&card->idr, handle2, 0, 0, GFP_ATOMIC);
+		id2 = idr_alloc(&card->idr, handle2, GFP_ATOMIC);
 		if (id2 < 0)
 			goto out;
 
diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c
index 2887350ae010..2b4d89909d49 100644
--- a/drivers/block/drbd/drbd_main.c
+++ b/drivers/block/drbd/drbd_main.c
@@ -2729,7 +2729,7 @@ enum drbd_ret_code drbd_create_device(struct drbd_config_context *adm_ctx, unsig
 	device->read_requests = RB_ROOT;
 	device->write_requests = RB_ROOT;
 
-	id = idr_alloc(&drbd_devices, device, minor, minor + 1, GFP_KERNEL);
+	id = idr_alloc_range(&drbd_devices, device, minor, minor + 1, GFP_KERNEL);
 	if (id < 0) {
 		if (id == -ENOSPC)
 			err = ERR_MINOR_OR_VOLUME_EXISTS;
@@ -2737,7 +2737,7 @@ enum drbd_ret_code drbd_create_device(struct drbd_config_context *adm_ctx, unsig
 	}
 	kref_get(&device->kref);
 
-	id = idr_alloc(&resource->devices, device, vnr, vnr + 1, GFP_KERNEL);
+	id = idr_alloc_range(&resource->devices, device, vnr, vnr + 1, GFP_KERNEL);
 	if (id < 0) {
 		if (id == -ENOSPC)
 			err = ERR_MINOR_OR_VOLUME_EXISTS;
@@ -2757,7 +2757,8 @@ enum drbd_ret_code drbd_create_device(struct drbd_config_context *adm_ctx, unsig
 		list_add(&peer_device->peer_devices, &device->peer_devices);
 		kref_get(&device->kref);
 
-		id = idr_alloc(&connection->peer_devices, peer_device, vnr, vnr + 1, GFP_KERNEL);
+		id = idr_alloc_range(&connection->peer_devices, peer_device, vnr, vnr + 1,
+				    GFP_KERNEL);
 		if (id < 0) {
 			if (id == -ENOSPC)
 				err = ERR_INVALID_REQUEST;
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index 084f9b8a0ba3..6df3d2ed2a2c 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -1951,11 +1951,11 @@ static int loop_add(int i)
 
 	/* allocate id, if @id >= 0, we're requesting that specific id */
 	if (i >= 0) {
-		err = idr_alloc(&loop_index_idr, lo, i, i + 1, GFP_KERNEL);
+		err = idr_alloc_range(&loop_index_idr, lo, i, i + 1, GFP_KERNEL);
 		if (err == -ENOSPC)
 			err = -EEXIST;
 	} else {
-		err = idr_alloc(&loop_index_idr, lo, 0, 0, GFP_KERNEL);
+		err = idr_alloc(&loop_index_idr, lo, GFP_KERNEL);
 	}
 	mutex_unlock(&loop_ctl_mutex);
 	if (err < 0)
diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c
index 07f3c139a3d7..854d155dff7c 100644
--- a/drivers/block/nbd.c
+++ b/drivers/block/nbd.c
@@ -1763,12 +1763,12 @@ static struct nbd_device *nbd_dev_add(int index, unsigned int refs)
 
 	mutex_lock(&nbd_index_mutex);
 	if (index >= 0) {
-		err = idr_alloc(&nbd_index_idr, nbd, index, index + 1,
-				GFP_KERNEL);
+		err = idr_alloc_range(&nbd_index_idr, nbd, index, index + 1,
+				      GFP_KERNEL);
 		if (err == -ENOSPC)
 			err = -EEXIST;
 	} else {
-		err = idr_alloc(&nbd_index_idr, nbd, 0, 0, GFP_KERNEL);
+		err = idr_alloc(&nbd_index_idr, nbd, GFP_KERNEL);
 		if (err >= 0)
 			index = err;
 	}
diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c
index b8549c61ff2c..c65efbef323d 100644
--- a/drivers/block/zram/zram_drv.c
+++ b/drivers/block/zram/zram_drv.c
@@ -1890,7 +1890,7 @@ static int zram_add(void)
 	if (!zram)
 		return -ENOMEM;
 
-	ret = idr_alloc(&zram_index_idr, zram, 0, 0, GFP_KERNEL);
+	ret = idr_alloc(&zram_index_idr, zram, GFP_KERNEL);
 	if (ret < 0)
 		goto out_free_dev;
 	device_id = ret;
diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c
index 783d65fc71f0..4adc3ea9b7ca 100644
--- a/drivers/char/tpm/tpm-chip.c
+++ b/drivers/char/tpm/tpm-chip.c
@@ -326,7 +326,7 @@ struct tpm_chip *tpm_chip_alloc(struct device *pdev,
 	chip->ops = ops;
 
 	mutex_lock(&idr_lock);
-	rc = idr_alloc(&dev_nums_idr, NULL, 0, TPM_NUM_DEVICES, GFP_KERNEL);
+	rc = idr_alloc_max(&dev_nums_idr, NULL, TPM_NUM_DEVICES, GFP_KERNEL);
 	mutex_unlock(&idr_lock);
 	if (rc < 0) {
 		dev_err(pdev, "No available tpm device numbers\n");
diff --git a/drivers/crypto/hisilicon/hpre/hpre_crypto.c b/drivers/crypto/hisilicon/hpre/hpre_crypto.c
index 97d54c1465c2..68d1d5ea5476 100644
--- a/drivers/crypto/hisilicon/hpre/hpre_crypto.c
+++ b/drivers/crypto/hisilicon/hpre/hpre_crypto.c
@@ -147,7 +147,7 @@ static int hpre_alloc_req_id(struct hpre_ctx *ctx)
 	int id;
 
 	spin_lock_irqsave(&ctx->req_lock, flags);
-	id = idr_alloc(&ctx->req_idr, NULL, 0, QM_Q_DEPTH, GFP_ATOMIC);
+	id = idr_alloc_max(&ctx->req_idr, NULL, QM_Q_DEPTH, GFP_ATOMIC);
 	spin_unlock_irqrestore(&ctx->req_lock, flags);
 
 	return id;
diff --git a/drivers/dca/dca-sysfs.c b/drivers/dca/dca-sysfs.c
index 21ebd0af268b..c91994ff8a6c 100644
--- a/drivers/dca/dca-sysfs.c
+++ b/drivers/dca/dca-sysfs.c
@@ -40,7 +40,7 @@ int dca_sysfs_add_provider(struct dca_provider *dca, struct device *dev)
 	idr_preload(GFP_KERNEL);
 	spin_lock(&dca_idr_lock);
 
-	ret = idr_alloc(&dca_idr, dca, 0, 0, GFP_NOWAIT);
+	ret = idr_alloc(&dca_idr, dca, GFP_NOWAIT);
 	if (ret >= 0)
 		dca->id = ret;
 
diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c
index 9c89f7d53e99..b33201b75898 100644
--- a/drivers/firewire/core-cdev.c
+++ b/drivers/firewire/core-cdev.c
@@ -485,7 +485,7 @@ static int add_client_resource(struct client *client,
 	if (client->in_shutdown)
 		ret = -ECANCELED;
 	else
-		ret = idr_alloc(&client->resource_idr, resource, 0, 0,
+		ret = idr_alloc(&client->resource_idr, resource,
 				GFP_NOWAIT);
 	if (ret >= 0) {
 		resource->handle = ret;
diff --git a/drivers/firewire/core-device.c b/drivers/firewire/core-device.c
index adddd8c45d0c..5c599658a5d5 100644
--- a/drivers/firewire/core-device.c
+++ b/drivers/firewire/core-device.c
@@ -1024,8 +1024,8 @@ static void fw_device_init(struct work_struct *work)
 
 	fw_device_get(device);
 	down_write(&fw_device_rwsem);
-	minor = idr_alloc(&fw_device_idr, device, 0, 1 << MINORBITS,
-			GFP_KERNEL);
+	minor = idr_alloc_max(&fw_device_idr, device, 1 << MINORBITS,
+			      GFP_KERNEL);
 	up_write(&fw_device_rwsem);
 
 	if (minor < 0)
diff --git a/drivers/firmware/arm_scmi/bus.c b/drivers/firmware/arm_scmi/bus.c
index f6fe723ab869..dfb867958a46 100644
--- a/drivers/firmware/arm_scmi/bus.c
+++ b/drivers/firmware/arm_scmi/bus.c
@@ -236,8 +236,8 @@ int scmi_protocol_register(const struct scmi_protocol *proto)
 	}
 
 	spin_lock(&protocol_lock);
-	ret = idr_alloc(&scmi_protocols, (void *)proto,
-			proto->id, proto->id + 1, GFP_ATOMIC);
+	ret = idr_alloc_range(&scmi_protocols, (void *)proto,
+			      proto->id, proto->id + 1, GFP_ATOMIC);
 	spin_unlock(&protocol_lock);
 	if (ret != proto->id) {
 		pr_err("unable to allocate SCMI idr slot for 0x%x - err %d\n",
diff --git a/drivers/firmware/arm_scmi/driver.c b/drivers/firmware/arm_scmi/driver.c
index c1922bd650ae..a8f1996de7c8 100644
--- a/drivers/firmware/arm_scmi/driver.c
+++ b/drivers/firmware/arm_scmi/driver.c
@@ -1333,8 +1333,8 @@ scmi_alloc_init_protocol_instance(struct scmi_info *info,
 	if (ret)
 		goto clean;
 
-	ret = idr_alloc(&info->protocols, pi, proto->id, proto->id + 1,
-			GFP_KERNEL);
+	ret = idr_alloc_range(&info->protocols, pi, proto->id, proto->id + 1,
+			      GFP_KERNEL);
 	if (ret != proto->id)
 		goto clean;
 
@@ -1798,7 +1798,7 @@ static int scmi_chan_setup(struct scmi_info *info, struct device *dev,
 	}
 
 idr_alloc:
-	ret = idr_alloc(idr, cinfo, prot_id, prot_id + 1, GFP_KERNEL);
+	ret = idr_alloc_range(idr, cinfo, prot_id, prot_id + 1, GFP_KERNEL);
 	if (ret != prot_id) {
 		dev_err(dev, "unable to allocate SCMI idr slot err %d\n", ret);
 		return ret;
@@ -1992,9 +1992,9 @@ int scmi_protocol_device_request(const struct scmi_device_id *id_table)
 		}
 		INIT_LIST_HEAD(phead);
 
-		ret = idr_alloc(&scmi_requested_devices, (void *)phead,
-				id_table->protocol_id,
-				id_table->protocol_id + 1, GFP_KERNEL);
+		ret = idr_alloc_range(&scmi_requested_devices, (void *)phead,
+				      id_table->protocol_id,
+				      id_table->protocol_id + 1, GFP_KERNEL);
 		if (ret != id_table->protocol_id) {
 			pr_err("Failed to save SCMI device - ret:%d\n", ret);
 			kfree(rdev);
@@ -2197,8 +2197,8 @@ static int scmi_probe(struct platform_device *pdev)
 		 * Save this valid DT protocol descriptor amongst
 		 * @active_protocols for this SCMI instance/
 		 */
-		ret = idr_alloc(&info->active_protocols, child,
-				prot_id, prot_id + 1, GFP_KERNEL);
+		ret = idr_alloc_range(&info->active_protocols, child,
+				      prot_id, prot_id + 1, GFP_KERNEL);
 		if (ret != prot_id) {
 			dev_err(dev, "SCMI protocol %d already activated. Skip\n",
 				prot_id);
diff --git a/drivers/fpga/dfl.c b/drivers/fpga/dfl.c
index 6bff39ff21a0..68fcb7f55046 100644
--- a/drivers/fpga/dfl.c
+++ b/drivers/fpga/dfl.c
@@ -104,7 +104,7 @@ static int dfl_id_alloc(enum dfl_id_type type, struct device *dev)
 
 	WARN_ON(type >= DFL_ID_MAX);
 	mutex_lock(&dfl_id_mutex);
-	id = idr_alloc(&dfl_devs[type].id, dev, 0, 0, GFP_KERNEL);
+	id = idr_alloc(&dfl_devs[type].id, dev, GFP_KERNEL);
 	mutex_unlock(&dfl_id_mutex);
 
 	return id;
diff --git a/drivers/gpio/gpio-aggregator.c b/drivers/gpio/gpio-aggregator.c
index 0cb2664085cf..672e9c5ac9c7 100644
--- a/drivers/gpio/gpio-aggregator.c
+++ b/drivers/gpio/gpio-aggregator.c
@@ -131,7 +131,7 @@ static ssize_t new_device_store(struct device_driver *driver, const char *buf,
 	}
 
 	mutex_lock(&gpio_aggregator_lock);
-	id = idr_alloc(&gpio_aggregator_idr, aggr, 0, 0, GFP_KERNEL);
+	id = idr_alloc(&gpio_aggregator_idr, aggr, GFP_KERNEL);
 	mutex_unlock(&gpio_aggregator_lock);
 
 	if (id < 0) {
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
index 714178f1b6c6..543c2d728855 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
@@ -285,7 +285,7 @@ int amdgpu_bo_list_ioctl(struct drm_device *dev, void *data,
 			goto error_free;
 
 		mutex_lock(&fpriv->bo_list_lock);
-		r = idr_alloc(&fpriv->bo_list_handles, list, 1, 0, GFP_KERNEL);
+		r = idr_alloc_min(&fpriv->bo_list_handles, list, 1, GFP_KERNEL);
 		mutex_unlock(&fpriv->bo_list_lock);
 		if (r < 0) {
 			goto error_put_list;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
index 7dc92ef36b2b..88abbc02c858 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
@@ -450,7 +450,7 @@ static int amdgpu_ctx_alloc(struct amdgpu_device *adev,
 		return -ENOMEM;
 
 	mutex_lock(&mgr->lock);
-	r = idr_alloc(&mgr->ctx_handles, ctx, 1, AMDGPU_VM_MAX_NUM_CTX, GFP_KERNEL);
+	r = idr_alloc_range(&mgr->ctx_handles, ctx, 1, AMDGPU_VM_MAX_NUM_CTX, GFP_KERNEL);
 	if (r < 0) {
 		mutex_unlock(&mgr->lock);
 		kfree(ctx);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c
index 69a70a0aaed9..0912709a1dae 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c
@@ -274,8 +274,8 @@ int amdgpu_mes_create_process(struct amdgpu_device *adev, int pasid,
 	amdgpu_mes_lock(&adev->mes);
 
 	/* add the mes process to idr list */
-	r = idr_alloc(&adev->mes.pasid_idr, process, pasid, pasid + 1,
-		      GFP_KERNEL);
+	r = idr_alloc_range(&adev->mes.pasid_idr, process, pasid, pasid + 1,
+			    GFP_KERNEL);
 	if (r < 0) {
 		DRM_ERROR("failed to lock pasid=%d\n", pasid);
 		goto clean_up_ctx;
@@ -419,8 +419,8 @@ int amdgpu_mes_add_gang(struct amdgpu_device *adev, int pasid,
 	}
 
 	/* add the mes gang to idr list */
-	r = idr_alloc(&adev->mes.gang_id_idr, gang, 1, 0,
-		      GFP_KERNEL);
+	r = idr_alloc_min(&adev->mes.gang_id_idr, gang, 1,
+			  GFP_KERNEL);
 	if (r < 0) {
 		DRM_ERROR("failed to allocate idr for gang\n");
 		goto clean_up_ctx;
@@ -637,8 +637,8 @@ int amdgpu_mes_add_hw_queue(struct amdgpu_device *adev, int gang_id,
 
 	/* add the mes gang to idr list */
 	spin_lock_irqsave(&adev->mes.queue_id_lock, flags);
-	r = idr_alloc(&adev->mes.queue_id_idr, queue, 1, 0,
-		      GFP_ATOMIC);
+	r = idr_alloc_min(&adev->mes.queue_id_idr, queue, 1,
+			  GFP_ATOMIC);
 	if (r < 0) {
 		spin_unlock_irqrestore(&adev->mes.queue_id_lock, flags);
 		goto clean_up_mqd;
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
index 1c7016958d6d..b1249855bab0 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
@@ -2127,8 +2127,8 @@ static int criu_restore_memory_of_gpu(struct kfd_process_device *pdd,
 
 	/* Restore previous IDR handle */
 	pr_debug("Restoring old IDR handle for the BO");
-	idr_handle = idr_alloc(&pdd->alloc_idr, *kgd_mem, bo_priv->idr_handle,
-			       bo_priv->idr_handle + 1, GFP_KERNEL);
+	idr_handle = idr_alloc_range(&pdd->alloc_idr, *kgd_mem, bo_priv->idr_handle,
+				     bo_priv->idr_handle + 1, GFP_KERNEL);
 
 	if (idr_handle < 0) {
 		pr_err("Could not allocate idr\n");
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_events.c b/drivers/gpu/drm/amd/amdkfd/kfd_events.c
index 4df9c36146ba..672ede6bc763 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_events.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_events.c
@@ -106,8 +106,8 @@ static int allocate_event_notification_slot(struct kfd_process *p,
 	}
 
 	if (restore_id) {
-		id = idr_alloc(&p->event_idr, ev, *restore_id, *restore_id + 1,
-				GFP_KERNEL);
+		id = idr_alloc_range(&p->event_idr, ev, *restore_id, *restore_id + 1,
+				     GFP_KERNEL);
 	} else {
 		/*
 		 * Compatibility with old user mode: Only use signal slots
@@ -115,8 +115,8 @@ static int allocate_event_notification_slot(struct kfd_process *p,
 		 * KFD_SIGNAL_EVENT_LIMIT. This also allows future increase
 		 * of the event limit without breaking user mode.
 		 */
-		id = idr_alloc(&p->event_idr, ev, 0, p->signal_mapped_size / 8,
-				GFP_KERNEL);
+		id = idr_alloc_max(&p->event_idr, ev, p->signal_mapped_size / 8,
+				   GFP_KERNEL);
 	}
 	if (id < 0)
 		return id;
@@ -219,17 +219,17 @@ static int create_other_event(struct kfd_process *p, struct kfd_event *ev, const
 	int id;
 
 	if (restore_id)
-		id = idr_alloc(&p->event_idr, ev, *restore_id, *restore_id + 1,
-			GFP_KERNEL);
+		id = idr_alloc_range(&p->event_idr, ev, *restore_id, *restore_id + 1,
+				     GFP_KERNEL);
 	else
 		/* Cast KFD_LAST_NONSIGNAL_EVENT to uint32_t. This allows an
 		 * intentional integer overflow to -1 without a compiler
 		 * warning. idr_alloc treats a negative value as "maximum
 		 * signed integer".
 		 */
-		id = idr_alloc(&p->event_idr, ev, KFD_FIRST_NONSIGNAL_EVENT_ID,
-				(uint32_t)KFD_LAST_NONSIGNAL_EVENT_ID + 1,
-				GFP_KERNEL);
+		id = idr_alloc_range(&p->event_idr, ev, KFD_FIRST_NONSIGNAL_EVENT_ID,
+				     (uint32_t)KFD_LAST_NONSIGNAL_EVENT_ID + 1,
+				     GFP_KERNEL);
 
 	if (id < 0)
 		return id;
@@ -249,7 +249,7 @@ int kfd_event_init_process(struct kfd_process *p)
 	/* Allocate event ID 0. It is used for a fast path to ignore bogus events
 	 * that are sent by the CP without a context ID
 	 */
-	id = idr_alloc(&p->event_idr, NULL, 0, 1, GFP_KERNEL);
+	id = idr_alloc_max(&p->event_idr, NULL, 1, GFP_KERNEL);
 	if (id < 0) {
 		idr_destroy(&p->event_idr);
 		mutex_destroy(&p->event_mutex);
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
index e3d64ec8c353..a1032f0dc9c4 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
@@ -1669,7 +1669,7 @@ struct kfd_process_device *kfd_bind_process_to_device(struct kfd_dev *dev,
 int kfd_process_device_create_obj_handle(struct kfd_process_device *pdd,
 					void *mem)
 {
-	return idr_alloc(&pdd->alloc_idr, mem, 0, 0, GFP_KERNEL);
+	return idr_alloc(&pdd->alloc_idr, mem, GFP_KERNEL);
 }
 
 /* Translate specific handle from process local memory idr
diff --git a/drivers/gpu/drm/display/drm_dp_aux_dev.c b/drivers/gpu/drm/display/drm_dp_aux_dev.c
index 098e482e65a2..a59446e3f558 100644
--- a/drivers/gpu/drm/display/drm_dp_aux_dev.c
+++ b/drivers/gpu/drm/display/drm_dp_aux_dev.c
@@ -83,7 +83,7 @@ static struct drm_dp_aux_dev *alloc_drm_dp_aux_dev(struct drm_dp_aux *aux)
 	kref_init(&aux_dev->refcount);
 
 	mutex_lock(&aux_idr_mutex);
-	index = idr_alloc(&aux_idr, aux_dev, 0, DRM_AUX_MINORS, GFP_KERNEL);
+	index = idr_alloc_max(&aux_idr, aux_dev, DRM_AUX_MINORS, GFP_KERNEL);
 	mutex_unlock(&aux_idr_mutex);
 	if (index < 0) {
 		kfree(aux_dev);
diff --git a/drivers/gpu/drm/drm_auth.c b/drivers/gpu/drm/drm_auth.c
index 6e433d465f41..fc793af28659 100644
--- a/drivers/gpu/drm/drm_auth.c
+++ b/drivers/gpu/drm/drm_auth.c
@@ -98,8 +98,8 @@ int drm_getmagic(struct drm_device *dev, void *data, struct drm_file *file_priv)
 
 	mutex_lock(&dev->master_mutex);
 	if (!file_priv->magic) {
-		ret = idr_alloc(&file_priv->master->magic_map, file_priv,
-				1, 0, GFP_KERNEL);
+		ret = idr_alloc_min(&file_priv->master->magic_map, file_priv, 1,
+				    GFP_KERNEL);
 		if (ret >= 0)
 			file_priv->magic = ret;
 	}
diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
index 1c48d162c77e..710321bf3c84 100644
--- a/drivers/gpu/drm/drm_connector.c
+++ b/drivers/gpu/drm/drm_connector.c
@@ -2912,7 +2912,7 @@ struct drm_tile_group *drm_mode_create_tile_group(struct drm_device *dev,
 	tg->dev = dev;
 
 	mutex_lock(&dev->mode_config.idr_mutex);
-	ret = idr_alloc(&dev->mode_config.tile_idr, tg, 1, 0, GFP_KERNEL);
+	ret = idr_alloc_min(&dev->mode_config.tile_idr, tg, 1, GFP_KERNEL);
 	if (ret >= 0) {
 		tg->id = ret;
 	} else {
diff --git a/drivers/gpu/drm/drm_context.c b/drivers/gpu/drm/drm_context.c
index c6e6a3e7219a..8f460ab16129 100644
--- a/drivers/gpu/drm/drm_context.c
+++ b/drivers/gpu/drm/drm_context.c
@@ -82,8 +82,8 @@ static int drm_legacy_ctxbitmap_next(struct drm_device * dev)
 	int ret;
 
 	mutex_lock(&dev->struct_mutex);
-	ret = idr_alloc(&dev->ctx_idr, NULL, DRM_RESERVED_CONTEXTS, 0,
-			GFP_KERNEL);
+	ret = idr_alloc_min(&dev->ctx_idr, NULL, DRM_RESERVED_CONTEXTS,
+			    GFP_KERNEL);
 	mutex_unlock(&dev->struct_mutex);
 	return ret;
 }
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
index 8214a0b1ab7f..f12974dcbae7 100644
--- a/drivers/gpu/drm/drm_drv.c
+++ b/drivers/gpu/drm/drm_drv.c
@@ -124,11 +124,11 @@ static int drm_minor_alloc(struct drm_device *dev, unsigned int type)
 
 	idr_preload(GFP_KERNEL);
 	spin_lock_irqsave(&drm_minor_lock, flags);
-	r = idr_alloc(&drm_minors_idr,
-		      NULL,
-		      64 * type,
-		      64 * (type + 1),
-		      GFP_NOWAIT);
+	r = idr_alloc_range(&drm_minors_idr,
+			    NULL,
+			    64 * type,
+			    64 * (type + 1),
+			    GFP_NOWAIT);
 	spin_unlock_irqrestore(&drm_minor_lock, flags);
 	idr_preload_end();
 
diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
index eb0c2d041f13..bd3299962f9c 100644
--- a/drivers/gpu/drm/drm_gem.c
+++ b/drivers/gpu/drm/drm_gem.c
@@ -377,7 +377,7 @@ drm_gem_handle_create_tail(struct drm_file *file_priv,
 	idr_preload(GFP_KERNEL);
 	spin_lock(&file_priv->table_lock);
 
-	ret = idr_alloc(&file_priv->object_idr, obj, 1, 0, GFP_NOWAIT);
+	ret = idr_alloc_min(&file_priv->object_idr, obj, 1, GFP_NOWAIT);
 
 	spin_unlock(&file_priv->table_lock);
 	idr_preload_end();
@@ -841,7 +841,7 @@ drm_gem_flink_ioctl(struct drm_device *dev, void *data,
 	}
 
 	if (!obj->name) {
-		ret = idr_alloc(&dev->object_name_idr, obj, 1, 0, GFP_KERNEL);
+		ret = idr_alloc_min(&dev->object_name_idr, obj, 1, GFP_KERNEL);
 		if (ret < 0)
 			goto err;
 
diff --git a/drivers/gpu/drm/drm_lease.c b/drivers/gpu/drm/drm_lease.c
index d72c2fac0ff1..3160fa0e4024 100644
--- a/drivers/gpu/drm/drm_lease.c
+++ b/drivers/gpu/drm/drm_lease.c
@@ -237,7 +237,7 @@ static struct drm_master *drm_lease_create(struct drm_master *lessor, struct idr
 	}
 
 	/* Insert the new lessee into the tree */
-	id = idr_alloc(&(drm_lease_owner(lessor)->lessee_idr), lessee, 1, 0, GFP_KERNEL);
+	id = idr_alloc_min(&(drm_lease_owner(lessor)->lessee_idr), lessee, 1, GFP_KERNEL);
 	if (id < 0) {
 		error = id;
 		goto out_lessee;
@@ -428,7 +428,7 @@ static int fill_object_idr(struct drm_device *dev,
 		 * really want is a 'leased/not-leased' result, for
 		 * which any non-NULL pointer will work fine.
 		 */
-		ret = idr_alloc(leases, &drm_lease_idr_object , object_id, object_id + 1, GFP_KERNEL);
+		ret = idr_alloc_range(leases, &drm_lease_idr_object, object_id, object_id + 1, GFP_KERNEL);
 		if (ret < 0) {
 			DRM_DEBUG_LEASE("Object %d cannot be inserted into leases (%d)\n",
 					object_id, ret);
@@ -437,14 +437,14 @@ static int fill_object_idr(struct drm_device *dev,
 		if (obj->type == DRM_MODE_OBJECT_CRTC && !universal_planes) {
 			struct drm_crtc *crtc = obj_to_crtc(obj);
 
-			ret = idr_alloc(leases, &drm_lease_idr_object, crtc->primary->base.id, crtc->primary->base.id + 1, GFP_KERNEL);
+			ret = idr_alloc_range(leases, &drm_lease_idr_object, crtc->primary->base.id, crtc->primary->base.id + 1, GFP_KERNEL);
 			if (ret < 0) {
 				DRM_DEBUG_LEASE("Object primary plane %d cannot be inserted into leases (%d)\n",
 						object_id, ret);
 				goto out_free_objects;
 			}
 			if (crtc->cursor) {
-				ret = idr_alloc(leases, &drm_lease_idr_object, crtc->cursor->base.id, crtc->cursor->base.id + 1, GFP_KERNEL);
+				ret = idr_alloc_range(leases, &drm_lease_idr_object, crtc->cursor->base.id, crtc->cursor->base.id + 1, GFP_KERNEL);
 				if (ret < 0) {
 					DRM_DEBUG_LEASE("Object cursor plane %d cannot be inserted into leases (%d)\n",
 							object_id, ret);
diff --git a/drivers/gpu/drm/drm_mode_object.c b/drivers/gpu/drm/drm_mode_object.c
index ba1608effc0f..01692c47acea 100644
--- a/drivers/gpu/drm/drm_mode_object.c
+++ b/drivers/gpu/drm/drm_mode_object.c
@@ -45,8 +45,8 @@ int __drm_mode_object_add(struct drm_device *dev, struct drm_mode_object *obj,
 	WARN_ON(!dev->driver->load && dev->registered && !obj_free_cb);
 
 	mutex_lock(&dev->mode_config.idr_mutex);
-	ret = idr_alloc(&dev->mode_config.object_idr, register_obj ? obj : NULL,
-			1, 0, GFP_KERNEL);
+	ret = idr_alloc_min(&dev->mode_config.object_idr,
+			    register_obj ? obj : NULL, 1, GFP_KERNEL);
 	if (ret >= 0) {
 		/*
 		 * Set up the object linking under the protection of the idr
diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c
index 7e48dcd1bee4..6c08efac430d 100644
--- a/drivers/gpu/drm/drm_syncobj.c
+++ b/drivers/gpu/drm/drm_syncobj.c
@@ -539,7 +539,7 @@ int drm_syncobj_get_handle(struct drm_file *file_private,
 
 	idr_preload(GFP_KERNEL);
 	spin_lock(&file_private->syncobj_table_lock);
-	ret = idr_alloc(&file_private->syncobj_idr, syncobj, 1, 0, GFP_NOWAIT);
+	ret = idr_alloc_min(&file_private->syncobj_idr, syncobj, 1, GFP_NOWAIT);
 	spin_unlock(&file_private->syncobj_table_lock);
 
 	idr_preload_end();
@@ -666,7 +666,7 @@ static int drm_syncobj_fd_to_handle(struct drm_file *file_private,
 
 	idr_preload(GFP_KERNEL);
 	spin_lock(&file_private->syncobj_table_lock);
-	ret = idr_alloc(&file_private->syncobj_idr, syncobj, 1, 0, GFP_NOWAIT);
+	ret = idr_alloc_min(&file_private->syncobj_idr, syncobj, 1, GFP_NOWAIT);
 	spin_unlock(&file_private->syncobj_table_lock);
 	idr_preload_end();
 
diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c b/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
index 93a67422ca3b..77600e064029 100644
--- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
@@ -540,8 +540,8 @@ static int file_add_object(struct file *file, struct drm_i915_gem_object *obj)
 	GEM_BUG_ON(obj->base.handle_count);
 
 	/* tie the object to the drm_file for easy reaping */
-	err = idr_alloc(&to_drm_file(file)->object_idr,
-			&obj->base, 1, 0, GFP_KERNEL);
+	err = idr_alloc_min(&to_drm_file(file)->object_idr, &obj->base, 1,
+			    GFP_KERNEL);
 	if (err < 0)
 		return err;
 
diff --git a/drivers/gpu/drm/i915/gvt/dmabuf.c b/drivers/gpu/drm/i915/gvt/dmabuf.c
index 01e54b45c5c1..a58bf1447234 100644
--- a/drivers/gpu/drm/i915/gvt/dmabuf.c
+++ b/drivers/gpu/drm/i915/gvt/dmabuf.c
@@ -462,7 +462,7 @@ int intel_vgpu_query_plane(struct intel_vgpu *vgpu, void *args)
 
 	dmabuf_obj->vgpu = vgpu;
 
-	ret = idr_alloc(&vgpu->object_idr, dmabuf_obj, 1, 0, GFP_NOWAIT);
+	ret = idr_alloc_min(&vgpu->object_idr, dmabuf_obj, 1, GFP_NOWAIT);
 	if (ret < 0)
 		goto out_free_info;
 	gfx_plane_info->dmabuf_id = ret;
diff --git a/drivers/gpu/drm/i915/gvt/vgpu.c b/drivers/gpu/drm/i915/gvt/vgpu.c
index 46da19b3225d..f2b32029abdf 100644
--- a/drivers/gpu/drm/i915/gvt/vgpu.c
+++ b/drivers/gpu/drm/i915/gvt/vgpu.c
@@ -378,8 +378,8 @@ static struct intel_vgpu *__intel_gvt_create_vgpu(struct intel_gvt *gvt,
 	if (!vgpu)
 		return ERR_PTR(-ENOMEM);
 
-	ret = idr_alloc(&gvt->vgpu_idr, vgpu, IDLE_VGPU_IDR + 1, GVT_MAX_VGPU,
-		GFP_KERNEL);
+	ret = idr_alloc_range(&gvt->vgpu_idr, vgpu, IDLE_VGPU_IDR + 1, GVT_MAX_VGPU,
+			      GFP_KERNEL);
 	if (ret < 0)
 		goto out_free_vgpu;
 
diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c
index 1577ab6754db..4bb327f5d3a6 100644
--- a/drivers/gpu/drm/i915/i915_perf.c
+++ b/drivers/gpu/drm/i915/i915_perf.c
@@ -4211,9 +4211,8 @@ int i915_perf_add_config_ioctl(struct drm_device *dev, void *data,
 	}
 
 	/* Config id 0 is invalid, id 1 for kernel stored test config. */
-	oa_config->id = idr_alloc(&perf->metrics_idr,
-				  oa_config, 2,
-				  0, GFP_KERNEL);
+	oa_config->id = idr_alloc_min(&perf->metrics_idr, oa_config, 2,
+				      GFP_KERNEL);
 	if (oa_config->id < 0) {
 		DRM_DEBUG("Failed to create sysfs entry for OA config\n");
 		err = oa_config->id;
diff --git a/drivers/gpu/drm/i915/selftests/i915_perf.c b/drivers/gpu/drm/i915/selftests/i915_perf.c
index 88db2e3d81d0..e7355594e7d4 100644
--- a/drivers/gpu/drm/i915/selftests/i915_perf.c
+++ b/drivers/gpu/drm/i915/selftests/i915_perf.c
@@ -32,7 +32,7 @@ alloc_empty_config(struct i915_perf *perf)
 
 	mutex_lock(&perf->metrics_lock);
 
-	oa_config->id = idr_alloc(&perf->metrics_idr, oa_config, 2, 0, GFP_KERNEL);
+	oa_config->id = idr_alloc_min(&perf->metrics_idr, oa_config, 2, GFP_KERNEL);
 	if (oa_config->id < 0)  {
 		mutex_unlock(&perf->metrics_lock);
 		i915_oa_config_put(oa_config);
diff --git a/drivers/gpu/drm/qxl/qxl_cmd.c b/drivers/gpu/drm/qxl/qxl_cmd.c
index 7b00c955cd82..3d8297949912 100644
--- a/drivers/gpu/drm/qxl/qxl_cmd.c
+++ b/drivers/gpu/drm/qxl/qxl_cmd.c
@@ -433,7 +433,7 @@ int qxl_surface_id_alloc(struct qxl_device *qdev,
 again:
 	idr_preload(GFP_ATOMIC);
 	spin_lock(&qdev->surf_id_idr_lock);
-	idr_ret = idr_alloc(&qdev->surf_id_idr, NULL, 1, 0, GFP_NOWAIT);
+	idr_ret = idr_alloc_min(&qdev->surf_id_idr, NULL, 1, GFP_NOWAIT);
 	spin_unlock(&qdev->surf_id_idr_lock);
 	idr_preload_end();
 	if (idr_ret < 0)
diff --git a/drivers/gpu/drm/qxl/qxl_release.c b/drivers/gpu/drm/qxl/qxl_release.c
index 368d26da0d6a..34aa7c9c3191 100644
--- a/drivers/gpu/drm/qxl/qxl_release.c
+++ b/drivers/gpu/drm/qxl/qxl_release.c
@@ -101,7 +101,7 @@ qxl_release_alloc(struct qxl_device *qdev, int type,
 
 	idr_preload(GFP_KERNEL);
 	spin_lock(&qdev->release_idr_lock);
-	handle = idr_alloc(&qdev->release_idr, release, 1, 0, GFP_NOWAIT);
+	handle = idr_alloc_min(&qdev->release_idr, release, 1, GFP_NOWAIT);
 	release->base.seqno = ++qdev->release_seqno;
 	spin_unlock(&qdev->release_idr_lock);
 	idr_preload_end();
diff --git a/drivers/gpu/drm/sis/sis_mm.c b/drivers/gpu/drm/sis/sis_mm.c
index e51d4289a3d0..c8dfb10707a0 100644
--- a/drivers/gpu/drm/sis/sis_mm.c
+++ b/drivers/gpu/drm/sis/sis_mm.c
@@ -131,7 +131,7 @@ static int sis_drm_alloc(struct drm_device *dev, struct drm_file *file,
 	if (retval)
 		goto fail_alloc;
 
-	retval = idr_alloc(&dev_priv->object_idr, item, 1, 0, GFP_KERNEL);
+	retval = idr_alloc_min(&dev_priv->object_idr, item, 1, GFP_KERNEL);
 	if (retval < 0)
 		goto fail_idr;
 	user_key = retval;
diff --git a/drivers/gpu/drm/tegra/drm.c b/drivers/gpu/drm/tegra/drm.c
index 9464f522e257..4d777c563efa 100644
--- a/drivers/gpu/drm/tegra/drm.c
+++ b/drivers/gpu/drm/tegra/drm.c
@@ -443,7 +443,7 @@ static int tegra_client_open(struct tegra_drm_file *fpriv,
 		return err;
 	}
 
-	err = idr_alloc(&fpriv->legacy_contexts, context, 1, 0, GFP_KERNEL);
+	err = idr_alloc_min(&fpriv->legacy_contexts, context, 1, GFP_KERNEL);
 	if (err < 0) {
 		client->ops->close_channel(context);
 		pm_runtime_put(client->base.dev);
diff --git a/drivers/gpu/drm/v3d/v3d_perfmon.c b/drivers/gpu/drm/v3d/v3d_perfmon.c
index f6a88abccc7d..b19cd0179364 100644
--- a/drivers/gpu/drm/v3d/v3d_perfmon.c
+++ b/drivers/gpu/drm/v3d/v3d_perfmon.c
@@ -149,8 +149,8 @@ int v3d_perfmon_create_ioctl(struct drm_device *dev, void *data,
 	mutex_init(&perfmon->lock);
 
 	mutex_lock(&v3d_priv->perfmon.lock);
-	ret = idr_alloc(&v3d_priv->perfmon.idr, perfmon, V3D_PERFMONID_MIN,
-			V3D_PERFMONID_MAX, GFP_KERNEL);
+	ret = idr_alloc_range(&v3d_priv->perfmon.idr, perfmon, V3D_PERFMONID_MIN,
+			      V3D_PERFMONID_MAX, GFP_KERNEL);
 	mutex_unlock(&v3d_priv->perfmon.lock);
 
 	if (ret < 0) {
diff --git a/drivers/gpu/drm/vc4/vc4_perfmon.c b/drivers/gpu/drm/vc4/vc4_perfmon.c
index 79a74184d732..0a1cb8a00858 100644
--- a/drivers/gpu/drm/vc4/vc4_perfmon.c
+++ b/drivers/gpu/drm/vc4/vc4_perfmon.c
@@ -178,8 +178,8 @@ int vc4_perfmon_create_ioctl(struct drm_device *dev, void *data,
 	refcount_set(&perfmon->refcnt, 1);
 
 	mutex_lock(&vc4file->perfmon.lock);
-	ret = idr_alloc(&vc4file->perfmon.idr, perfmon, VC4_PERFMONID_MIN,
-			VC4_PERFMONID_MAX, GFP_KERNEL);
+	ret = idr_alloc_range(&vc4file->perfmon.idr, perfmon, VC4_PERFMONID_MIN,
+			      VC4_PERFMONID_MAX, GFP_KERNEL);
 	mutex_unlock(&vc4file->perfmon.lock);
 
 	if (ret < 0) {
diff --git a/drivers/gpu/drm/vgem/vgem_fence.c b/drivers/gpu/drm/vgem/vgem_fence.c
index c2a879734d40..cb76ceab663e 100644
--- a/drivers/gpu/drm/vgem/vgem_fence.c
+++ b/drivers/gpu/drm/vgem/vgem_fence.c
@@ -169,7 +169,7 @@ int vgem_fence_attach_ioctl(struct drm_device *dev,
 	/* Record the fence in our idr for later signaling */
 	if (ret == 0) {
 		mutex_lock(&vfile->fence_mutex);
-		ret = idr_alloc(&vfile->fence_idr, fence, 1, 0, GFP_KERNEL);
+		ret = idr_alloc_min(&vfile->fence_idr, fence, 1, GFP_KERNEL);
 		mutex_unlock(&vfile->fence_mutex);
 		if (ret > 0) {
 			arg->out_fence = ret;
diff --git a/drivers/gpu/drm/via/via_mm.c b/drivers/gpu/drm/via/via_mm.c
index c9afa1a51f23..31cb14c75891 100644
--- a/drivers/gpu/drm/via/via_mm.c
+++ b/drivers/gpu/drm/via/via_mm.c
@@ -152,7 +152,7 @@ int via_mem_alloc(struct drm_device *dev, void *data,
 	if (retval)
 		goto fail_alloc;
 
-	retval = idr_alloc(&dev_priv->object_idr, item, 1, 0, GFP_KERNEL);
+	retval = idr_alloc_min(&dev_priv->object_idr, item, 1, GFP_KERNEL);
 	if (retval < 0)
 		goto fail_idr;
 	user_key = retval;
diff --git a/drivers/gpu/drm/vmwgfx/ttm_object.c b/drivers/gpu/drm/vmwgfx/ttm_object.c
index 26a55fef1ab5..b34d10a6f85e 100644
--- a/drivers/gpu/drm/vmwgfx/ttm_object.c
+++ b/drivers/gpu/drm/vmwgfx/ttm_object.c
@@ -172,7 +172,7 @@ int ttm_base_object_init(struct ttm_object_file *tfile,
 	kref_init(&base->refcount);
 	idr_preload(GFP_KERNEL);
 	spin_lock(&tdev->object_lock);
-	ret = idr_alloc(&tdev->idr, base, 1, 0, GFP_NOWAIT);
+	ret = idr_alloc_min(&tdev->idr, base, 1, GFP_NOWAIT);
 	spin_unlock(&tdev->object_lock);
 	idr_preload_end();
 	if (ret < 0)
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
index a7d62a4eb47b..605b0668eeb1 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
@@ -190,7 +190,7 @@ int vmw_resource_alloc_id(struct vmw_resource *res)
 	idr_preload(GFP_KERNEL);
 	spin_lock(&dev_priv->resource_lock);
 
-	ret = idr_alloc(idr, res, 1, 0, GFP_NOWAIT);
+	ret = idr_alloc_min(idr, res, 1, GFP_NOWAIT);
 	if (ret >= 0)
 		res->id = ret;
 
diff --git a/drivers/hwtracing/coresight/coresight-tmc-etr.c b/drivers/hwtracing/coresight/coresight-tmc-etr.c
index 867ad8bb9b0c..0a56eeb4b89e 100644
--- a/drivers/hwtracing/coresight/coresight-tmc-etr.c
+++ b/drivers/hwtracing/coresight/coresight-tmc-etr.c
@@ -1318,7 +1318,7 @@ get_perf_etr_buf_cpu_wide(struct tmc_drvdata *drvdata,
 
 	/* Now that we have a buffer, add it to the IDR. */
 	mutex_lock(&drvdata->idr_mutex);
-	ret = idr_alloc(&drvdata->idr, etr_buf, pid, pid + 1, GFP_KERNEL);
+	ret = idr_alloc_range(&drvdata->idr, etr_buf, pid, pid + 1, GFP_KERNEL);
 	mutex_unlock(&drvdata->idr_mutex);
 
 	/* Another event with this session ID has allocated this buffer. */
diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c
index d43db2c3876e..784ed5cf834d 100644
--- a/drivers/i2c/i2c-core-base.c
+++ b/drivers/i2c/i2c-core-base.c
@@ -1540,7 +1540,7 @@ static int __i2c_add_numbered_adapter(struct i2c_adapter *adap)
 	int id;
 
 	mutex_lock(&core_lock);
-	id = idr_alloc(&i2c_adapter_idr, adap, adap->nr, adap->nr + 1, GFP_KERNEL);
+	id = idr_alloc_range(&i2c_adapter_idr, adap, adap->nr, adap->nr + 1, GFP_KERNEL);
 	mutex_unlock(&core_lock);
 	if (WARN(id < 0, "couldn't get idr"))
 		return id == -ENOSPC ? -EBUSY : id;
@@ -1576,8 +1576,9 @@ int i2c_add_adapter(struct i2c_adapter *adapter)
 	}
 
 	mutex_lock(&core_lock);
-	id = idr_alloc(&i2c_adapter_idr, adapter,
-		       __i2c_first_dynamic_bus_num, 0, GFP_KERNEL);
+	id = idr_alloc_min(&i2c_adapter_idr, adapter,
+			   __i2c_first_dynamic_bus_num,
+			   GFP_KERNEL);
 	mutex_unlock(&core_lock);
 	if (WARN(id < 0, "couldn't get idr"))
 		return id;
diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c
index 7850287dfe7a..094c885dd161 100644
--- a/drivers/i3c/master.c
+++ b/drivers/i3c/master.c
@@ -430,7 +430,7 @@ static int i3c_bus_init(struct i3c_bus *i3cbus)
 	i3cbus->mode = I3C_BUS_MODE_PURE;
 
 	mutex_lock(&i3c_core_lock);
-	ret = idr_alloc(&i3c_bus_idr, i3cbus, 0, 0, GFP_KERNEL);
+	ret = idr_alloc(&i3c_bus_idr, i3cbus, GFP_KERNEL);
 	mutex_unlock(&i3c_core_lock);
 
 	if (ret < 0)
diff --git a/drivers/interconnect/core.c b/drivers/interconnect/core.c
index 808f6e7a8048..eb8e38cddcb9 100644
--- a/drivers/interconnect/core.c
+++ b/drivers/interconnect/core.c
@@ -800,7 +800,7 @@ static struct icc_node *icc_node_create_nolock(int id)
 	if (!node)
 		return ERR_PTR(-ENOMEM);
 
-	id = idr_alloc(&icc_idr, node, id, id + 1, GFP_KERNEL);
+	id = idr_alloc_range(&icc_idr, node, id, id + 1, GFP_KERNEL);
 	if (id < 0) {
 		WARN(1, "%s: couldn't get idr\n", __func__);
 		kfree(node);
diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index 2b75f1ef7386..94feda226f47 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -1831,7 +1831,7 @@ static int specific_minor(int minor)
 	idr_preload(GFP_KERNEL);
 	spin_lock(&_minor_lock);
 
-	r = idr_alloc(&_minor_idr, MINOR_ALLOCED, minor, minor + 1, GFP_NOWAIT);
+	r = idr_alloc_range(&_minor_idr, MINOR_ALLOCED, minor, minor + 1, GFP_NOWAIT);
 
 	spin_unlock(&_minor_lock);
 	idr_preload_end();
@@ -1847,7 +1847,7 @@ static int next_free_minor(int *minor)
 	idr_preload(GFP_KERNEL);
 	spin_lock(&_minor_lock);
 
-	r = idr_alloc(&_minor_idr, MINOR_ALLOCED, 0, 1 << MINORBITS, GFP_NOWAIT);
+	r = idr_alloc_max(&_minor_idr, MINOR_ALLOCED, 1 << MINORBITS, GFP_NOWAIT);
 
 	spin_unlock(&_minor_lock);
 	idr_preload_end();
diff --git a/drivers/memstick/core/memstick.c b/drivers/memstick/core/memstick.c
index 660df7d269fa..c11dbc453af4 100644
--- a/drivers/memstick/core/memstick.c
+++ b/drivers/memstick/core/memstick.c
@@ -514,7 +514,7 @@ int memstick_add_host(struct memstick_host *host)
 	idr_preload(GFP_KERNEL);
 	spin_lock(&memstick_host_lock);
 
-	rc = idr_alloc(&memstick_host_idr, host, 0, 0, GFP_NOWAIT);
+	rc = idr_alloc(&memstick_host_idr, host, GFP_NOWAIT);
 	if (rc >= 0)
 		host->id = rc;
 
diff --git a/drivers/memstick/core/ms_block.c b/drivers/memstick/core/ms_block.c
index 3993bdd4b519..065a0cd0d1d6 100644
--- a/drivers/memstick/core/ms_block.c
+++ b/drivers/memstick/core/ms_block.c
@@ -2081,7 +2081,7 @@ static int msb_init_disk(struct memstick_dev *card)
 	unsigned long capacity;
 
 	mutex_lock(&msb_disk_lock);
-	msb->disk_id = idr_alloc(&msb_disk_idr, card, 0, 256, GFP_KERNEL);
+	msb->disk_id = idr_alloc_max(&msb_disk_idr, card, 256, GFP_KERNEL);
 	mutex_unlock(&msb_disk_lock);
 
 	if (msb->disk_id  < 0)
diff --git a/drivers/memstick/core/mspro_block.c b/drivers/memstick/core/mspro_block.c
index 725ba74ded30..0447f626b7d8 100644
--- a/drivers/memstick/core/mspro_block.c
+++ b/drivers/memstick/core/mspro_block.c
@@ -1161,7 +1161,7 @@ static int mspro_block_init_disk(struct memstick_dev *card)
 	msb->page_size = be16_to_cpu(sys_info->unit_size);
 
 	mutex_lock(&mspro_block_disk_lock);
-	disk_id = idr_alloc(&mspro_block_disk_idr, card, 0, 256, GFP_KERNEL);
+	disk_id = idr_alloc_max(&mspro_block_disk_idr, card, 256, GFP_KERNEL);
 	mutex_unlock(&mspro_block_disk_lock);
 	if (disk_id < 0)
 		return disk_id;
diff --git a/drivers/misc/c2port/core.c b/drivers/misc/c2port/core.c
index fb9a1b49ff6d..62f599e2bfb3 100644
--- a/drivers/misc/c2port/core.c
+++ b/drivers/misc/c2port/core.c
@@ -905,7 +905,7 @@ struct c2port_device *c2port_device_register(char *name,
 
 	idr_preload(GFP_KERNEL);
 	spin_lock_irq(&c2port_idr_lock);
-	ret = idr_alloc(&c2port_idr, c2dev, 0, 0, GFP_NOWAIT);
+	ret = idr_alloc(&c2port_idr, c2dev, GFP_NOWAIT);
 	spin_unlock_irq(&c2port_idr_lock);
 	idr_preload_end();
 
diff --git a/drivers/misc/cardreader/rtsx_pcr.c b/drivers/misc/cardreader/rtsx_pcr.c
index 2a2619e3c72c..001d8bafee0c 100644
--- a/drivers/misc/cardreader/rtsx_pcr.c
+++ b/drivers/misc/cardreader/rtsx_pcr.c
@@ -1489,7 +1489,7 @@ static int rtsx_pci_probe(struct pci_dev *pcidev,
 
 	idr_preload(GFP_KERNEL);
 	spin_lock(&rtsx_pci_lock);
-	ret = idr_alloc(&rtsx_pci_idr, pcr, 0, 0, GFP_NOWAIT);
+	ret = idr_alloc(&rtsx_pci_idr, pcr, GFP_NOWAIT);
 	if (ret >= 0)
 		pcr->id = ret;
 	spin_unlock(&rtsx_pci_lock);
diff --git a/drivers/misc/cxl/context.c b/drivers/misc/cxl/context.c
index e627b4056623..20f38dfed8a7 100644
--- a/drivers/misc/cxl/context.c
+++ b/drivers/misc/cxl/context.c
@@ -91,8 +91,8 @@ int cxl_context_init(struct cxl_context *ctx, struct cxl_afu *afu, bool master)
 	 */
 	mutex_lock(&afu->contexts_lock);
 	idr_preload(GFP_KERNEL);
-	i = idr_alloc(&ctx->afu->contexts_idr, ctx, 0,
-		      ctx->afu->num_procs, GFP_NOWAIT);
+	i = idr_alloc_max(&ctx->afu->contexts_idr, ctx, ctx->afu->num_procs,
+			  GFP_NOWAIT);
 	idr_preload_end();
 	mutex_unlock(&afu->contexts_lock);
 	if (i < 0)
diff --git a/drivers/misc/cxl/main.c b/drivers/misc/cxl/main.c
index c1fbf6f588f7..f0cc1010c753 100644
--- a/drivers/misc/cxl/main.c
+++ b/drivers/misc/cxl/main.c
@@ -199,7 +199,7 @@ static int cxl_alloc_adapter_nr(struct cxl *adapter)
 
 	idr_preload(GFP_KERNEL);
 	spin_lock(&adapter_idr_lock);
-	i = idr_alloc(&cxl_adapter_idr, adapter, 0, 0, GFP_NOWAIT);
+	i = idr_alloc(&cxl_adapter_idr, adapter, GFP_NOWAIT);
 	spin_unlock(&adapter_idr_lock);
 	idr_preload_end();
 	if (i < 0)
diff --git a/drivers/misc/habanalabs/common/command_submission.c b/drivers/misc/habanalabs/common/command_submission.c
index fb30b7de4aab..cb320cff88fd 100644
--- a/drivers/misc/habanalabs/common/command_submission.c
+++ b/drivers/misc/habanalabs/common/command_submission.c
@@ -1834,7 +1834,7 @@ static int cs_ioctl_reserve_signals(struct hl_fpriv *hpriv,
 	mgr = &hpriv->ctx->sig_mgr;
 
 	spin_lock(&mgr->lock);
-	hdl_id = idr_alloc(&mgr->handles, handle, 1, 0, GFP_ATOMIC);
+	hdl_id = idr_alloc_min(&mgr->handles, handle, 1, GFP_ATOMIC);
 	spin_unlock(&mgr->lock);
 
 	if (hdl_id < 0) {
diff --git a/drivers/misc/habanalabs/common/context.c b/drivers/misc/habanalabs/common/context.c
index ed2cfd0c6e99..d9b41e1efc7d 100644
--- a/drivers/misc/habanalabs/common/context.c
+++ b/drivers/misc/habanalabs/common/context.c
@@ -144,7 +144,7 @@ int hl_ctx_create(struct hl_device *hdev, struct hl_fpriv *hpriv)
 	}
 
 	mutex_lock(&mgr->ctx_lock);
-	rc = idr_alloc(&mgr->ctx_handles, ctx, 1, 0, GFP_KERNEL);
+	rc = idr_alloc_min(&mgr->ctx_handles, ctx, 1, GFP_KERNEL);
 	mutex_unlock(&mgr->ctx_lock);
 
 	if (rc < 0) {
diff --git a/drivers/misc/habanalabs/common/habanalabs_drv.c b/drivers/misc/habanalabs/common/habanalabs_drv.c
index 37edb69a7255..9730cb3c3669 100644
--- a/drivers/misc/habanalabs/common/habanalabs_drv.c
+++ b/drivers/misc/habanalabs/common/habanalabs_drv.c
@@ -377,11 +377,11 @@ static int create_hdev(struct hl_device **dev, struct pci_dev *pdev)
 	/* Always save 2 numbers, 1 for main device and 1 for control.
 	 * They must be consecutive
 	 */
-	main_id = idr_alloc(&hl_devs_idr, hdev, 0, HL_MAX_MINORS, GFP_KERNEL);
+	main_id = idr_alloc_max(&hl_devs_idr, hdev, HL_MAX_MINORS, GFP_KERNEL);
 
 	if (main_id >= 0)
-		ctrl_id = idr_alloc(&hl_devs_idr, hdev, main_id + 1,
-					main_id + 2, GFP_KERNEL);
+		ctrl_id = idr_alloc_range(&hl_devs_idr, hdev, main_id + 1,
+					  main_id + 2, GFP_KERNEL);
 
 	mutex_unlock(&hl_devs_idr_lock);
 
diff --git a/drivers/misc/habanalabs/common/memory.c b/drivers/misc/habanalabs/common/memory.c
index 663dd7e589d4..8fad3a260eb7 100644
--- a/drivers/misc/habanalabs/common/memory.c
+++ b/drivers/misc/habanalabs/common/memory.c
@@ -169,8 +169,8 @@ static int alloc_device_memory(struct hl_ctx *ctx, struct hl_mem_in *args,
 	}
 
 	spin_lock(&vm->idr_lock);
-	handle = idr_alloc(&vm->phys_pg_pack_handles, phys_pg_pack, 1, 0,
-				GFP_ATOMIC);
+	handle = idr_alloc_min(&vm->phys_pg_pack_handles, phys_pg_pack, 1,
+			       GFP_ATOMIC);
 	spin_unlock(&vm->idr_lock);
 
 	if (handle < 0) {
diff --git a/drivers/misc/habanalabs/common/memory_mgr.c b/drivers/misc/habanalabs/common/memory_mgr.c
index ea5f2bd31b0a..44ee56d23520 100644
--- a/drivers/misc/habanalabs/common/memory_mgr.c
+++ b/drivers/misc/habanalabs/common/memory_mgr.c
@@ -158,7 +158,7 @@ hl_mmap_mem_buf_alloc(struct hl_mem_mgr *mmg,
 		return NULL;
 
 	spin_lock(&mmg->lock);
-	rc = idr_alloc(&mmg->handles, buf, 1, 0, GFP_ATOMIC);
+	rc = idr_alloc_min(&mmg->handles, buf, 1, GFP_ATOMIC);
 	spin_unlock(&mmg->lock);
 	if (rc < 0) {
 		dev_err(mmg->dev,
diff --git a/drivers/misc/mei/main.c b/drivers/misc/mei/main.c
index 786f7c8f7f61..7f63566f9bed 100644
--- a/drivers/misc/mei/main.c
+++ b/drivers/misc/mei/main.c
@@ -1189,7 +1189,7 @@ static int mei_minor_get(struct mei_device *dev)
 	int ret;
 
 	mutex_lock(&mei_minor_lock);
-	ret = idr_alloc(&mei_idr, dev, 0, MEI_MAX_DEVS, GFP_KERNEL);
+	ret = idr_alloc_max(&mei_idr, dev, MEI_MAX_DEVS, GFP_KERNEL);
 	if (ret >= 0)
 		dev->minor = ret;
 	else if (ret == -ENOSPC)
diff --git a/drivers/misc/ocxl/afu_irq.c b/drivers/misc/ocxl/afu_irq.c
index a06920b7e049..2fd35ea4345c 100644
--- a/drivers/misc/ocxl/afu_irq.c
+++ b/drivers/misc/ocxl/afu_irq.c
@@ -118,8 +118,8 @@ int ocxl_afu_irq_alloc(struct ocxl_context *ctx, int *irq_id)
 
 	mutex_lock(&ctx->irq_lock);
 
-	irq->id = idr_alloc(&ctx->irq_idr, irq, 0, MAX_IRQ_PER_CONTEXT,
-			GFP_KERNEL);
+	irq->id = idr_alloc_max(&ctx->irq_idr, irq, MAX_IRQ_PER_CONTEXT,
+				GFP_KERNEL);
 	if (irq->id < 0) {
 		rc = -ENOSPC;
 		goto err_unlock;
diff --git a/drivers/misc/ocxl/context.c b/drivers/misc/ocxl/context.c
index 9eb0d93b01c6..ab420850f5a0 100644
--- a/drivers/misc/ocxl/context.c
+++ b/drivers/misc/ocxl/context.c
@@ -16,8 +16,8 @@ int ocxl_context_alloc(struct ocxl_context **context, struct ocxl_afu *afu,
 
 	ctx->afu = afu;
 	mutex_lock(&afu->contexts_lock);
-	pasid = idr_alloc(&afu->contexts_idr, ctx, afu->pasid_base,
-			afu->pasid_base + afu->pasid_max, GFP_KERNEL);
+	pasid = idr_alloc_range(&afu->contexts_idr, ctx, afu->pasid_base,
+				afu->pasid_base + afu->pasid_max, GFP_KERNEL);
 	if (pasid < 0) {
 		mutex_unlock(&afu->contexts_lock);
 		kfree(ctx);
diff --git a/drivers/misc/ocxl/file.c b/drivers/misc/ocxl/file.c
index 6777c419a8da..93dc30cc4e0d 100644
--- a/drivers/misc/ocxl/file.c
+++ b/drivers/misc/ocxl/file.c
@@ -35,7 +35,7 @@ static int allocate_minor(struct ocxl_file_info *info)
 	int minor;
 
 	mutex_lock(&minors_idr_lock);
-	minor = idr_alloc(&minors_idr, info, 0, OCXL_NUM_MINORS, GFP_KERNEL);
+	minor = idr_alloc_max(&minors_idr, info, OCXL_NUM_MINORS, GFP_KERNEL);
 	mutex_unlock(&minors_idr_lock);
 	return minor;
 }
diff --git a/drivers/misc/tifm_core.c b/drivers/misc/tifm_core.c
index a3098fea3bf7..ff39354db5c2 100644
--- a/drivers/misc/tifm_core.c
+++ b/drivers/misc/tifm_core.c
@@ -194,7 +194,7 @@ int tifm_add_adapter(struct tifm_adapter *fm)
 
 	idr_preload(GFP_KERNEL);
 	spin_lock(&tifm_adapter_lock);
-	rc = idr_alloc(&tifm_adapter_idr, fm, 0, 0, GFP_NOWAIT);
+	rc = idr_alloc(&tifm_adapter_idr, fm, GFP_NOWAIT);
 	if (rc >= 0)
 		fm->id = rc;
 	spin_unlock(&tifm_adapter_lock);
diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c
index 9eb0680db312..d55642723b0c 100644
--- a/drivers/mtd/mtdcore.c
+++ b/drivers/mtd/mtdcore.c
@@ -603,9 +603,9 @@ int add_mtd_device(struct mtd_info *mtd)
 	if (np)
 		ofidx = of_alias_get_id(np, "mtd");
 	if (ofidx >= 0)
-		i = idr_alloc(&mtd_idr, mtd, ofidx, ofidx + 1, GFP_KERNEL);
+		i = idr_alloc_range(&mtd_idr, mtd, ofidx, ofidx + 1, GFP_KERNEL);
 	else
-		i = idr_alloc(&mtd_idr, mtd, 0, 0, GFP_KERNEL);
+		i = idr_alloc(&mtd_idr, mtd, GFP_KERNEL);
 	if (i < 0) {
 		error = i;
 		goto fail_locked;
diff --git a/drivers/mtd/ubi/block.c b/drivers/mtd/ubi/block.c
index a78fdf3b30f7..8893993f3606 100644
--- a/drivers/mtd/ubi/block.c
+++ b/drivers/mtd/ubi/block.c
@@ -423,7 +423,7 @@ int ubiblock_create(struct ubi_volume_info *vi)
 	gd->fops = &ubiblock_ops;
 	gd->major = ubiblock_major;
 	gd->minors = 1;
-	gd->first_minor = idr_alloc(&ubiblock_minor_idr, dev, 0, 0, GFP_KERNEL);
+	gd->first_minor = idr_alloc(&ubiblock_minor_idr, dev, GFP_KERNEL);
 	if (gd->first_minor < 0) {
 		dev_err(disk_to_dev(gd),
 			"block: dynamic minor allocation failed");
diff --git a/drivers/net/ethernet/intel/ice/ice_virtchnl_fdir.c b/drivers/net/ethernet/intel/ice/ice_virtchnl_fdir.c
index c6a58343d81d..034c6cc5f928 100644
--- a/drivers/net/ethernet/intel/ice/ice_virtchnl_fdir.c
+++ b/drivers/net/ethernet/intel/ice/ice_virtchnl_fdir.c
@@ -1124,8 +1124,8 @@ ice_vc_fdir_insert_entry(struct ice_vf *vf,
 	int i;
 
 	/* alloc ID corresponding with conf */
-	i = idr_alloc(&vf->fdir.fdir_rule_idr, conf, 0,
-		      ICE_FDIR_MAX_FLTRS, GFP_KERNEL);
+	i = idr_alloc_max(&vf->fdir.fdir_rule_idr, conf, ICE_FDIR_MAX_FLTRS,
+			  GFP_KERNEL);
 	if (i < 0)
 		return -EINVAL;
 	*id = i;
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_policer.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_policer.c
index 39052e5c12fd..356222c4d765 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_policer.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_policer.c
@@ -119,8 +119,8 @@ mlxsw_sp_policer_single_rate_index_alloc(struct mlxsw_sp_policer_family *family,
 	int id;
 
 	mutex_lock(&family->lock);
-	id = idr_alloc(&family->policer_idr, policer, family->start_index,
-		       family->end_index, GFP_KERNEL);
+	id = idr_alloc_range(&family->policer_idr, policer, family->start_index,
+			     family->end_index, GFP_KERNEL);
 	mutex_unlock(&family->lock);
 
 	if (id < 0)
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
index 0d8a0068e4ca..545c70197d9a 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
@@ -8587,8 +8587,8 @@ static int mlxsw_sp_rif_mac_profile_index_alloc(struct mlxsw_sp *mlxsw_sp,
 	struct mlxsw_sp_router *router = mlxsw_sp->router;
 	int id;
 
-	id = idr_alloc(&router->rif_mac_profiles_idr, profile, 0,
-		       max_rif_mac_profiles, GFP_KERNEL);
+	id = idr_alloc_max(&router->rif_mac_profiles_idr, profile,
+			   max_rif_mac_profiles, GFP_KERNEL);
 
 	if (id >= 0) {
 		profile->id = id;
diff --git a/drivers/net/ethernet/netronome/nfp/flower/main.c b/drivers/net/ethernet/netronome/nfp/flower/main.c
index 4d960a9641b3..6c8901e73bb0 100644
--- a/drivers/net/ethernet/netronome/nfp/flower/main.c
+++ b/drivers/net/ethernet/netronome/nfp/flower/main.c
@@ -65,8 +65,9 @@ nfp_flower_get_internal_port_id(struct nfp_app *app, struct net_device *netdev)
 
 	idr_preload(GFP_ATOMIC);
 	spin_lock_bh(&priv->internal_ports.lock);
-	id = idr_alloc(&priv->internal_ports.port_ids, netdev,
-		       NFP_MIN_INT_PORT_ID, NFP_MAX_INT_PORT_ID, GFP_ATOMIC);
+	id = idr_alloc_range(&priv->internal_ports.port_ids, netdev,
+			     NFP_MIN_INT_PORT_ID, NFP_MAX_INT_PORT_ID,
+			     GFP_ATOMIC);
 	spin_unlock_bh(&priv->internal_ports.lock);
 	idr_preload_end();
 
diff --git a/drivers/net/ppp/ppp_generic.c b/drivers/net/ppp/ppp_generic.c
index 4a365f15533e..2272174b29fd 100644
--- a/drivers/net/ppp/ppp_generic.c
+++ b/drivers/net/ppp/ppp_generic.c
@@ -3562,7 +3562,7 @@ static int unit_set(struct idr *p, void *ptr, int n)
 {
 	int unit;
 
-	unit = idr_alloc(p, ptr, n, n + 1, GFP_KERNEL);
+	unit = idr_alloc_range(p, ptr, n, n + 1, GFP_KERNEL);
 	if (unit == -ENOSPC)
 		unit = -EINVAL;
 	return unit;
@@ -3571,7 +3571,7 @@ static int unit_set(struct idr *p, void *ptr, int n)
 /* get new free unit number and associate pointer with it */
 static int unit_get(struct idr *p, void *ptr, int min)
 {
-	return idr_alloc(p, ptr, min, 0, GFP_KERNEL);
+	return idr_alloc_min(p, ptr, min, GFP_KERNEL);
 }
 
 /* put unit number back to a pool */
diff --git a/drivers/net/tap.c b/drivers/net/tap.c
index c3d42062559d..ea022a443745 100644
--- a/drivers/net/tap.c
+++ b/drivers/net/tap.c
@@ -423,7 +423,7 @@ int tap_get_minor(dev_t major, struct tap_dev *tap)
 	}
 
 	spin_lock(&tap_major->minor_lock);
-	retval = idr_alloc(&tap_major->minor_idr, tap, 1, TAP_NUM_DEVS, GFP_ATOMIC);
+	retval = idr_alloc_range(&tap_major->minor_idr, tap, 1, TAP_NUM_DEVS, GFP_ATOMIC);
 	if (retval >= 0) {
 		tap->minor = retval;
 	} else if (retval == -ENOSPC) {
diff --git a/drivers/net/wireless/ath/ath10k/htt_tx.c b/drivers/net/wireless/ath/ath10k/htt_tx.c
index 9842a4b2f78f..25f841b4fcb2 100644
--- a/drivers/net/wireless/ath/ath10k/htt_tx.c
+++ b/drivers/net/wireless/ath/ath10k/htt_tx.c
@@ -201,8 +201,8 @@ int ath10k_htt_tx_alloc_msdu_id(struct ath10k_htt *htt, struct sk_buff *skb)
 	int ret;
 
 	spin_lock_bh(&htt->tx_lock);
-	ret = idr_alloc(&htt->pending_tx, skb, 0,
-			htt->max_num_pending_tx, GFP_ATOMIC);
+	ret = idr_alloc_max(&htt->pending_tx, skb, htt->max_num_pending_tx,
+			    GFP_ATOMIC);
 	spin_unlock_bh(&htt->tx_lock);
 
 	ath10k_dbg(ar, ATH10K_DBG_HTT, "htt tx alloc msdu_id %d\n", ret);
diff --git a/drivers/net/wireless/ath/ath10k/wmi-tlv.c b/drivers/net/wireless/ath/ath10k/wmi-tlv.c
index 7efbe03fbca8..e15ab6415b09 100644
--- a/drivers/net/wireless/ath/ath10k/wmi-tlv.c
+++ b/drivers/net/wireless/ath/ath10k/wmi-tlv.c
@@ -3054,8 +3054,9 @@ ath10k_wmi_mgmt_tx_alloc_msdu_id(struct ath10k *ar, struct sk_buff *skb,
 	pkt_addr->paddr = paddr;
 
 	spin_lock_bh(&ar->data_lock);
-	ret = idr_alloc(&wmi->mgmt_pending_tx, pkt_addr, 0,
-			wmi->mgmt_max_num_pending_tx, GFP_ATOMIC);
+	ret = idr_alloc_max(&wmi->mgmt_pending_tx, pkt_addr,
+			    wmi->mgmt_max_num_pending_tx,
+			    GFP_ATOMIC);
 	spin_unlock_bh(&ar->data_lock);
 
 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi mgmt tx alloc msdu_id ret %d\n", ret);
diff --git a/drivers/net/wireless/ath/ath11k/dbring.c b/drivers/net/wireless/ath/ath11k/dbring.c
index 2107ec05d14f..157e31a6e4bc 100644
--- a/drivers/net/wireless/ath/ath11k/dbring.c
+++ b/drivers/net/wireless/ath/ath11k/dbring.c
@@ -65,7 +65,7 @@ static int ath11k_dbring_bufs_replenish(struct ath11k *ar,
 		goto err;
 
 	spin_lock_bh(&ring->idr_lock);
-	buf_id = idr_alloc(&ring->bufs_idr, buff, 0, ring->bufs_max, GFP_ATOMIC);
+	buf_id = idr_alloc_max(&ring->bufs_idr, buff, ring->bufs_max, GFP_ATOMIC);
 	spin_unlock_bh(&ring->idr_lock);
 	if (buf_id < 0) {
 		ret = -ENOBUFS;
diff --git a/drivers/net/wireless/ath/ath11k/dp_rx.c b/drivers/net/wireless/ath/ath11k/dp_rx.c
index 049774cc158c..6b79f52a1cd9 100644
--- a/drivers/net/wireless/ath/ath11k/dp_rx.c
+++ b/drivers/net/wireless/ath/ath11k/dp_rx.c
@@ -389,8 +389,9 @@ int ath11k_dp_rxbufs_replenish(struct ath11k_base *ab, int mac_id,
 			goto fail_free_skb;
 
 		spin_lock_bh(&rx_ring->idr_lock);
-		buf_id = idr_alloc(&rx_ring->bufs_idr, skb, 0,
-				   rx_ring->bufs_max * 3, GFP_ATOMIC);
+		buf_id = idr_alloc_max(&rx_ring->bufs_idr, skb,
+				       rx_ring->bufs_max * 3,
+				       GFP_ATOMIC);
 		spin_unlock_bh(&rx_ring->idr_lock);
 		if (buf_id < 0)
 			goto fail_dma_unmap;
@@ -2859,8 +2860,8 @@ static struct sk_buff *ath11k_dp_rx_alloc_mon_status_buf(struct ath11k_base *ab,
 		goto fail_free_skb;
 
 	spin_lock_bh(&rx_ring->idr_lock);
-	*buf_id = idr_alloc(&rx_ring->bufs_idr, skb, 0,
-			    rx_ring->bufs_max, GFP_ATOMIC);
+	*buf_id = idr_alloc_max(&rx_ring->bufs_idr, skb, rx_ring->bufs_max,
+				GFP_ATOMIC);
 	spin_unlock_bh(&rx_ring->idr_lock);
 	if (*buf_id < 0)
 		goto fail_dma_unmap;
@@ -3384,8 +3385,9 @@ static int ath11k_dp_rx_h_defrag_reo_reinject(struct ath11k *ar, struct dp_rx_ti
 		return -ENOMEM;
 
 	spin_lock_bh(&rx_refill_ring->idr_lock);
-	buf_id = idr_alloc(&rx_refill_ring->bufs_idr, defrag_skb, 0,
-			   rx_refill_ring->bufs_max * 3, GFP_ATOMIC);
+	buf_id = idr_alloc_max(&rx_refill_ring->bufs_idr, defrag_skb,
+			       rx_refill_ring->bufs_max * 3,
+			       GFP_ATOMIC);
 	spin_unlock_bh(&rx_refill_ring->idr_lock);
 	if (buf_id < 0) {
 		ret = -ENOMEM;
diff --git a/drivers/net/wireless/ath/ath11k/dp_tx.c b/drivers/net/wireless/ath/ath11k/dp_tx.c
index c17a2620aad7..a81cd7045e92 100644
--- a/drivers/net/wireless/ath/ath11k/dp_tx.c
+++ b/drivers/net/wireless/ath/ath11k/dp_tx.c
@@ -124,8 +124,8 @@ int ath11k_dp_tx(struct ath11k *ar, struct ath11k_vif *arvif,
 	tx_ring = &dp->tx_ring[ti.ring_id];
 
 	spin_lock_bh(&tx_ring->tx_idr_lock);
-	ret = idr_alloc(&tx_ring->txbuf_idr, skb, 0,
-			DP_TX_IDR_SIZE - 1, GFP_ATOMIC);
+	ret = idr_alloc_max(&tx_ring->txbuf_idr, skb, DP_TX_IDR_SIZE - 1,
+			    GFP_ATOMIC);
 	spin_unlock_bh(&tx_ring->tx_idr_lock);
 
 	if (unlikely(ret < 0)) {
diff --git a/drivers/net/wireless/ath/ath11k/mac.c b/drivers/net/wireless/ath/ath11k/mac.c
index ee1590b16eff..d47d7f905230 100644
--- a/drivers/net/wireless/ath/ath11k/mac.c
+++ b/drivers/net/wireless/ath/ath11k/mac.c
@@ -5478,8 +5478,9 @@ static int ath11k_mac_mgmt_tx_wmi(struct ath11k *ar, struct ath11k_vif *arvif,
 	ATH11K_SKB_CB(skb)->ar = ar;
 
 	spin_lock_bh(&ar->txmgmt_idr_lock);
-	buf_id = idr_alloc(&ar->txmgmt_idr, skb, 0,
-			   ATH11K_TX_MGMT_NUM_PENDING_MAX, GFP_ATOMIC);
+	buf_id = idr_alloc_max(&ar->txmgmt_idr, skb,
+			       ATH11K_TX_MGMT_NUM_PENDING_MAX,
+			       GFP_ATOMIC);
 	spin_unlock_bh(&ar->txmgmt_idr_lock);
 
 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
diff --git a/drivers/net/wireless/marvell/mwifiex/main.c b/drivers/net/wireless/marvell/mwifiex/main.c
index ace7371c4773..7d46ede7e6ab 100644
--- a/drivers/net/wireless/marvell/mwifiex/main.c
+++ b/drivers/net/wireless/marvell/mwifiex/main.c
@@ -867,8 +867,8 @@ mwifiex_clone_skb_for_tx_status(struct mwifiex_private *priv,
 		int id;
 
 		spin_lock_bh(&priv->ack_status_lock);
-		id = idr_alloc(&priv->ack_status_frames, orig_skb,
-			       1, 0x10, GFP_ATOMIC);
+		id = idr_alloc_range(&priv->ack_status_frames, orig_skb,
+				     1, 0x10, GFP_ATOMIC);
 		spin_unlock_bh(&priv->ack_status_lock);
 
 		if (id >= 0) {
diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h
index 4e8997c45c1b..162ed80dd9e1 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76.h
@@ -1411,7 +1411,7 @@ mt76_token_get(struct mt76_dev *dev, struct mt76_txwi_cache **ptxwi)
 	int token;
 
 	spin_lock_bh(&dev->token_lock);
-	token = idr_alloc(&dev->token, *ptxwi, 0, dev->token_size, GFP_ATOMIC);
+	token = idr_alloc_max(&dev->token, *ptxwi, dev->token_size, GFP_ATOMIC);
 	spin_unlock_bh(&dev->token_lock);
 
 	return token;
diff --git a/drivers/net/wireless/mediatek/mt76/tx.c b/drivers/net/wireless/mediatek/mt76/tx.c
index 1d08d99e298c..13b105cb0419 100644
--- a/drivers/net/wireless/mediatek/mt76/tx.c
+++ b/drivers/net/wireless/mediatek/mt76/tx.c
@@ -131,8 +131,8 @@ mt76_tx_status_skb_add(struct mt76_dev *dev, struct mt76_wcid *wcid,
 
 	spin_lock_bh(&dev->status_lock);
 
-	pid = idr_alloc(&wcid->pktid, skb, MT_PACKET_ID_FIRST,
-			MT_PACKET_ID_MASK, GFP_ATOMIC);
+	pid = idr_alloc_range(&wcid->pktid, skb, MT_PACKET_ID_FIRST,
+			      MT_PACKET_ID_MASK, GFP_ATOMIC);
 	if (pid < 0) {
 		pid = MT_PACKET_ID_NO_SKB;
 		goto out;
@@ -721,7 +721,7 @@ int mt76_token_consume(struct mt76_dev *dev, struct mt76_txwi_cache **ptxwi)
 
 	spin_lock_bh(&dev->token_lock);
 
-	token = idr_alloc(&dev->token, *ptxwi, 0, dev->token_size, GFP_ATOMIC);
+	token = idr_alloc_max(&dev->token, *ptxwi, dev->token_size, GFP_ATOMIC);
 	if (token >= 0)
 		dev->token_count++;
 
diff --git a/drivers/of/overlay.c b/drivers/of/overlay.c
index 4044ddcb02c6..7cf58d208530 100644
--- a/drivers/of/overlay.c
+++ b/drivers/of/overlay.c
@@ -1005,7 +1005,7 @@ int of_overlay_fdt_apply(const void *overlay_fdt, u32 overlay_fdt_size,
 	 * ovcs resources, implicitly set by kzalloc() of ovcs
 	 */
 
-	ovcs->id = idr_alloc(&ovcs_idr, ovcs, 1, 0, GFP_KERNEL);
+	ovcs->id = idr_alloc_min(&ovcs_idr, ovcs, 1, GFP_KERNEL);
 	if (ovcs->id <= 0) {
 		ret = ovcs->id;
 		goto err_free_ovcs;
diff --git a/drivers/pci/endpoint/pci-ep-cfs.c b/drivers/pci/endpoint/pci-ep-cfs.c
index d4850bdd837f..81df9549bd8c 100644
--- a/drivers/pci/endpoint/pci-ep-cfs.c
+++ b/drivers/pci/endpoint/pci-ep-cfs.c
@@ -562,7 +562,7 @@ static struct config_group *pci_epf_make(struct config_group *group,
 		return ERR_PTR(-ENOMEM);
 
 	mutex_lock(&functions_mutex);
-	index = idr_alloc(&functions_idr, epf_group, 0, 0, GFP_KERNEL);
+	index = idr_alloc(&functions_idr, epf_group, GFP_KERNEL);
 	mutex_unlock(&functions_mutex);
 	if (index < 0) {
 		err = index;
diff --git a/drivers/power/supply/bq2415x_charger.c b/drivers/power/supply/bq2415x_charger.c
index 5724001e66b9..4bce687e9d83 100644
--- a/drivers/power/supply/bq2415x_charger.c
+++ b/drivers/power/supply/bq2415x_charger.c
@@ -1540,7 +1540,7 @@ static int bq2415x_probe(struct i2c_client *client,
 
 	/* Get new ID for the new device */
 	mutex_lock(&bq2415x_id_mutex);
-	num = idr_alloc(&bq2415x_id, client, 0, 0, GFP_KERNEL);
+	num = idr_alloc(&bq2415x_id, client, GFP_KERNEL);
 	mutex_unlock(&bq2415x_id_mutex);
 	if (num < 0)
 		return num;
diff --git a/drivers/power/supply/bq27xxx_battery_i2c.c b/drivers/power/supply/bq27xxx_battery_i2c.c
index cf38cbfe13e9..06dc57e0ba74 100644
--- a/drivers/power/supply/bq27xxx_battery_i2c.c
+++ b/drivers/power/supply/bq27xxx_battery_i2c.c
@@ -146,7 +146,7 @@ static int bq27xxx_battery_i2c_probe(struct i2c_client *client,
 
 	/* Get new ID for the new battery device */
 	mutex_lock(&battery_mutex);
-	num = idr_alloc(&battery_id, client, 0, 0, GFP_KERNEL);
+	num = idr_alloc(&battery_id, client, GFP_KERNEL);
 	mutex_unlock(&battery_mutex);
 	if (num < 0)
 		return num;
diff --git a/drivers/power/supply/ds2782_battery.c b/drivers/power/supply/ds2782_battery.c
index 9ae273fde7a2..048001b7b050 100644
--- a/drivers/power/supply/ds2782_battery.c
+++ b/drivers/power/supply/ds2782_battery.c
@@ -390,7 +390,7 @@ static int ds278x_battery_probe(struct i2c_client *client,
 
 	/* Get an ID for this battery */
 	mutex_lock(&battery_lock);
-	ret = idr_alloc(&battery_id, client, 0, 0, GFP_KERNEL);
+	ret = idr_alloc(&battery_id, client, GFP_KERNEL);
 	mutex_unlock(&battery_lock);
 	if (ret < 0)
 		goto fail_id;
diff --git a/drivers/powercap/powercap_sys.c b/drivers/powercap/powercap_sys.c
index f0654a932b37..434c2eea51c6 100644
--- a/drivers/powercap/powercap_sys.c
+++ b/drivers/powercap/powercap_sys.c
@@ -519,7 +519,7 @@ struct powercap_zone *powercap_register_zone(
 
 	mutex_lock(&control_type->lock);
 	/* Using idr to get the unique id */
-	result = idr_alloc(power_zone->parent_idr, NULL, 0, 0, GFP_KERNEL);
+	result = idr_alloc(power_zone->parent_idr, NULL, GFP_KERNEL);
 	if (result < 0)
 		goto err_idr_alloc;
 
diff --git a/drivers/pps/pps.c b/drivers/pps/pps.c
index 22a65ad4e46e..cb73b3cc6bac 100644
--- a/drivers/pps/pps.c
+++ b/drivers/pps/pps.c
@@ -351,10 +351,10 @@ int pps_register_cdev(struct pps_device *pps)
 
 	mutex_lock(&pps_idr_lock);
 	/*
-	 * Get new ID for the new PPS source.  After idr_alloc() calling
+	 * Get new ID for the new PPS source. After idr_alloc_max() calling
 	 * the new source will be freely available into the kernel.
 	 */
-	err = idr_alloc(&pps_idr, pps, 0, PPS_MAX_SOURCES, GFP_KERNEL);
+	err = idr_alloc_max(&pps_idr, pps, PPS_MAX_SOURCES, GFP_KERNEL);
 	if (err < 0) {
 		if (err == -ENOSPC) {
 			pr_err("%s: too many PPS sources in the system\n",
diff --git a/drivers/ptp/ptp_ocp.c b/drivers/ptp/ptp_ocp.c
index 4519ef42b458..10853d551ddc 100644
--- a/drivers/ptp/ptp_ocp.c
+++ b/drivers/ptp/ptp_ocp.c
@@ -3503,7 +3503,7 @@ ptp_ocp_device_init(struct ptp_ocp *bp, struct pci_dev *pdev)
 	int err;
 
 	mutex_lock(&ptp_ocp_lock);
-	err = idr_alloc(&ptp_ocp_idr, bp, 0, 0, GFP_KERNEL);
+	err = idr_alloc(&ptp_ocp_idr, bp, GFP_KERNEL);
 	mutex_unlock(&ptp_ocp_lock);
 	if (err < 0) {
 		dev_err(&pdev->dev, "idr_alloc failed: %d\n", err);
diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c
index 02a04ab34a23..38f16dc4df06 100644
--- a/drivers/remoteproc/remoteproc_core.c
+++ b/drivers/remoteproc/remoteproc_core.c
@@ -365,7 +365,7 @@ int rproc_alloc_vring(struct rproc_vdev *rvdev, int i)
 	 * TODO: assign a notifyid for rvdev updates as well
 	 * TODO: support predefined notifyids (via resource table)
 	 */
-	ret = idr_alloc(&rproc->notifyids, rvring, 0, 0, GFP_KERNEL);
+	ret = idr_alloc(&rproc->notifyids, rvring, GFP_KERNEL);
 	if (ret < 0) {
 		dev_err(dev, "idr_alloc failed: %d\n", ret);
 		return ret;
diff --git a/drivers/reset/reset-ti-sci.c b/drivers/reset/reset-ti-sci.c
index b799aefad547..56309bb536bc 100644
--- a/drivers/reset/reset-ti-sci.c
+++ b/drivers/reset/reset-ti-sci.c
@@ -206,7 +206,7 @@ static int ti_sci_reset_of_xlate(struct reset_controller_dev *rcdev,
 	control->reset_mask = reset_spec->args[1];
 	mutex_init(&control->lock);
 
-	return idr_alloc(&data->idr, control, 0, 0, GFP_KERNEL);
+	return idr_alloc(&data->idr, control, GFP_KERNEL);
 }
 
 static const struct of_device_id ti_sci_reset_of_match[] = {
diff --git a/drivers/rpmsg/qcom_glink_native.c b/drivers/rpmsg/qcom_glink_native.c
index 07586514991f..23e7a7cc15e0 100644
--- a/drivers/rpmsg/qcom_glink_native.c
+++ b/drivers/rpmsg/qcom_glink_native.c
@@ -974,8 +974,8 @@ static void qcom_glink_handle_intent(struct qcom_glink *glink,
 		intent->size = le32_to_cpu(msg->intents[i].size);
 
 		spin_lock_irqsave(&channel->intent_lock, flags);
-		ret = idr_alloc(&channel->riids, intent,
-				intent->id, intent->id + 1, GFP_ATOMIC);
+		ret = idr_alloc_range(&channel->riids, intent,
+				      intent->id, intent->id + 1, GFP_ATOMIC);
 		spin_unlock_irqrestore(&channel->intent_lock, flags);
 
 		if (ret < 0)
@@ -1479,7 +1479,7 @@ static int qcom_glink_rx_open(struct qcom_glink *glink, unsigned int rcid,
 	}
 
 	spin_lock_irqsave(&glink->idr_lock, flags);
-	ret = idr_alloc(&glink->rcids, channel, rcid, rcid + 1, GFP_ATOMIC);
+	ret = idr_alloc_range(&glink->rcids, channel, rcid, rcid + 1, GFP_ATOMIC);
 	if (ret < 0) {
 		dev_err(glink->dev, "Unable to insert channel into rcid list\n");
 		spin_unlock_irqrestore(&glink->idr_lock, flags);
diff --git a/drivers/rpmsg/virtio_rpmsg_bus.c b/drivers/rpmsg/virtio_rpmsg_bus.c
index 905ac7910c98..5e582aaad676 100644
--- a/drivers/rpmsg/virtio_rpmsg_bus.c
+++ b/drivers/rpmsg/virtio_rpmsg_bus.c
@@ -239,7 +239,7 @@ static struct rpmsg_endpoint *__rpmsg_create_ept(struct virtproc_info *vrp,
 	mutex_lock(&vrp->endpoints_lock);
 
 	/* bind the endpoint to an rpmsg address (and allocate one if needed) */
-	id = idr_alloc(&vrp->endpoints, ept, id_min, id_max, GFP_KERNEL);
+	id = idr_alloc_range(&vrp->endpoints, ept, id_min, id_max, GFP_KERNEL);
 	if (id < 0) {
 		dev_err(dev, "idr_alloc failed: %d\n", id);
 		goto free_ept;
diff --git a/drivers/scsi/bfa/bfad_im.c b/drivers/scsi/bfa/bfad_im.c
index c335f7a188d2..9d5eefd409e5 100644
--- a/drivers/scsi/bfa/bfad_im.c
+++ b/drivers/scsi/bfa/bfad_im.c
@@ -538,7 +538,7 @@ bfad_im_scsi_host_alloc(struct bfad_s *bfad, struct bfad_im_port_s *im_port,
 	int error;
 
 	mutex_lock(&bfad_mutex);
-	error = idr_alloc(&bfad_im_port_index, im_port, 0, 0, GFP_KERNEL);
+	error = idr_alloc(&bfad_im_port_index, im_port, GFP_KERNEL);
 	if (error < 0) {
 		mutex_unlock(&bfad_mutex);
 		printk(KERN_WARNING "idr_alloc failure\n");
diff --git a/drivers/scsi/ch.c b/drivers/scsi/ch.c
index 908854869864..474c71d0463f 100644
--- a/drivers/scsi/ch.c
+++ b/drivers/scsi/ch.c
@@ -900,7 +900,7 @@ static int ch_probe(struct device *dev)
 
 	idr_preload(GFP_KERNEL);
 	spin_lock(&ch_index_lock);
-	ret = idr_alloc(&ch_index_idr, ch, 0, CH_MAX_DEVS + 1, GFP_NOWAIT);
+	ret = idr_alloc_max(&ch_index_idr, ch, CH_MAX_DEVS + 1, GFP_NOWAIT);
 	spin_unlock(&ch_index_lock);
 	idr_preload_end();
 
diff --git a/drivers/scsi/cxlflash/ocxl_hw.c b/drivers/scsi/cxlflash/ocxl_hw.c
index 244fc27215dc..3b2dd3f0caec 100644
--- a/drivers/scsi/cxlflash/ocxl_hw.c
+++ b/drivers/scsi/cxlflash/ocxl_hw.c
@@ -495,7 +495,7 @@ static void *ocxlflash_dev_context_init(struct pci_dev *pdev, void *afu_cookie)
 	}
 
 	idr_preload(GFP_KERNEL);
-	rc = idr_alloc(&afu->idr, ctx, 0, afu->max_pasid, GFP_NOWAIT);
+	rc = idr_alloc_max(&afu->idr, ctx, afu->max_pasid, GFP_NOWAIT);
 	idr_preload_end();
 	if (unlikely(rc < 0)) {
 		dev_err(dev, "%s: idr_alloc failed rc=%d\n", __func__, rc);
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c
index 750dd1e9f2cc..554f9231ef16 100644
--- a/drivers/scsi/lpfc/lpfc_init.c
+++ b/drivers/scsi/lpfc/lpfc_init.c
@@ -4894,7 +4894,7 @@ lpfc_get_instance(void)
 {
 	int ret;
 
-	ret = idr_alloc(&lpfc_hba_index, NULL, 0, 0, GFP_KERNEL);
+	ret = idr_alloc(&lpfc_hba_index, NULL, GFP_KERNEL);
 	return ret < 0 ? -1 : ret;
 }
 
diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c
index 5d21f07456c6..df86285773ad 100644
--- a/drivers/scsi/scsi_transport_iscsi.c
+++ b/drivers/scsi/scsi_transport_iscsi.c
@@ -217,7 +217,8 @@ iscsi_create_endpoint(int dd_size)
 	 * First endpoint id should be 1 to comply with user space
 	 * applications (iscsid).
 	 */
-	id = idr_alloc(&iscsi_ep_idr, ep, 1, -1, GFP_NOIO);
+	id = idr_alloc_min(&iscsi_ep_idr, ep, 1, GFP_NOIO);
+
 	if (id < 0) {
 		mutex_unlock(&iscsi_ep_idr_mutex);
 		printk(KERN_ERR "Could not allocate endpoint ID. Error %d.\n",
diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c
index 118c7b4a8af2..52632741ef94 100644
--- a/drivers/scsi/sg.c
+++ b/drivers/scsi/sg.c
@@ -1450,7 +1450,7 @@ sg_alloc(struct scsi_device *scsidp)
 	idr_preload(GFP_KERNEL);
 	write_lock_irqsave(&sg_index_lock, iflags);
 
-	error = idr_alloc(&sg_index_idr, sdp, 0, SG_MAX_DEVS, GFP_NOWAIT);
+	error = idr_alloc_max(&sg_index_idr, sdp, SG_MAX_DEVS, GFP_NOWAIT);
 	if (error < 0) {
 		if (error == -ENOSPC) {
 			sdev_printk(KERN_WARNING, scsidp,
diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c
index 850172a2b8f1..02dc4f24a839 100644
--- a/drivers/scsi/st.c
+++ b/drivers/scsi/st.c
@@ -4343,7 +4343,7 @@ static int st_probe(struct device *dev)
 
 	idr_preload(GFP_KERNEL);
 	spin_lock(&st_index_lock);
-	error = idr_alloc(&st_index_idr, tpnt, 0, ST_MAX_TAPES + 1, GFP_NOWAIT);
+	error = idr_alloc_max(&st_index_idr, tpnt, ST_MAX_TAPES + 1, GFP_NOWAIT);
 	spin_unlock(&st_index_lock);
 	idr_preload_end();
 	if (error < 0) {
diff --git a/drivers/soc/qcom/apr.c b/drivers/soc/qcom/apr.c
index 3caabd873322..ae5417dc74e9 100644
--- a/drivers/soc/qcom/apr.c
+++ b/drivers/soc/qcom/apr.c
@@ -457,7 +457,7 @@ static int apr_add_device(struct device *dev, struct device_node *np,
 	adev->dev.driver = NULL;
 
 	spin_lock(&apr->svcs_lock);
-	idr_alloc(&apr->svcs_idr, svc, svc_id, svc_id + 1, GFP_ATOMIC);
+	idr_alloc_range(&apr->svcs_idr, svc, svc_id, svc_id + 1, GFP_ATOMIC);
 	spin_unlock(&apr->svcs_lock);
 
 	of_property_read_string_index(np, "qcom,protection-domain",
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index ea09d1b42bf6..a42df3949408 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -2939,8 +2939,8 @@ int spi_register_controller(struct spi_controller *ctlr)
 	if (ctlr->bus_num >= 0) {
 		/* devices with a fixed bus num must check-in with the num */
 		mutex_lock(&board_lock);
-		id = idr_alloc(&spi_master_idr, ctlr, ctlr->bus_num,
-			ctlr->bus_num + 1, GFP_KERNEL);
+		id = idr_alloc_range(&spi_master_idr, ctlr, ctlr->bus_num,
+				     ctlr->bus_num + 1, GFP_KERNEL);
 		mutex_unlock(&board_lock);
 		if (WARN(id < 0, "couldn't get idr"))
 			return id == -ENOSPC ? -EBUSY : id;
@@ -2951,8 +2951,8 @@ int spi_register_controller(struct spi_controller *ctlr)
 		if (id >= 0) {
 			ctlr->bus_num = id;
 			mutex_lock(&board_lock);
-			id = idr_alloc(&spi_master_idr, ctlr, ctlr->bus_num,
-				       ctlr->bus_num + 1, GFP_KERNEL);
+			id = idr_alloc_range(&spi_master_idr, ctlr, ctlr->bus_num,
+					     ctlr->bus_num + 1, GFP_KERNEL);
 			mutex_unlock(&board_lock);
 			if (WARN(id < 0, "couldn't get idr"))
 				return id == -ENOSPC ? -EBUSY : id;
@@ -2966,8 +2966,8 @@ int spi_register_controller(struct spi_controller *ctlr)
 			first_dynamic++;
 
 		mutex_lock(&board_lock);
-		id = idr_alloc(&spi_master_idr, ctlr, first_dynamic,
-			       0, GFP_KERNEL);
+		id = idr_alloc_min(&spi_master_idr, ctlr, first_dynamic,
+				   GFP_KERNEL);
 		mutex_unlock(&board_lock);
 		if (WARN(id < 0, "couldn't get idr"))
 			return id;
diff --git a/drivers/staging/greybus/uart.c b/drivers/staging/greybus/uart.c
index dc4ed0ff1ae2..074f12fce1a5 100644
--- a/drivers/staging/greybus/uart.c
+++ b/drivers/staging/greybus/uart.c
@@ -362,7 +362,7 @@ static int alloc_minor(struct gb_tty *gb_tty)
 	int minor;
 
 	mutex_lock(&table_lock);
-	minor = idr_alloc(&tty_minors, gb_tty, 0, GB_NUM_MINORS, GFP_KERNEL);
+	minor = idr_alloc_max(&tty_minors, gb_tty, GB_NUM_MINORS, GFP_KERNEL);
 	mutex_unlock(&table_lock);
 	if (minor >= 0)
 		gb_tty->minor = minor;
diff --git a/drivers/staging/pi433/pi433_if.c b/drivers/staging/pi433/pi433_if.c
index 941aaa7eab2e..a82748263cda 100644
--- a/drivers/staging/pi433/pi433_if.c
+++ b/drivers/staging/pi433/pi433_if.c
@@ -1063,7 +1063,7 @@ static int pi433_get_minor(struct pi433_device *device)
 	int retval = -ENOMEM;
 
 	mutex_lock(&minor_lock);
-	retval = idr_alloc(&pi433_idr, device, 0, N_PI433_MINORS, GFP_KERNEL);
+	retval = idr_alloc_max(&pi433_idr, device, N_PI433_MINORS, GFP_KERNEL);
 	if (retval >= 0) {
 		device->minor = retval;
 		retval = 0;
diff --git a/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c b/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c
index 845b20e4d05a..1f465eb4149a 100644
--- a/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c
+++ b/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c
@@ -198,8 +198,7 @@ get_msg_context(struct vchiq_mmal_instance *instance)
 	 * message is being replied to.
 	 */
 	mutex_lock(&instance->context_map_lock);
-	handle = idr_alloc(&instance->context_map, msg_context,
-			   0, 0, GFP_KERNEL);
+	handle = idr_alloc(&instance->context_map, msg_context, GFP_KERNEL);
 	mutex_unlock(&instance->context_map_lock);
 
 	if (handle < 0) {
diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c
index e368f038ff5c..4f3dafe6f680 100644
--- a/drivers/target/iscsi/iscsi_target.c
+++ b/drivers/target/iscsi/iscsi_target.c
@@ -138,7 +138,7 @@ struct iscsi_tiqn *iscsit_add_tiqn(unsigned char *buf)
 	idr_preload(GFP_KERNEL);
 	spin_lock(&tiqn_lock);
 
-	ret = idr_alloc(&tiqn_idr, NULL, 0, 0, GFP_NOWAIT);
+	ret = idr_alloc(&tiqn_idr, NULL, GFP_NOWAIT);
 	if (ret < 0) {
 		pr_err("idr_alloc() failed for tiqn->tiqn_index\n");
 		spin_unlock(&tiqn_lock);
diff --git a/drivers/tee/optee/supp.c b/drivers/tee/optee/supp.c
index 322a543b8c27..7889b7f209c3 100644
--- a/drivers/tee/optee/supp.c
+++ b/drivers/tee/optee/supp.c
@@ -172,7 +172,7 @@ static struct optee_supp_req  *supp_pop_entry(struct optee_supp *supp,
 		return ERR_PTR(-EINVAL);
 	}
 
-	*id = idr_alloc(&supp->idr, req, 1, 0, GFP_KERNEL);
+	*id = idr_alloc_min(&supp->idr, req, 1, GFP_KERNEL);
 	if (*id < 0)
 		return ERR_PTR(-ENOMEM);
 
diff --git a/drivers/tee/tee_shm.c b/drivers/tee/tee_shm.c
index f2b1bcefcadd..b930229dce2a 100644
--- a/drivers/tee/tee_shm.c
+++ b/drivers/tee/tee_shm.c
@@ -161,7 +161,7 @@ struct tee_shm *tee_shm_alloc_user_buf(struct tee_context *ctx, size_t size)
 	int id;
 
 	mutex_lock(&teedev->mutex);
-	id = idr_alloc(&teedev->idr, NULL, 1, 0, GFP_KERNEL);
+	id = idr_alloc_min(&teedev->idr, NULL, 1, GFP_KERNEL);
 	mutex_unlock(&teedev->mutex);
 	if (id < 0)
 		return ERR_PTR(id);
@@ -327,7 +327,7 @@ struct tee_shm *tee_shm_register_user_buf(struct tee_context *ctx,
 	int id;
 
 	mutex_lock(&teedev->mutex);
-	id = idr_alloc(&teedev->idr, NULL, 1, 0, GFP_KERNEL);
+	id = idr_alloc_min(&teedev->idr, NULL, 1, GFP_KERNEL);
 	mutex_unlock(&teedev->mutex);
 	if (id < 0)
 		return ERR_PTR(id);
diff --git a/drivers/tty/rpmsg_tty.c b/drivers/tty/rpmsg_tty.c
index 29db413bbc03..afdd5454ca0f 100644
--- a/drivers/tty/rpmsg_tty.c
+++ b/drivers/tty/rpmsg_tty.c
@@ -138,7 +138,7 @@ static struct rpmsg_tty_port *rpmsg_tty_alloc_cport(void)
 		return ERR_PTR(-ENOMEM);
 
 	mutex_lock(&idr_lock);
-	ret = idr_alloc(&tty_idr, cport, 0, MAX_TTY_RPMSG, GFP_KERNEL);
+	ret = idr_alloc_max(&tty_idr, cport, MAX_TTY_RPMSG, GFP_KERNEL);
 	mutex_unlock(&idr_lock);
 
 	if (ret < 0) {
diff --git a/drivers/tty/serial/mps2-uart.c b/drivers/tty/serial/mps2-uart.c
index 5e9429dcc51f..44ad5573bdd8 100644
--- a/drivers/tty/serial/mps2-uart.c
+++ b/drivers/tty/serial/mps2-uart.c
@@ -537,7 +537,7 @@ static int mps2_of_get_port(struct platform_device *pdev,
 	if (id < 0)
 		id = idr_alloc_cyclic(&ports_idr, (void *)mps_port, 0, MPS2_MAX_PORTS, GFP_KERNEL);
 	else
-		id = idr_alloc(&ports_idr, (void *)mps_port, id, MPS2_MAX_PORTS, GFP_KERNEL);
+		id = idr_alloc_range(&ports_idr, (void *)mps_port, id, MPS2_MAX_PORTS, GFP_KERNEL);
 
 	if (id < 0)
 		return id;
diff --git a/drivers/uio/uio.c b/drivers/uio/uio.c
index 43afbb7c5ab9..7cdc6b98d514 100644
--- a/drivers/uio/uio.c
+++ b/drivers/uio/uio.c
@@ -403,7 +403,7 @@ static int uio_get_minor(struct uio_device *idev)
 	int retval;
 
 	mutex_lock(&minor_lock);
-	retval = idr_alloc(&uio_idr, idev, 0, UIO_MAX_DEVICES, GFP_KERNEL);
+	retval = idr_alloc_max(&uio_idr, idev, UIO_MAX_DEVICES, GFP_KERNEL);
 	if (retval >= 0) {
 		idev->minor = retval;
 		retval = 0;
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
index 9b9aea24d58c..682476828ad5 100644
--- a/drivers/usb/class/cdc-acm.c
+++ b/drivers/usb/class/cdc-acm.c
@@ -89,7 +89,7 @@ static int acm_alloc_minor(struct acm *acm)
 	int minor;
 
 	mutex_lock(&acm_minors_lock);
-	minor = idr_alloc(&acm_minors, acm, 0, ACM_TTY_MINORS, GFP_KERNEL);
+	minor = idr_alloc_max(&acm_minors, acm, ACM_TTY_MINORS, GFP_KERNEL);
 	mutex_unlock(&acm_minors_lock);
 
 	return minor;
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index 06eea8848ccc..10847f2817c4 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -924,7 +924,7 @@ static int usb_register_bus(struct usb_bus *bus)
 	int busnum;
 
 	mutex_lock(&usb_bus_idr_lock);
-	busnum = idr_alloc(&usb_bus_idr, bus, 1, USB_MAXBUS, GFP_KERNEL);
+	busnum = idr_alloc_range(&usb_bus_idr, bus, 1, USB_MAXBUS, GFP_KERNEL);
 	if (busnum < 0) {
 		pr_err("%s: failed to get bus number\n", usbcore_name);
 		goto error_find_busnum;
diff --git a/drivers/usb/host/xhci-dbgtty.c b/drivers/usb/host/xhci-dbgtty.c
index d3acc0829ee5..1c29c4ffd6a3 100644
--- a/drivers/usb/host/xhci-dbgtty.c
+++ b/drivers/usb/host/xhci-dbgtty.c
@@ -417,7 +417,7 @@ static int xhci_dbc_tty_register_device(struct xhci_dbc *dbc)
 	xhci_dbc_tty_init_port(dbc, port);
 
 	mutex_lock(&dbc_tty_minors_lock);
-	port->minor = idr_alloc(&dbc_tty_minors, port, 0, 64, GFP_KERNEL);
+	port->minor = idr_alloc_max(&dbc_tty_minors, port, 64, GFP_KERNEL);
 	mutex_unlock(&dbc_tty_minors_lock);
 
 	if (port->minor < 0) {
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c
index 24101bd7fcad..9249b3ca6112 100644
--- a/drivers/usb/serial/usb-serial.c
+++ b/drivers/usb/serial/usb-serial.c
@@ -92,8 +92,9 @@ static int allocate_minors(struct usb_serial *serial, int num_ports)
 	mutex_lock(&table_lock);
 	for (i = 0; i < num_ports; ++i) {
 		port = serial->port[i];
-		minor = idr_alloc(&serial_minors, port, 0,
-					USB_SERIAL_TTY_MINORS, GFP_KERNEL);
+		minor = idr_alloc_max(&serial_minors, port,
+				      USB_SERIAL_TTY_MINORS,
+				      GFP_KERNEL);
 		if (minor < 0)
 			goto error;
 		port->minor = minor;
diff --git a/drivers/vdpa/vdpa_user/vduse_dev.c b/drivers/vdpa/vdpa_user/vduse_dev.c
index 3bc27de58f46..cc391759862a 100644
--- a/drivers/vdpa/vdpa_user/vduse_dev.c
+++ b/drivers/vdpa/vdpa_user/vduse_dev.c
@@ -1339,7 +1339,7 @@ static int vduse_create_dev(struct vduse_dev_config *config,
 		spin_lock_init(&dev->vqs[i].irq_lock);
 	}
 
-	ret = idr_alloc(&vduse_idr, dev, 1, VDUSE_DEV_MAX, GFP_KERNEL);
+	ret = idr_alloc_range(&vduse_idr, dev, 1, VDUSE_DEV_MAX, GFP_KERNEL);
 	if (ret < 0)
 		goto err_idr;
 
diff --git a/fs/cifs/cifs_swn.c b/fs/cifs/cifs_swn.c
index 1e4c7cc5287f..560f59f7da6e 100644
--- a/fs/cifs/cifs_swn.c
+++ b/fs/cifs/cifs_swn.c
@@ -328,7 +328,7 @@ static struct cifs_swn_reg *cifs_get_swn_reg(struct cifs_tcon *tcon)
 
 	kref_init(&reg->ref_count);
 
-	reg->id = idr_alloc(&cifs_swnreg_idr, reg, 1, 0, GFP_ATOMIC);
+	reg->id = idr_alloc_min(&cifs_swnreg_idr, reg, 1, GFP_ATOMIC);
 	if (reg->id < 0) {
 		cifs_dbg(FYI, "%s: failed to allocate registration id\n", __func__);
 		ret = reg->id;
diff --git a/fs/dlm/lock.c b/fs/dlm/lock.c
index 226822f49d30..c6c61e80afc4 100644
--- a/fs/dlm/lock.c
+++ b/fs/dlm/lock.c
@@ -1217,7 +1217,7 @@ static int _create_lkb(struct dlm_ls *ls, struct dlm_lkb **lkb_ret,
 
 	idr_preload(GFP_NOFS);
 	spin_lock(&ls->ls_lkbidr_spin);
-	rv = idr_alloc(&ls->ls_lkbidr, lkb, start, end, GFP_NOWAIT);
+	rv = idr_alloc_range(&ls->ls_lkbidr, lkb, start, end, GFP_NOWAIT);
 	if (rv >= 0)
 		lkb->lkb_id = rv;
 	spin_unlock(&ls->ls_lkbidr_spin);
diff --git a/fs/dlm/recover.c b/fs/dlm/recover.c
index ccff1791803f..9b6428c5d7eb 100644
--- a/fs/dlm/recover.c
+++ b/fs/dlm/recover.c
@@ -315,7 +315,7 @@ static int recover_idr_add(struct dlm_rsb *r)
 		rv = -1;
 		goto out_unlock;
 	}
-	rv = idr_alloc(&ls->ls_recover_idr, r, 1, 0, GFP_NOWAIT);
+	rv = idr_alloc_min(&ls->ls_recover_idr, r, 1, GFP_NOWAIT);
 	if (rv < 0)
 		goto out_unlock;
 
diff --git a/fs/erofs/super.c b/fs/erofs/super.c
index 95addc5c9d34..055619b919b1 100644
--- a/fs/erofs/super.c
+++ b/fs/erofs/super.c
@@ -307,7 +307,7 @@ static int erofs_scan_devices(struct super_block *sb,
 				break;
 			}
 
-			err = idr_alloc(&sbi->devs->tree, dif, 0, 0, GFP_KERNEL);
+			err = idr_alloc(&sbi->devs->tree, dif, GFP_KERNEL);
 			if (err < 0) {
 				kfree(dif);
 				break;
@@ -550,7 +550,7 @@ static int erofs_fc_parse_param(struct fs_context *fc,
 			return -ENOMEM;
 		}
 		down_write(&ctx->devs->rwsem);
-		ret = idr_alloc(&ctx->devs->tree, dif, 0, 0, GFP_KERNEL);
+		ret = idr_alloc(&ctx->devs->tree, dif, GFP_KERNEL);
 		up_write(&ctx->devs->rwsem);
 		if (ret < 0) {
 			kfree(dif->path);
diff --git a/fs/nfs/nfs4client.c b/fs/nfs/nfs4client.c
index 47a6cf892c95..0f992090e30a 100644
--- a/fs/nfs/nfs4client.c
+++ b/fs/nfs/nfs4client.c
@@ -34,7 +34,7 @@ static int nfs_get_cb_ident_idr(struct nfs_client *clp, int minorversion)
 		return ret;
 	idr_preload(GFP_KERNEL);
 	spin_lock(&nn->nfs_client_lock);
-	ret = idr_alloc(&nn->cb_ident_idr, clp, 1, 0, GFP_NOWAIT);
+	ret = idr_alloc_min(&nn->cb_ident_idr, clp, 1, GFP_NOWAIT);
 	if (ret >= 0)
 		clp->cl_cb_ident = ret;
 	spin_unlock(&nn->nfs_client_lock);
diff --git a/fs/ocfs2/cluster/tcp.c b/fs/ocfs2/cluster/tcp.c
index f660c0dbdb63..462952dd3273 100644
--- a/fs/ocfs2/cluster/tcp.c
+++ b/fs/ocfs2/cluster/tcp.c
@@ -292,7 +292,7 @@ static int o2net_prep_nsw(struct o2net_node *nn, struct o2net_status_wait *nsw)
 	int ret;
 
 	spin_lock(&nn->nn_lock);
-	ret = idr_alloc(&nn->nn_status_idr, nsw, 0, 0, GFP_ATOMIC);
+	ret = idr_alloc(&nn->nn_status_idr, nsw, GFP_ATOMIC);
 	if (ret >= 0) {
 		nsw->ns_id = ret;
 		list_add_tail(&nsw->ns_node_item, &nn->nn_status_list);
diff --git a/include/linux/idr.h b/include/linux/idr.h
index a0dce14090a9..57094351c521 100644
--- a/include/linux/idr.h
+++ b/include/linux/idr.h
@@ -111,7 +111,7 @@ static inline void idr_set_cursor(struct idr *idr, unsigned int val)
 
 void idr_preload(gfp_t gfp_mask);
 
-int idr_alloc(struct idr *, void *ptr, int start, int end, gfp_t);
+int idr_alloc_range(struct idr *, void *ptr, int start, int end, gfp_t);
 int __must_check idr_alloc_u32(struct idr *, void *ptr, u32 *id,
 				unsigned long max, gfp_t);
 int idr_alloc_cyclic(struct idr *, void *ptr, int start, int end, gfp_t);
@@ -124,6 +124,72 @@ void *idr_get_next_ul(struct idr *, unsigned long *nextid);
 void *idr_replace(struct idr *, void *, unsigned long id);
 void idr_destroy(struct idr *);
 
+/**
+ * idr_alloc() - Allocate an ID.
+ * @idr: IDR handle.
+ * @ptr: Pointer to be associated with the new ID.
+ * @gfp: Memory allocation flags.
+ *
+ * Allocates an unused ID in the range between 0 (inclusive) and INT_MAX
+ * (inclusive).
+ *
+ * The caller should provide their own locking to ensure that two
+ * concurrent modifications to the IDR are not possible.  Read-only
+ * accesses to the IDR may be done under the RCU read lock or may
+ * exclude simultaneous writers.
+ *
+ * Return: The newly allocated ID, -ENOMEM if memory allocation failed,
+ * or -ENOSPC if no free IDs could be found.
+ */
+static inline int idr_alloc(struct idr *idr, void *ptr, gfp_t gfp)
+{
+	return idr_alloc_range(idr, ptr, 0, 0, gfp);
+}
+
+/**
+ * idr_alloc_min() - Allocate an ID.
+ * @idr: IDR handle.
+ * @ptr: Pointer to be associated with the new ID.
+ * @start: The minimum ID (inclusive).
+ * @gfp: Memory allocation flags.
+ *
+ * Allocates an unused ID in the range between @start and INT_MAX (inclusive).
+ *
+ * The caller should provide their own locking to ensure that two
+ * concurrent modifications to the IDR are not possible.  Read-only
+ * accesses to the IDR may be done under the RCU read lock or may
+ * exclude simultaneous writers.
+ *
+ * Return: The newly allocated ID, -ENOMEM if memory allocation failed,
+ * or -ENOSPC if no free IDs could be found.
+ */
+static inline int idr_alloc_min(struct idr *idr, void *ptr, int start, gfp_t gfp)
+{
+	return idr_alloc_range(idr, ptr, start, 0, gfp);
+}
+
+/**
+ * idr_alloc_max() - Allocate an ID.
+ * @idr: IDR handle.
+ * @ptr: Pointer to be associated with the new ID.
+ * @end: The maximum ID (exclusive)
+ * @gfp: Memory allocation flags.
+ *
+ * Allocates an unused ID in the range between 0 (inclusive) and @end.
+ *
+ * The caller should provide their own locking to ensure that two
+ * concurrent modifications to the IDR are not possible.  Read-only
+ * accesses to the IDR may be done under the RCU read lock or may
+ * exclude simultaneous writers.
+ *
+ * Return: The newly allocated ID, -ENOMEM if memory allocation failed,
+ * or -ENOSPC if no free IDs could be found.
+ */
+static inline int idr_alloc_max(struct idr *idr, void *ptr, int end, gfp_t gfp)
+{
+	return idr_alloc_range(idr, ptr, 0, end, gfp);
+}
+
 /**
  * idr_init_base() - Initialise an IDR.
  * @idr: IDR handle.
diff --git a/ipc/util.c b/ipc/util.c
index a2208d0f26b2..bdfd7c0b3796 100644
--- a/ipc/util.c
+++ b/ipc/util.c
@@ -252,8 +252,8 @@ static inline int ipc_idr_alloc(struct ipc_ids *ids, struct kern_ipc_perm *new)
 		}
 	} else {
 		new->seq = ipcid_to_seqx(next_id);
-		idx = idr_alloc(&ids->ipcs_idr, new, ipcid_to_idx(next_id),
-				0, GFP_NOWAIT);
+		idx = idr_alloc_min(&ids->ipcs_idr, new, ipcid_to_idx(next_id),
+				    GFP_NOWAIT);
 	}
 	if (idx >= 0)
 		new->id = (new->seq << ipcmni_seq_shift()) + idx;
diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c
index 1779ccddb734..a3d2ef7f1e91 100644
--- a/kernel/cgroup/cgroup.c
+++ b/kernel/cgroup/cgroup.c
@@ -323,7 +323,7 @@ static int cgroup_idr_alloc(struct idr *idr, void *ptr, int start, int end,
 
 	idr_preload(gfp_mask);
 	spin_lock_bh(&cgroup_idr_lock);
-	ret = idr_alloc(idr, ptr, start, end, gfp_mask & ~__GFP_DIRECT_RECLAIM);
+	ret = idr_alloc_range(idr, ptr, start, end, gfp_mask & ~__GFP_DIRECT_RECLAIM);
 	spin_unlock_bh(&cgroup_idr_lock);
 	idr_preload_end();
 	return ret;
diff --git a/kernel/events/core.c b/kernel/events/core.c
index 80782cddb1da..a7fc7a8e3961 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -11065,7 +11065,7 @@ int perf_pmu_register(struct pmu *pmu, const char *name, int type)
 		if (type >= 0)
 			max = type;
 
-		ret = idr_alloc(&pmu_idr, pmu, max, 0, GFP_KERNEL);
+		ret = idr_alloc_min(&pmu_idr, pmu, max, GFP_KERNEL);
 		if (ret < 0)
 			goto free_pdc;
 
diff --git a/kernel/irq/timings.c b/kernel/irq/timings.c
index c43e2ac2f8de..b14b7f2f432d 100644
--- a/kernel/irq/timings.c
+++ b/kernel/irq/timings.c
@@ -622,7 +622,7 @@ int irq_timings_alloc(int irq)
 		return -ENOMEM;
 
 	idr_preload(GFP_KERNEL);
-	id = idr_alloc(&irqt_stats, s, irq, irq + 1, GFP_NOWAIT);
+	id = idr_alloc_range(&irqt_stats, s, irq, irq + 1, GFP_NOWAIT);
 	idr_preload_end();
 
 	if (id < 0) {
diff --git a/kernel/pid.c b/kernel/pid.c
index 2fc0a16ec77b..1461644c49c4 100644
--- a/kernel/pid.c
+++ b/kernel/pid.c
@@ -209,8 +209,8 @@ struct pid *alloc_pid(struct pid_namespace *ns, pid_t *set_tid,
 		spin_lock_irq(&pidmap_lock);
 
 		if (tid) {
-			nr = idr_alloc(&tmp->idr, NULL, tid,
-				       tid + 1, GFP_ATOMIC);
+			nr = idr_alloc_range(&tmp->idr, NULL, tid,
+					     tid + 1, GFP_ATOMIC);
 			/*
 			 * If ENOSPC is returned it means that the PID is
 			 * alreay in use. Return EEXIST in that case.
diff --git a/kernel/workqueue.c b/kernel/workqueue.c
index 1ea50f6be843..ef4ac66ce9c2 100644
--- a/kernel/workqueue.c
+++ b/kernel/workqueue.c
@@ -555,8 +555,8 @@ static int worker_pool_assign_id(struct worker_pool *pool)
 
 	lockdep_assert_held(&wq_pool_mutex);
 
-	ret = idr_alloc(&worker_pool_idr, pool, 0, WORK_OFFQ_POOL_NONE,
-			GFP_KERNEL);
+	ret = idr_alloc_max(&worker_pool_idr, pool, WORK_OFFQ_POOL_NONE,
+			    GFP_KERNEL);
 	if (ret >= 0) {
 		pool->id = ret;
 		return 0;
diff --git a/lib/idr.c b/lib/idr.c
index f4ab4f4aa3c7..e179bf643c9e 100644
--- a/lib/idr.c
+++ b/lib/idr.c
@@ -57,7 +57,7 @@ int idr_alloc_u32(struct idr *idr, void *ptr, u32 *nextid,
 EXPORT_SYMBOL_GPL(idr_alloc_u32);
 
 /**
- * idr_alloc() - Allocate an ID.
+ * idr_alloc_range() - Allocate an ID.
  * @idr: IDR handle.
  * @ptr: Pointer to be associated with the new ID.
  * @start: The minimum ID (inclusive).
@@ -76,7 +76,7 @@ EXPORT_SYMBOL_GPL(idr_alloc_u32);
  * Return: The newly allocated ID, -ENOMEM if memory allocation failed,
  * or -ENOSPC if no free IDs could be found.
  */
-int idr_alloc(struct idr *idr, void *ptr, int start, int end, gfp_t gfp)
+int idr_alloc_range(struct idr *idr, void *ptr, int start, int end, gfp_t gfp)
 {
 	u32 id = start;
 	int ret;
@@ -90,7 +90,7 @@ int idr_alloc(struct idr *idr, void *ptr, int start, int end, gfp_t gfp)
 
 	return id;
 }
-EXPORT_SYMBOL_GPL(idr_alloc);
+EXPORT_SYMBOL_GPL(idr_alloc_range);
 
 /**
  * idr_alloc_cyclic() - Allocate an ID cyclically.
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 618c366a2f07..aa9cb41a8f75 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -5120,8 +5120,8 @@ static struct mem_cgroup *mem_cgroup_alloc(void)
 	if (!memcg)
 		return ERR_PTR(error);
 
-	memcg->id.id = idr_alloc(&mem_cgroup_idr, NULL,
-				 1, MEM_CGROUP_ID_MAX + 1, GFP_KERNEL);
+	memcg->id.id = idr_alloc_range(&mem_cgroup_idr, NULL,
+				       1, MEM_CGROUP_ID_MAX + 1, GFP_KERNEL);
 	if (memcg->id.id < 0) {
 		error = memcg->id.id;
 		goto fail;
diff --git a/mm/vmscan.c b/mm/vmscan.c
index f7d9a683e3a7..6a2b42a88e9b 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -360,7 +360,7 @@ static int prealloc_memcg_shrinker(struct shrinker *shrinker)
 
 	down_write(&shrinker_rwsem);
 	/* This may call shrinker, so it must use down_read_trylock() */
-	id = idr_alloc(&shrinker_idr, shrinker, 0, 0, GFP_KERNEL);
+	id = idr_alloc(&shrinker_idr, shrinker, GFP_KERNEL);
 	if (id < 0)
 		goto unlock;
 
diff --git a/net/9p/client.c b/net/9p/client.c
index 8bba0d9cf975..9a60af6324b3 100644
--- a/net/9p/client.c
+++ b/net/9p/client.c
@@ -285,10 +285,10 @@ p9_tag_alloc(struct p9_client *c, int8_t type, unsigned int max_size)
 	idr_preload(GFP_NOFS);
 	spin_lock_irq(&c->lock);
 	if (type == P9_TVERSION)
-		tag = idr_alloc(&c->reqs, req, P9_NOTAG, P9_NOTAG + 1,
-				GFP_NOWAIT);
+		tag = idr_alloc_range(&c->reqs, req, P9_NOTAG, P9_NOTAG + 1,
+				      GFP_NOWAIT);
 	else
-		tag = idr_alloc(&c->reqs, req, 0, P9_NOTAG, GFP_NOWAIT);
+		tag = idr_alloc_max(&c->reqs, req, P9_NOTAG, GFP_NOWAIT);
 	req->tc.tag = tag;
 	spin_unlock_irq(&c->lock);
 	idr_preload_end();
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index 59a5c1341c26..e4eb3d4b0728 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -1902,8 +1902,8 @@ bool hci_add_adv_monitor(struct hci_dev *hdev, struct adv_monitor *monitor,
 
 	min = HCI_MIN_ADV_MONITOR_HANDLE;
 	max = HCI_MIN_ADV_MONITOR_HANDLE + HCI_MAX_ADV_MONITOR_NUM_HANDLES;
-	handle = idr_alloc(&hdev->adv_monitors_idr, monitor, min, max,
-			   GFP_KERNEL);
+	handle = idr_alloc_range(&hdev->adv_monitors_idr, monitor, min, max,
+				 GFP_KERNEL);
 	if (handle < 0) {
 		*err = handle;
 		return false;
diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c
index 0ec2f5906a27..604232a4f2c1 100644
--- a/net/core/net_namespace.c
+++ b/net/core/net_namespace.c
@@ -187,7 +187,7 @@ static int alloc_netid(struct net *net, struct net *peer, int reqid)
 		max = reqid + 1;
 	}
 
-	return idr_alloc(&net->netns_ids, peer, min, max, GFP_ATOMIC);
+	return idr_alloc_range(&net->netns_ids, peer, min, max, GFP_ATOMIC);
 }
 
 /* This function is used by idr_for_each(). If net is equal to peer, the
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index f7896f257e1b..841c7877058b 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -325,9 +325,9 @@ static int ieee80211_add_nan_func(struct wiphy *wiphy,
 
 	spin_lock_bh(&sdata->u.nan.func_lock);
 
-	ret = idr_alloc(&sdata->u.nan.function_inst_ids,
-			nan_func, 1, sdata->local->hw.max_nan_de_entries + 1,
-			GFP_ATOMIC);
+	ret = idr_alloc_range(&sdata->u.nan.function_inst_ids,
+			      nan_func, 1, sdata->local->hw.max_nan_de_entries + 1,
+			      GFP_ATOMIC);
 	spin_unlock_bh(&sdata->u.nan.func_lock);
 
 	if (ret < 0)
@@ -3732,8 +3732,8 @@ int ieee80211_attach_ack_skb(struct ieee80211_local *local, struct sk_buff *skb,
 		return -ENOMEM;
 
 	spin_lock_irqsave(&local->ack_status_lock, spin_flags);
-	id = idr_alloc(&local->ack_status_frames, ack_skb,
-		       1, 0x2000, GFP_ATOMIC);
+	id = idr_alloc_range(&local->ack_status_frames, ack_skb,
+			     1, 0x2000, GFP_ATOMIC);
 	spin_unlock_irqrestore(&local->ack_status_lock, spin_flags);
 
 	if (id < 0) {
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
index 0e4efc08c762..675bf6291e4d 100644
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
@@ -2509,8 +2509,8 @@ static u16 ieee80211_store_ack_skb(struct ieee80211_local *local,
 		int id;
 
 		spin_lock_irqsave(&local->ack_status_lock, flags);
-		id = idr_alloc(&local->ack_status_frames, ack_skb,
-			       1, 0x2000, GFP_ATOMIC);
+		id = idr_alloc_range(&local->ack_status_frames, ack_skb,
+				     1, 0x2000, GFP_ATOMIC);
 		spin_unlock_irqrestore(&local->ack_status_lock, flags);
 
 		if (id >= 0) {
diff --git a/net/tipc/topsrv.c b/net/tipc/topsrv.c
index 5522865deae9..8edb25a456ee 100644
--- a/net/tipc/topsrv.c
+++ b/net/tipc/topsrv.c
@@ -194,7 +194,7 @@ static struct tipc_conn *tipc_conn_alloc(struct tipc_topsrv *s)
 	INIT_WORK(&con->rwork, tipc_conn_recv_work);
 
 	spin_lock_bh(&s->idr_lock);
-	ret = idr_alloc(&s->conn_idr, con, 0, 0, GFP_ATOMIC);
+	ret = idr_alloc(&s->conn_idr, con, GFP_ATOMIC);
 	if (ret < 0) {
 		kfree(con);
 		spin_unlock_bh(&s->idr_lock);
diff --git a/security/apparmor/secid.c b/security/apparmor/secid.c
index ce545f99259e..d2fca8aff08a 100644
--- a/security/apparmor/secid.c
+++ b/security/apparmor/secid.c
@@ -128,7 +128,7 @@ int aa_alloc_secid(struct aa_label *label, gfp_t gfp)
 
 	idr_preload(gfp);
 	spin_lock_irqsave(&secid_lock, flags);
-	ret = idr_alloc(&aa_secids, label, AA_FIRST_SECID, 0, GFP_ATOMIC);
+	ret = idr_alloc_min(&aa_secids, label, AA_FIRST_SECID, GFP_ATOMIC);
 	spin_unlock_irqrestore(&secid_lock, flags);
 	idr_preload_end();
 
diff --git a/sound/ac97/bus.c b/sound/ac97/bus.c
index 0d31a6d71468..04f37db167a3 100644
--- a/sound/ac97/bus.c
+++ b/sound/ac97/bus.c
@@ -313,7 +313,7 @@ static int ac97_add_adapter(struct ac97_controller *ac97_ctrl)
 	int ret;
 
 	mutex_lock(&ac97_controllers_mutex);
-	ret = idr_alloc(&ac97_adapter_idr, ac97_ctrl, 0, 0, GFP_KERNEL);
+	ret = idr_alloc(&ac97_adapter_idr, ac97_ctrl, GFP_KERNEL);
 	ac97_ctrl->nr = ret;
 	if (ret >= 0) {
 		dev_set_name(&ac97_ctrl->adap, "ac97-%d", ret);
diff --git a/sound/soc/qcom/qdsp6/q6apm.c b/sound/soc/qcom/qdsp6/q6apm.c
index f424d7aa389a..18c7fc0f25c4 100644
--- a/sound/soc/qcom/qdsp6/q6apm.c
+++ b/sound/soc/qcom/qdsp6/q6apm.c
@@ -72,7 +72,7 @@ static struct audioreach_graph *q6apm_get_audioreach_graph(struct q6apm *apm, ui
 	}
 
 	mutex_lock(&apm->lock);
-	id = idr_alloc(&apm->graph_idr, graph, graph_id, graph_id + 1, GFP_KERNEL);
+	id = idr_alloc_range(&apm->graph_idr, graph, graph_id, graph_id + 1, GFP_KERNEL);
 	if (id < 0) {
 		dev_err(apm->dev, "Unable to allocate graph id (%d)\n", graph_id);
 		kfree(graph);
diff --git a/sound/soc/qcom/qdsp6/topology.c b/sound/soc/qcom/qdsp6/topology.c
index bd649c232a06..af6092d51ba5 100644
--- a/sound/soc/qcom/qdsp6/topology.c
+++ b/sound/soc/qcom/qdsp6/topology.c
@@ -44,7 +44,7 @@ static struct audioreach_graph_info *audioreach_tplg_alloc_graph_info(struct q6a
 	INIT_LIST_HEAD(&info->sg_list);
 
 	mutex_lock(&apm->lock);
-	ret = idr_alloc(&apm->graph_info_idr, info, graph_id, graph_id + 1, GFP_KERNEL);
+	ret = idr_alloc_range(&apm->graph_info_idr, info, graph_id, graph_id + 1, GFP_KERNEL);
 	mutex_unlock(&apm->lock);
 
 	if (ret < 0) {
@@ -94,7 +94,7 @@ static struct audioreach_sub_graph *audioreach_tplg_alloc_sub_graph(struct q6apm
 	INIT_LIST_HEAD(&sg->container_list);
 
 	mutex_lock(&apm->lock);
-	ret = idr_alloc(&apm->sub_graphs_idr, sg, sub_graph_id, sub_graph_id + 1, GFP_KERNEL);
+	ret = idr_alloc_range(&apm->sub_graphs_idr, sg, sub_graph_id, sub_graph_id + 1, GFP_KERNEL);
 	mutex_unlock(&apm->lock);
 
 	if (ret < 0) {
@@ -136,7 +136,8 @@ static struct audioreach_container *audioreach_tplg_alloc_container(struct q6apm
 	INIT_LIST_HEAD(&cont->modules_list);
 
 	mutex_lock(&apm->lock);
-	ret = idr_alloc(&apm->containers_idr, cont, container_id, container_id + 1, GFP_KERNEL);
+	ret = idr_alloc_range(&apm->containers_idr, cont, container_id, container_id + 1,
+			      GFP_KERNEL);
 	mutex_unlock(&apm->lock);
 
 	if (ret < 0) {
@@ -181,7 +182,7 @@ static struct audioreach_module *audioreach_tplg_alloc_module(struct q6apm *apm,
 				       AR_MODULE_DYNAMIC_INSTANCE_ID_START,
 				       AR_MODULE_DYNAMIC_INSTANCE_ID_END, GFP_KERNEL);
 	} else {
-		ret = idr_alloc(&apm->modules_idr, mod, module_id, module_id + 1, GFP_KERNEL);
+		ret = idr_alloc_range(&apm->modules_idr, mod, module_id, module_id + 1, GFP_KERNEL);
 	}
 	mutex_unlock(&apm->lock);
 
diff --git a/tools/testing/radix-tree/idr-test.c b/tools/testing/radix-tree/idr-test.c
index ca24f6839d50..2a17430c7357 100644
--- a/tools/testing/radix-tree/idr-test.c
+++ b/tools/testing/radix-tree/idr-test.c
@@ -61,7 +61,7 @@ void idr_replace_test(void)
 {
 	DEFINE_IDR(idr);
 
-	idr_alloc(&idr, (void *)-1, 10, 11, GFP_KERNEL);
+	idr_alloc_range(&idr, (void *)-1, 10, 11, GFP_KERNEL);
 	idr_replace(&idr, &idr, 10);
 
 	idr_destroy(&idr);
@@ -80,18 +80,18 @@ void idr_null_test(void)
 
 	assert(idr_is_empty(&idr));
 
-	assert(idr_alloc(&idr, NULL, 0, 0, GFP_KERNEL) == 0);
+	assert(idr_alloc(&idr, NULL, GFP_KERNEL) == 0);
 	assert(!idr_is_empty(&idr));
 	idr_remove(&idr, 0);
 	assert(idr_is_empty(&idr));
 
-	assert(idr_alloc(&idr, NULL, 0, 0, GFP_KERNEL) == 0);
+	assert(idr_alloc(&idr, NULL, GFP_KERNEL) == 0);
 	assert(!idr_is_empty(&idr));
 	idr_destroy(&idr);
 	assert(idr_is_empty(&idr));
 
 	for (i = 0; i < 10; i++) {
-		assert(idr_alloc(&idr, NULL, 0, 0, GFP_KERNEL) == i);
+		assert(idr_alloc(&idr, NULL, GFP_KERNEL) == i);
 	}
 
 	assert(idr_replace(&idr, DUMMY_PTR, 3) == NULL);
@@ -99,7 +99,7 @@ void idr_null_test(void)
 	assert(idr_replace(&idr, NULL, 4) == DUMMY_PTR);
 	assert(idr_replace(&idr, DUMMY_PTR, 11) == ERR_PTR(-ENOENT));
 	idr_remove(&idr, 5);
-	assert(idr_alloc(&idr, NULL, 0, 0, GFP_KERNEL) == 5);
+	assert(idr_alloc(&idr, NULL, GFP_KERNEL) == 5);
 	idr_remove(&idr, 5);
 
 	for (i = 0; i < 9; i++) {
@@ -111,7 +111,7 @@ void idr_null_test(void)
 	idr_remove(&idr, 9);
 	assert(idr_is_empty(&idr));
 
-	assert(idr_alloc(&idr, NULL, 0, 0, GFP_KERNEL) == 0);
+	assert(idr_alloc(&idr, NULL, GFP_KERNEL) == 0);
 	assert(idr_replace(&idr, DUMMY_PTR, 3) == ERR_PTR(-ENOENT));
 	assert(idr_replace(&idr, DUMMY_PTR, 0) == NULL);
 	assert(idr_replace(&idr, NULL, 0) == DUMMY_PTR);
@@ -120,7 +120,7 @@ void idr_null_test(void)
 	assert(idr_is_empty(&idr));
 
 	for (i = 1; i < 10; i++) {
-		assert(idr_alloc(&idr, NULL, 1, 0, GFP_KERNEL) == i);
+		assert(idr_alloc_min(&idr, NULL, 1, GFP_KERNEL) == i);
 	}
 
 	idr_destroy(&idr);
@@ -136,7 +136,7 @@ void idr_nowait_test(void)
 
 	for (i = 0; i < 3; i++) {
 		struct item *item = item_create(i, 0);
-		assert(idr_alloc(&idr, item, i, i + 1, GFP_NOWAIT) == i);
+		assert(idr_alloc_range(&idr, item, i, i + 1, GFP_NOWAIT) == i);
 	}
 
 	idr_preload_end();
@@ -156,7 +156,7 @@ void idr_get_next_test(int base)
 
 	for(i = 0; indices[i]; i++) {
 		struct item *item = item_create(indices[i], 0);
-		assert(idr_alloc(&idr, item, indices[i], indices[i+1],
+		assert(idr_alloc_range(&idr, item, indices[i], indices[i+1],
 				 GFP_KERNEL) == indices[i]);
 	}
 
@@ -226,32 +226,32 @@ static void idr_align_test(struct idr *idr)
 	void *entry;
 
 	for (i = 0; i < 9; i++) {
-		BUG_ON(idr_alloc(idr, &name[i], 0, 0, GFP_KERNEL) != i);
+		BUG_ON(idr_alloc(idr, &name[i], GFP_KERNEL) != i);
 		idr_for_each_entry(idr, entry, id);
 	}
 	idr_destroy(idr);
 
 	for (i = 1; i < 10; i++) {
-		BUG_ON(idr_alloc(idr, &name[i], 0, 0, GFP_KERNEL) != i - 1);
+		BUG_ON(idr_alloc(idr, &name[i], GFP_KERNEL) != i - 1);
 		idr_for_each_entry(idr, entry, id);
 	}
 	idr_destroy(idr);
 
 	for (i = 2; i < 11; i++) {
-		BUG_ON(idr_alloc(idr, &name[i], 0, 0, GFP_KERNEL) != i - 2);
+		BUG_ON(idr_alloc(idr, &name[i], GFP_KERNEL) != i - 2);
 		idr_for_each_entry(idr, entry, id);
 	}
 	idr_destroy(idr);
 
 	for (i = 3; i < 12; i++) {
-		BUG_ON(idr_alloc(idr, &name[i], 0, 0, GFP_KERNEL) != i - 3);
+		BUG_ON(idr_alloc(idr, &name[i], GFP_KERNEL) != i - 3);
 		idr_for_each_entry(idr, entry, id);
 	}
 	idr_destroy(idr);
 
 	for (i = 0; i < 8; i++) {
-		BUG_ON(idr_alloc(idr, &name[i], 0, 0, GFP_KERNEL) != 0);
-		BUG_ON(idr_alloc(idr, &name[i + 1], 0, 0, GFP_KERNEL) != 1);
+		BUG_ON(idr_alloc(idr, &name[i], GFP_KERNEL) != 0);
+		BUG_ON(idr_alloc_range(idr, &name[i + 1], 0, 0, GFP_KERNEL) != 1);
 		idr_for_each_entry(idr, entry, id);
 		idr_remove(idr, 1);
 		idr_for_each_entry(idr, entry, id);
@@ -260,7 +260,7 @@ static void idr_align_test(struct idr *idr)
 	}
 
 	for (i = 0; i < 8; i++) {
-		BUG_ON(idr_alloc(idr, NULL, 0, 0, GFP_KERNEL) != 0);
+		BUG_ON(idr_alloc(idr, NULL, GFP_KERNEL) != 0);
 		idr_for_each_entry(idr, entry, id);
 		idr_replace(idr, &name[i], 0);
 		idr_for_each_entry(idr, entry, id);
@@ -269,8 +269,8 @@ static void idr_align_test(struct idr *idr)
 	}
 
 	for (i = 0; i < 8; i++) {
-		BUG_ON(idr_alloc(idr, &name[i], 0, 0, GFP_KERNEL) != 0);
-		BUG_ON(idr_alloc(idr, NULL, 0, 0, GFP_KERNEL) != 1);
+		BUG_ON(idr_alloc(idr, &name[i], GFP_KERNEL) != 0);
+		BUG_ON(idr_alloc(idr, NULL, GFP_KERNEL) != 1);
 		idr_remove(idr, 1);
 		idr_for_each_entry(idr, entry, id);
 		idr_replace(idr, &name[i + 1], 0);
@@ -288,7 +288,7 @@ static void *idr_throbber(void *arg)
 
 	rcu_register_thread();
 	do {
-		idr_alloc(&find_idr, xa_mk_value(id), id, id + 1, GFP_KERNEL);
+		idr_alloc_range(&find_idr, xa_mk_value(id), id, id + 1, GFP_KERNEL);
 		idr_remove(&find_idr, id);
 	} while (time(NULL) < start + 10);
 	rcu_unregister_thread();
@@ -305,7 +305,7 @@ void idr_find_test_1(int anchor_id, int throbber_id)
 	pthread_t throbber;
 	time_t start = time(NULL);
 
-	BUG_ON(idr_alloc(&find_idr, xa_mk_value(anchor_id), anchor_id,
+	BUG_ON(idr_alloc_range(&find_idr, xa_mk_value(anchor_id), anchor_id,
 				anchor_id + 1, GFP_KERNEL) != anchor_id);
 
 	pthread_create(&throbber, NULL, idr_throbber, &throbber_id);
@@ -344,10 +344,10 @@ void idr_checks(void)
 
 	for (i = 0; i < 10000; i++) {
 		struct item *item = item_create(i, 0);
-		assert(idr_alloc(&idr, item, 0, 20000, GFP_KERNEL) == i);
+		assert(idr_alloc_max(&idr, item, 20000, GFP_KERNEL) == i);
 	}
 
-	assert(idr_alloc(&idr, DUMMY_PTR, 5, 30, GFP_KERNEL) < 0);
+	assert(idr_alloc_range(&idr, DUMMY_PTR, 5, 30, GFP_KERNEL) < 0);
 
 	for (i = 0; i < 5000; i++)
 		item_idr_remove(&idr, i);
@@ -362,19 +362,19 @@ void idr_checks(void)
 	idr_remove(&idr, 3);
 	idr_remove(&idr, 0);
 
-	assert(idr_alloc(&idr, DUMMY_PTR, 0, 0, GFP_KERNEL) == 0);
+	assert(idr_alloc(&idr, DUMMY_PTR, GFP_KERNEL) == 0);
 	idr_remove(&idr, 1);
 	for (i = 1; i < RADIX_TREE_MAP_SIZE; i++)
-		assert(idr_alloc(&idr, DUMMY_PTR, 0, 0, GFP_KERNEL) == i);
+		assert(idr_alloc(&idr, DUMMY_PTR, GFP_KERNEL) == i);
 	idr_remove(&idr, 1 << 30);
 	idr_destroy(&idr);
 
 	for (i = INT_MAX - 3UL; i < INT_MAX + 1UL; i++) {
 		struct item *item = item_create(i, 0);
-		assert(idr_alloc(&idr, item, i, i + 10, GFP_KERNEL) == i);
+		assert(idr_alloc_range(&idr, item, i, i + 10, GFP_KERNEL) == i);
 	}
-	assert(idr_alloc(&idr, DUMMY_PTR, i - 2, i, GFP_KERNEL) == -ENOSPC);
-	assert(idr_alloc(&idr, DUMMY_PTR, i - 2, i + 10, GFP_KERNEL) == -ENOSPC);
+	assert(idr_alloc_range(&idr, DUMMY_PTR, i - 2, i, GFP_KERNEL) == -ENOSPC);
+	assert(idr_alloc_range(&idr, DUMMY_PTR, i - 2, i + 10, GFP_KERNEL) == -ENOSPC);
 
 	idr_for_each(&idr, item_idr_free, &idr);
 	idr_destroy(&idr);
@@ -401,7 +401,7 @@ void idr_checks(void)
 
 	for (i = 1; i < 10000; i++) {
 		struct item *item = item_create(i, 0);
-		assert(idr_alloc(&idr, item, 1, 20000, GFP_KERNEL) == i);
+		assert(idr_alloc_range(&idr, item, 1, 20000, GFP_KERNEL) == i);
 	}
 
 	idr_for_each(&idr, item_idr_free, &idr);
-- 
2.36.1

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ