diff mbox series

[1/2] treewide: idr: align IDR and IDA APIs

Message ID 20220703181739.387584-1-dakr@redhat.com (mailing list archive)
State New
Headers show
Series [1/2] treewide: idr: align IDR and IDA APIs | expand

Commit Message

Danilo Krummrich July 3, 2022, 6:17 p.m. UTC
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@redhat.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(-)

Comments

Matthew Wilcox July 3, 2022, 8:49 p.m. UTC | #1
On Sun, Jul 03, 2022 at 08:17:38PM +0200, Danilo Krummrich wrote:
> 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.

I don't really want to make any changes to the IDR API.  I want to get
rid of the IDR API.  I'm sorry you did all this work, but you should
probaby talk to the maintainer before embarking on such a big project.

If you're interested, converting IDR users to the XArray API is an
outstanding project that I'd be interested in encouraging.
Danilo Krummrich July 3, 2022, 10:33 p.m. UTC | #2
On 7/3/22 22:49, Matthew Wilcox wrote:
> On Sun, Jul 03, 2022 at 08:17:38PM +0200, Danilo Krummrich wrote:
>> 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.
> 
> I don't really want to make any changes to the IDR API.  I want to get
> rid of the IDR API.  I'm sorry you did all this work, but you should
> probaby talk to the maintainer before embarking on such a big project.
No problem at all - didn't really took long.
> 
> If you're interested, converting IDR users to the XArray API is an
> outstanding project that I'd be interested in encouraging.
> 
Yes, I might have a look!

- Danilo
Danilo Krummrich July 4, 2022, 12:28 a.m. UTC | #3
On Sun, Jul 03, 2022 at 09:49:14PM +0100, Matthew Wilcox wrote:
> On Sun, Jul 03, 2022 at 08:17:38PM +0200, Danilo Krummrich wrote:
> > 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.
> 
> I don't really want to make any changes to the IDR API.  I want to get
> rid of the IDR API.

Forgot to mention, I noticed that there is even a new user of the IDR API in
next/master: commit d8782ec59eb8 ("mlxsw: Add an initial PGT table support")

Maybe it makes sense to point out that the IDR API is deprecated and XArray
should be used instead at the beginning of the IDR documentation file, such
that it's obvious for new potential users?

- Danilo
diff mbox series

Patch

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);