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

Danilo Krummrich
2022-07-03T18:17:59Z

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

diff --git a/arch/powerpc/kvm/book3s_hv_nested.c b/arch/powerpc/kvm/book3s_hv_nested.c
index 0644732d1a25..3ebba1512f1f 100644
--- a/arch/powerpc/kvm/book3s_hv_nested.c
+++ b/arch/powerpc/kvm/book3s_hv_nested.c
@@ -665,8 +665,8 @@ static struct kvm_nested_guest *__find_nested(struct kvm *kvm, int lpid)

static bool __prealloc_nested(struct kvm *kvm, int lpid)
{
- if (idr_alloc(&kvm->arch.kvm_nested_guest_idr,
- NULL, lpid, lpid + 1, GFP_KERNEL) != lpid)
+ if (idr_alloc_range(&kvm->arch.kvm_nested_guest_idr, NULL,
+ lpid, lpid + 1, GFP_KERNEL) != lpid)
return false;
return true;
}
diff --git a/arch/x86/kvm/hyperv.c b/arch/x86/kvm/hyperv.c
index e2e95a6fccfd..db762513b596 100644
--- a/arch/x86/kvm/hyperv.c
+++ b/arch/x86/kvm/hyperv.c
@@ -2390,8 +2390,8 @@ static int kvm_hv_eventfd_assign(struct kvm *kvm, u32 conn_id, int fd)
return PTR_ERR(eventfd);

mutex_lock(&hv->hv_lock);
- ret = idr_alloc(&hv->conn_to_evt, eventfd, conn_id, conn_id + 1,
- GFP_KERNEL_ACCOUNT);
+ ret = idr_alloc_range(&hv->conn_to_evt, eventfd, conn_id, conn_id + 1,
+ GFP_KERNEL_ACCOUNT);
mutex_unlock(&hv->hv_lock);

if (ret >= 0)
diff --git a/arch/x86/kvm/xen.c b/arch/x86/kvm/xen.c
index 610beba35907..186b1c40d919 100644
--- a/arch/x86/kvm/xen.c
+++ b/arch/x86/kvm/xen.c
@@ -1707,8 +1707,8 @@ static int kvm_xen_eventfd_assign(struct kvm *kvm,
}

mutex_lock(&kvm->lock);
- ret = idr_alloc(&kvm->arch.xen.evtchn_ports, evtchnfd, port, port + 1,
- GFP_KERNEL);
+ ret = idr_alloc_range(&kvm->arch.xen.evtchn_ports, evtchnfd, port,
+ port + 1, GFP_KERNEL);
mutex_unlock(&kvm->lock);
if (ret >= 0)
return 0;
diff --git a/drivers/atm/nicstar.c b/drivers/atm/nicstar.c
index 1a50de39f5b5..02f45b1d48cc 100644
--- a/drivers/atm/nicstar.c
+++ b/drivers/atm/nicstar.c
@@ -1016,11 +1016,11 @@ static void push_rxbufs(ns_dev * card, struct sk_buff *skb)
card->lbfqc += 2;
}

- id1 = idr_alloc(&card->idr, handle1, 0, 0, GFP_ATOMIC);
+ id1 = idr_alloc(&card->idr, handle1, GFP_ATOMIC);
if (id1 < 0)
goto out;

- id2 = idr_alloc(&card->idr, handle2, 0, 0, GFP_ATOMIC);
+ id2 = idr_alloc(&card->idr, handle2, GFP_ATOMIC);
if (id2 < 0)
goto out;

diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c
index 2887350ae010..2b4d89909d49 100644
--- a/drivers/block/drbd/drbd_main.c
+++ b/drivers/block/drbd/drbd_main.c
@@ -2729,7 +2729,7 @@ enum drbd_ret_code drbd_create_device(struct drbd_config_context *adm_ctx, unsig
device->read_requests = RB_ROOT;
device->write_requests = RB_ROOT;

- id = idr_alloc(&drbd_devices, device, minor, minor + 1, GFP_KERNEL);
+ id = idr_alloc_range(&drbd_devices, device, minor, minor + 1, GFP_KERNEL);
if (id < 0) {
if (id == -ENOSPC)
err = ERR_MINOR_OR_VOLUME_EXISTS;
@@ -2737,7 +2737,7 @@ enum drbd_ret_code drbd_create_device(struct drbd_config_context *adm_ctx, unsig
}
kref_get(&device->kref);

- id = idr_alloc(&resource->devices, device, vnr, vnr + 1, GFP_KERNEL);
+ id = idr_alloc_range(&resource->devices, device, vnr, vnr + 1, GFP_KERNEL);
if (id < 0) {
if (id == -ENOSPC)
err = ERR_MINOR_OR_VOLUME_EXISTS;
@@ -2757,7 +2757,8 @@ enum drbd_ret_code drbd_create_device(struct drbd_config_context *adm_ctx, unsig
list_add(&peer_device->peer_devices, &device->peer_devices);
kref_get(&device->kref);

- id = idr_alloc(&connection->peer_devices, peer_device, vnr, vnr + 1, GFP_KERNEL);
+ id = idr_alloc_range(&connection->peer_devices, peer_device, vnr, vnr + 1,
+ GFP_KERNEL);
if (id < 0) {
if (id == -ENOSPC)
err = ERR_INVALID_REQUEST;
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index 084f9b8a0ba3..6df3d2ed2a2c 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -1951,11 +1951,11 @@ static int loop_add(int i)

/* allocate id, if @id >= 0, we're requesting that specific id */
if (i >= 0) {
- err = idr_alloc(&loop_index_idr, lo, i, i + 1, GFP_KERNEL);
+ err = idr_alloc_range(&loop_index_idr, lo, i, i + 1, GFP_KERNEL);
if (err == -ENOSPC)
err = -EEXIST;
} else {
- err = idr_alloc(&loop_index_idr, lo, 0, 0, GFP_KERNEL);
+ err = idr_alloc(&loop_index_idr, lo, GFP_KERNEL);
}
mutex_unlock(&loop_ctl_mutex);
if (err < 0)
diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c
index 07f3c139a3d7..854d155dff7c 100644
--- a/drivers/block/nbd.c
+++ b/drivers/block/nbd.c
@@ -1763,12 +1763,12 @@ static struct nbd_device *nbd_dev_add(int index, unsigned int refs)

mutex_lock(&nbd_index_mutex);
if (index >= 0) {
- err = idr_alloc(&nbd_index_idr, nbd, index, index + 1,
- GFP_KERNEL);
+ err = idr_alloc_range(&nbd_index_idr, nbd, index, index + 1,
+ GFP_KERNEL);
if (err == -ENOSPC)
err = -EEXIST;
} else {
- err = idr_alloc(&nbd_index_idr, nbd, 0, 0, GFP_KERNEL);
+ err = idr_alloc(&nbd_index_idr, nbd, GFP_KERNEL);
if (err >= 0)
index = err;
}
diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c
index b8549c61ff2c..c65efbef323d 100644
--- a/drivers/block/zram/zram_drv.c
+++ b/drivers/block/zram/zram_drv.c
@@ -1890,7 +1890,7 @@ static int zram_add(void)
if (!zram)
return -ENOMEM;

- ret = idr_alloc(&zram_index_idr, zram, 0, 0, GFP_KERNEL);
+ ret = idr_alloc(&zram_index_idr, zram, GFP_KERNEL);
if (ret < 0)
goto out_free_dev;
device_id = ret;
diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c
index 783d65fc71f0..4adc3ea9b7ca 100644
--- a/drivers/char/tpm/tpm-chip.c
+++ b/drivers/char/tpm/tpm-chip.c
@@ -326,7 +326,7 @@ struct tpm_chip *tpm_chip_alloc(struct device *pdev,
chip->ops = ops;

mutex_lock(&idr_lock);
- rc = idr_alloc(&dev_nums_idr, NULL, 0, TPM_NUM_DEVICES, GFP_KERNEL);
+ rc = idr_alloc_max(&dev_nums_idr, NULL, TPM_NUM_DEVICES, GFP_KERNEL);
mutex_unlock(&idr_lock);
if (rc < 0) {
dev_err(pdev, "No available tpm device numbers\n");
diff --git a/drivers/crypto/hisilicon/hpre/hpre_crypto.c b/drivers/crypto/hisilicon/hpre/hpre_crypto.c
index 97d54c1465c2..68d1d5ea5476 100644
--- a/drivers/crypto/hisilicon/hpre/hpre_crypto.c
+++ b/drivers/crypto/hisilicon/hpre/hpre_crypto.c
@@ -147,7 +147,7 @@ static int hpre_alloc_req_id(struct hpre_ctx *ctx)
int id;

spin_lock_irqsave(&ctx->req_lock, flags);
- id = idr_alloc(&ctx->req_idr, NULL, 0, QM_Q_DEPTH, GFP_ATOMIC);
+ id = idr_alloc_max(&ctx->req_idr, NULL, QM_Q_DEPTH, GFP_ATOMIC);
spin_unlock_irqrestore(&ctx->req_lock, flags);

return id;
diff --git a/drivers/dca/dca-sysfs.c b/drivers/dca/dca-sysfs.c
index 21ebd0af268b..c91994ff8a6c 100644
--- a/drivers/dca/dca-sysfs.c
+++ b/drivers/dca/dca-sysfs.c
@@ -40,7 +40,7 @@ int dca_sysfs_add_provider(struct dca_provider *dca, struct device *dev)
idr_preload(GFP_KERNEL);
spin_lock(&dca_idr_lock);

- ret = idr_alloc(&dca_idr, dca, 0, 0, GFP_NOWAIT);
+ ret = idr_alloc(&dca_idr, dca, GFP_NOWAIT);
if (ret >= 0)
dca->id = ret;

diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c
index 9c89f7d53e99..b33201b75898 100644
--- a/drivers/firewire/core-cdev.c
+++ b/drivers/firewire/core-cdev.c
@@ -485,7 +485,7 @@ static int add_client_resource(struct client *client,
if (client->in_shutdown)
ret = -ECANCELED;
else
- ret = idr_alloc(&client->resource_idr, resource, 0, 0,
+ ret = idr_alloc(&client->resource_idr, resource,
GFP_NOWAIT);
if (ret >= 0) {
resource->handle = ret;
diff --git a/drivers/firewire/core-device.c b/drivers/firewire/core-device.c
index adddd8c45d0c..5c599658a5d5 100644
--- a/drivers/firewire/core-device.c
+++ b/drivers/firewire/core-device.c
@@ -1024,8 +1024,8 @@ static void fw_device_init(struct work_struct *work)

fw_device_get(device);
down_write(&fw_device_rwsem);
- minor = idr_alloc(&fw_device_idr, device, 0, 1 << MINORBITS,
- GFP_KERNEL);
+ minor = idr_alloc_max(&fw_device_idr, device, 1 << MINORBITS,
+ GFP_KERNEL);
up_write(&fw_device_rwsem);

if (minor < 0)
diff --git a/drivers/firmware/arm_scmi/bus.c b/drivers/firmware/arm_scmi/bus.c
index f6fe723ab869..dfb867958a46 100644
--- a/drivers/firmware/arm_scmi/bus.c
+++ b/drivers/firmware/arm_scmi/bus.c
@@ -236,8 +236,8 @@ int scmi_protocol_register(const struct scmi_protocol *proto)
}

spin_lock(&protocol_lock);
- ret = idr_alloc(&scmi_protocols, (void *)proto,
- proto->id, proto->id + 1, GFP_ATOMIC);
+ ret = idr_alloc_range(&scmi_protocols, (void *)proto,
+ proto->id, proto->id + 1, GFP_ATOMIC);
spin_unlock(&protocol_lock);
if (ret != proto->id) {
pr_err("unable to allocate SCMI idr slot for 0x%x - err %d\n",
diff --git a/drivers/firmware/arm_scmi/driver.c b/drivers/firmware/arm_scmi/driver.c
index c1922bd650ae..a8f1996de7c8 100644
--- a/drivers/firmware/arm_scmi/driver.c
+++ b/drivers/firmware/arm_scmi/driver.c
@@ -1333,8 +1333,8 @@ scmi_alloc_init_protocol_instance(struct scmi_info *info,
if (ret)
goto clean;

- ret = idr_alloc(&info->protocols, pi, proto->id, proto->id + 1,
- GFP_KERNEL);
+ ret = idr_alloc_range(&info->protocols, pi, proto->id, proto->id + 1,
+ GFP_KERNEL);
if (ret != proto->id)
goto clean;

@@ -1798,7 +1798,7 @@ static int scmi_chan_setup(struct scmi_info *info, struct device *dev,
}

idr_alloc:
- ret = idr_alloc(idr, cinfo, prot_id, prot_id + 1, GFP_KERNEL);
+ ret = idr_alloc_range(idr, cinfo, prot_id, prot_id + 1, GFP_KERNEL);
if (ret != prot_id) {
dev_err(dev, "unable to allocate SCMI idr slot err %d\n", ret);
return ret;
@@ -1992,9 +1992,9 @@ int scmi_protocol_device_request(const struct scmi_device_id *id_table)
}
INIT_LIST_HEAD(phead);

- ret = idr_alloc(&scmi_requested_devices, (void *)phead,
- id_table->protocol_id,
- id_table->protocol_id + 1, GFP_KERNEL);
+ ret = idr_alloc_range(&scmi_requested_devices, (void *)phead,
+ id_table->protocol_id,
+ id_table->protocol_id + 1, GFP_KERNEL);
if (ret != id_table->protocol_id) {
pr_err("Failed to save SCMI device - ret:%d\n", ret);
kfree(rdev);
@@ -2197,8 +2197,8 @@ static int scmi_probe(struct platform_device *pdev)
* Save this valid DT protocol descriptor amongst
* @active_protocols for this SCMI instance/
*/
- ret = idr_alloc(&info->active_protocols, child,
- prot_id, prot_id + 1, GFP_KERNEL);
+ ret = idr_alloc_range(&info->active_protocols, child,
+ prot_id, prot_id + 1, GFP_KERNEL);
if (ret != prot_id) {
dev_err(dev, "SCMI protocol %d already activated. Skip\n",
prot_id);
diff --git a/drivers/fpga/dfl.c b/drivers/fpga/dfl.c
index 6bff39ff21a0..68fcb7f55046 100644
--- a/drivers/fpga/dfl.c
+++ b/drivers/fpga/dfl.c
@@ -104,7 +104,7 @@ static int dfl_id_alloc(enum dfl_id_type type, struct device *dev)

WARN_ON(type >= DFL_ID_MAX);
mutex_lock(&dfl_id_mutex);
- id = idr_alloc(&dfl_devs[type].id, dev, 0, 0, GFP_KERNEL);
+ id = idr_alloc(&dfl_devs[type].id, dev, GFP_KERNEL);
mutex_unlock(&dfl_id_mutex);

return id;
diff --git a/drivers/gpio/gpio-aggregator.c b/drivers/gpio/gpio-aggregator.c
index 0cb2664085cf..672e9c5ac9c7 100644
--- a/drivers/gpio/gpio-aggregator.c
+++ b/drivers/gpio/gpio-aggregator.c
@@ -131,7 +131,7 @@ static ssize_t new_device_store(struct device_driver *driver, const char *buf,
}

mutex_lock(&gpio_aggregator_lock);
- id = idr_alloc(&gpio_aggregator_idr, aggr, 0, 0, GFP_KERNEL);
+ id = idr_alloc(&gpio_aggregator_idr, aggr, GFP_KERNEL);
mutex_unlock(&gpio_aggregator_lock);

if (id < 0) {
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
index 714178f1b6c6..543c2d728855 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
@@ -285,7 +285,7 @@ int amdgpu_bo_list_ioctl(struct drm_device *dev, void *data,
goto error_free;

mutex_lock(&fpriv->bo_list_lock);
- r = idr_alloc(&fpriv->bo_list_handles, list, 1, 0, GFP_KERNEL);
+ r = idr_alloc_min(&fpriv->bo_list_handles, list, 1, GFP_KERNEL);
mutex_unlock(&fpriv->bo_list_lock);
if (r < 0) {
goto error_put_list;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
index 7dc92ef36b2b..88abbc02c858 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
@@ -450,7 +450,7 @@ static int amdgpu_ctx_alloc(struct amdgpu_device *adev,
return -ENOMEM;

mutex_lock(&mgr->lock);
- r = idr_alloc(&mgr->ctx_handles, ctx, 1, AMDGPU_VM_MAX_NUM_CTX, GFP_KERNEL);
+ r = idr_alloc_range(&mgr->ctx_handles, ctx, 1, AMDGPU_VM_MAX_NUM_CTX, GFP_KERNEL);
if (r < 0) {
mutex_unlock(&mgr->lock);
kfree(ctx);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c
index 69a70a0aaed9..0912709a1dae 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c
@@ -274,8 +274,8 @@ int amdgpu_mes_create_process(struct amdgpu_device *adev, int pasid,
amdgpu_mes_lock(&adev->mes);

/* add the mes process to idr list */
- r = idr_alloc(&adev->mes.pasid_idr, process, pasid, pasid + 1,
- GFP_KERNEL);
+ r = idr_alloc_range(&adev->mes.pasid_idr, process, pasid, pasid + 1,
+ GFP_KERNEL);
if (r < 0) {
DRM_ERROR("failed to lock pasid=%d\n", pasid);
goto clean_up_ctx;
@@ -419,8 +419,8 @@ int amdgpu_mes_add_gang(struct amdgpu_device *adev, int pasid,
}

/* add the mes gang to idr list */
- r = idr_alloc(&adev->mes.gang_id_idr, gang, 1, 0,
- GFP_KERNEL);
+ r = idr_alloc_min(&adev->mes.gang_id_idr, gang, 1,
+ GFP_KERNEL);
if (r < 0) {
DRM_ERROR("failed to allocate idr for gang\n");
goto clean_up_ctx;
@@ -637,8 +637,8 @@ int amdgpu_mes_add_hw_queue(struct amdgpu_device *adev, int gang_id,

/* add the mes gang to idr list */
spin_lock_irqsave(&adev->mes.queue_id_lock, flags);
- r = idr_alloc(&adev->mes.queue_id_idr, queue, 1, 0,
- GFP_ATOMIC);
+ r = idr_alloc_min(&adev->mes.queue_id_idr, queue, 1,
+ GFP_ATOMIC);
if (r < 0) {
spin_unlock_irqrestore(&adev->mes.queue_id_lock, flags);
goto clean_up_mqd;
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
index 1c7016958d6d..b1249855bab0 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
@@ -2127,8 +2127,8 @@ static int criu_restore_memory_of_gpu(struct kfd_process_device *pdd,

/* Restore previous IDR handle */
pr_debug("Restoring old IDR handle for the BO");
- idr_handle = idr_alloc(&pdd->alloc_idr, *kgd_mem, bo_priv->idr_handle,
- bo_priv->idr_handle + 1, GFP_KERNEL);
+ idr_handle = idr_alloc_range(&pdd->alloc_idr, *kgd_mem, bo_priv->idr_handle,
+ bo_priv->idr_handle + 1, GFP_KERNEL);

if (idr_handle < 0) {
pr_err("Could not allocate idr\n");
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_events.c b/drivers/gpu/drm/amd/amdkfd/kfd_events.c
index 4df9c36146ba..672ede6bc763 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_events.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_events.c
@@ -106,8 +106,8 @@ static int allocate_event_notification_slot(struct kfd_process *p,
}

if (restore_id) {
- id = idr_alloc(&p->event_idr, ev, *restore_id, *restore_id + 1,
- GFP_KERNEL);
+ id = idr_alloc_range(&p->event_idr, ev, *restore_id, *restore_id + 1,
+ GFP_KERNEL);
} else {
/*
* Compatibility with old user mode: Only use signal slots
@@ -115,8 +115,8 @@ static int allocate_event_notification_slot(struct kfd_process *p,
* KFD_SIGNAL_EVENT_LIMIT. This also allows future increase
* of the event limit without breaking user mode.
*/
- id = idr_alloc(&p->event_idr, ev, 0, p->signal_mapped_size / 8,
- GFP_KERNEL);
+ id = idr_alloc_max(&p->event_idr, ev, p->signal_mapped_size / 8,
+ GFP_KERNEL);
}
if (id < 0)
return id;
@@ -219,17 +219,17 @@ static int create_other_event(struct kfd_process *p, struct kfd_event *ev, const
int id;

if (restore_id)
- id = idr_alloc(&p->event_idr, ev, *restore_id, *restore_id + 1,
- GFP_KERNEL);
+ id = idr_alloc_range(&p->event_idr, ev, *restore_id, *restore_id + 1,
+ GFP_KERNEL);
else
/* Cast KFD_LAST_NONSIGNAL_EVENT to uint32_t. This allows an
* intentional integer overflow to -1 without a compiler
* warning. idr_alloc treats a negative value as "maximum
* signed integer".
*/
- id = idr_alloc(&p->event_idr, ev, KFD_FIRST_NONSIGNAL_EVENT_ID,
- (uint32_t)KFD_LAST_NONSIGNAL_EVENT_ID + 1,
- GFP_KERNEL);
+ id = idr_alloc_range(&p->event_idr, ev, KFD_FIRST_NONSIGNAL_EVENT_ID,
+ (uint32_t)KFD_LAST_NONSIGNAL_EVENT_ID + 1,
+ GFP_KERNEL);

if (id < 0)
return id;
@@ -249,7 +249,7 @@ int kfd_event_init_process(struct kfd_process *p)
/* Allocate event ID 0. It is used for a fast path to ignore bogus events
* that are sent by the CP without a context ID
*/
- id = idr_alloc(&p->event_idr, NULL, 0, 1, GFP_KERNEL);
+ id = idr_alloc_max(&p->event_idr, NULL, 1, GFP_KERNEL);
if (id < 0) {
idr_destroy(&p->event_idr);
mutex_destroy(&p->event_mutex);
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
index e3d64ec8c353..a1032f0dc9c4 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
@@ -1669,7 +1669,7 @@ struct kfd_process_device *kfd_bind_process_to_device(struct kfd_dev *dev,
int kfd_process_device_create_obj_handle(struct kfd_process_device *pdd,
void *mem)
{
- return idr_alloc(&pdd->alloc_idr, mem, 0, 0, GFP_KERNEL);
+ return idr_alloc(&pdd->alloc_idr, mem, GFP_KERNEL);
}

/* Translate specific handle from process local memory idr
diff --git a/drivers/gpu/drm/display/drm_dp_aux_dev.c b/drivers/gpu/drm/display/drm_dp_aux_dev.c
index 098e482e65a2..a59446e3f558 100644
--- a/drivers/gpu/drm/display/drm_dp_aux_dev.c
+++ b/drivers/gpu/drm/display/drm_dp_aux_dev.c
@@ -83,7 +83,7 @@ static struct drm_dp_aux_dev *alloc_drm_dp_aux_dev(struct drm_dp_aux *aux)
kref_init(&aux_dev->refcount);

mutex_lock(&aux_idr_mutex);
- index = idr_alloc(&aux_idr, aux_dev, 0, DRM_AUX_MINORS, GFP_KERNEL);
+ index = idr_alloc_max(&aux_idr, aux_dev, DRM_AUX_MINORS, GFP_KERNEL);
mutex_unlock(&aux_idr_mutex);
if (index < 0) {
kfree(aux_dev);
diff --git a/drivers/gpu/drm/drm_auth.c b/drivers/gpu/drm/drm_auth.c
index 6e433d465f41..fc793af28659 100644
--- a/drivers/gpu/drm/drm_auth.c
+++ b/drivers/gpu/drm/drm_auth.c
@@ -98,8 +98,8 @@ int drm_getmagic(struct drm_device *dev, void *data, struct drm_file *file_priv)

mutex_lock(&dev->master_mutex);
if (!file_priv->magic) {
- ret = idr_alloc(&file_priv->master->magic_map, file_priv,
- 1, 0, GFP_KERNEL);
+ ret = idr_alloc_min(&file_priv->master->magic_map, file_priv, 1,
+ GFP_KERNEL);
if (ret >= 0)
file_priv->magic = ret;
}
diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
index 1c48d162c77e..710321bf3c84 100644
--- a/drivers/gpu/drm/drm_connector.c
+++ b/drivers/gpu/drm/drm_connector.c
@@ -2912,7 +2912,7 @@ struct drm_tile_group *drm_mode_create_tile_group(struct drm_device *dev,
tg->dev = dev;

mutex_lock(&dev->mode_config.idr_mutex);
- ret = idr_alloc(&dev->mode_config.tile_idr, tg, 1, 0, GFP_KERNEL);
+ ret = idr_alloc_min(&dev->mode_config.tile_idr, tg, 1, GFP_KERNEL);
if (ret >= 0) {
tg->id = ret;
} else {
diff --git a/drivers/gpu/drm/drm_context.c b/drivers/gpu/drm/drm_context.c
index c6e6a3e7219a..8f460ab16129 100644
--- a/drivers/gpu/drm/drm_context.c
+++ b/drivers/gpu/drm/drm_context.c
@@ -82,8 +82,8 @@ static int drm_legacy_ctxbitmap_next(struct drm_device * dev)
int ret;

mutex_lock(&dev->struct_mutex);
- ret = idr_alloc(&dev->ctx_idr, NULL, DRM_RESERVED_CONTEXTS, 0,
- GFP_KERNEL);
+ ret = idr_alloc_min(&dev->ctx_idr, NULL, DRM_RESERVED_CONTEXTS,
+ GFP_KERNEL);
mutex_unlock(&dev->struct_mutex);
return ret;
}
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
index 8214a0b1ab7f..f12974dcbae7 100644
--- a/drivers/gpu/drm/drm_drv.c
+++ b/drivers/gpu/drm/drm_drv.c
@@ -124,11 +124,11 @@ static int drm_minor_alloc(struct drm_device *dev, unsigned int type)

idr_preload(GFP_KERNEL);
spin_lock_irqsave(&drm_minor_lock, flags);
- r = idr_alloc(&drm_minors_idr,
- NULL,
- 64 * type,
- 64 * (type + 1),
- GFP_NOWAIT);
+ r = idr_alloc_range(&drm_minors_idr,
+ NULL,
+ 64 * type,
+ 64 * (type + 1),
+ GFP_NOWAIT);
spin_unlock_irqrestore(&drm_minor_lock, flags);
idr_preload_end();

diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
index eb0c2d041f13..bd3299962f9c 100644
--- a/drivers/gpu/drm/drm_gem.c
+++ b/drivers/gpu/drm/drm_gem.c
@@ -377,7 +377,7 @@ drm_gem_handle_create_tail(struct drm_file *file_priv,
idr_preload(GFP_KERNEL);
spin_lock(&file_priv->table_lock);

- ret = idr_alloc(&file_priv->object_idr, obj, 1, 0, GFP_NOWAIT);
+ ret = idr_alloc_min(&file_priv->object_idr, obj, 1, GFP_NOWAIT);

spin_unlock(&file_priv->table_lock);
idr_preload_end();
@@ -841,7 +841,7 @@ drm_gem_flink_ioctl(struct drm_device *dev, void *data,
}

if (!obj->name) {
- ret = idr_alloc(&dev->object_name_idr, obj, 1, 0, GFP_KERNEL);
+ ret = idr_alloc_min(&dev->object_name_idr, obj, 1, GFP_KERNEL);
if (ret < 0)
goto err;

diff --git a/drivers/gpu/drm/drm_lease.c b/drivers/gpu/drm/drm_lease.c
index d72c2fac0ff1..3160fa0e4024 100644
--- a/drivers/gpu/drm/drm_lease.c
+++ b/drivers/gpu/drm/drm_lease.c
@@ -237,7 +237,7 @@ static struct drm_master *drm_lease_create(struct drm_master *lessor, struct idr
}

/* Insert the new lessee into the tree */
- id = idr_alloc(&(drm_lease_owner(lessor)->lessee_idr), lessee, 1, 0, GFP_KERNEL);
+ id = idr_alloc_min(&(drm_lease_owner(lessor)->lessee_idr), lessee, 1, GFP_KERNEL);
if (id < 0) {
error = id;
goto out_lessee;
@@ -428,7 +428,7 @@ static int fill_object_idr(struct drm_device *dev,
* really want is a 'leased/not-leased' result, for
* which any non-NULL pointer will work fine.
*/
- ret = idr_alloc(leases, &drm_lease_idr_object , object_id, object_id + 1, GFP_KERNEL);
+ ret = idr_alloc_range(leases, &drm_lease_idr_object, object_id, object_id + 1, GFP_KERNEL);
if (ret < 0) {
DRM_DEBUG_LEASE("Object %d cannot be inserted into leases (%d)\n",
object_id, ret);
@@ -437,14 +437,14 @@ static int fill_object_idr(struct drm_device *dev,
if (obj->type == DRM_MODE_OBJECT_CRTC && !universal_planes) {
struct drm_crtc *crtc = obj_to_crtc(obj);

- ret = idr_alloc(leases, &drm_lease_idr_object, crtc->primary->base.id, crtc->primary->base.id + 1, GFP_KERNEL);
+ ret = idr_alloc_range(leases, &drm_lease_idr_object, crtc->primary->base.id, crtc->primary->base.id + 1, GFP_KERNEL);
if (ret < 0) {
DRM_DEBUG_LEASE("Object primary plane %d cannot be inserted into leases (%d)\n",
object_id, ret);
goto out_free_objects;
}
if (crtc->cursor) {
- ret = idr_alloc(leases, &drm_lease_idr_object, crtc->cursor->base.id, crtc->cursor->base.id + 1, GFP_KERNEL);
+ ret = idr_alloc_range(leases, &drm_lease_idr_object, crtc->cursor->base.id, crtc->cursor->base.id + 1, GFP_KERNEL);
if (ret < 0) {
DRM_DEBUG_LEASE("Object cursor plane %d cannot be inserted into leases (%d)\n",
object_id, ret);
diff --git a/drivers/gpu/drm/drm_mode_object.c b/drivers/gpu/drm/drm_mode_object.c
index ba1608effc0f..01692c47acea 100644
--- a/drivers/gpu/drm/drm_mode_object.c
+++ b/drivers/gpu/drm/drm_mode_object.c
@@ -45,8 +45,8 @@ int __drm_mode_object_add(struct drm_device *dev, struct drm_mode_object *obj,
WARN_ON(!dev->driver->load && dev->registered && !obj_free_cb);

mutex_lock(&dev->mode_config.idr_mutex);
- ret = idr_alloc(&dev->mode_config.object_idr, register_obj ? obj : NULL,
- 1, 0, GFP_KERNEL);
+ ret = idr_alloc_min(&dev->mode_config.object_idr,
+ register_obj ? obj : NULL, 1, GFP_KERNEL);
if (ret >= 0) {
/*
* Set up the object linking under the protection of the idr
diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c
index 7e48dcd1bee4..6c08efac430d 100644
--- a/drivers/gpu/drm/drm_syncobj.c
+++ b/drivers/gpu/drm/drm_syncobj.c
@@ -539,7 +539,7 @@ int drm_syncobj_get_handle(struct drm_file *file_private,

idr_preload(GFP_KERNEL);
spin_lock(&file_private->syncobj_table_lock);
- ret = idr_alloc(&file_private->syncobj_idr, syncobj, 1, 0, GFP_NOWAIT);
+ ret = idr_alloc_min(&file_private->syncobj_idr, syncobj, 1, GFP_NOWAIT);
spin_unlock(&file_private->syncobj_table_lock);

idr_preload_end();
@@ -666,7 +666,7 @@ static int drm_syncobj_fd_to_handle(struct drm_file *file_private,

idr_preload(GFP_KERNEL);
spin_lock(&file_private->syncobj_table_lock);
- ret = idr_alloc(&file_private->syncobj_idr, syncobj, 1, 0, GFP_NOWAIT);
+ ret = idr_alloc_min(&file_private->syncobj_idr, syncobj, 1, GFP_NOWAIT);
spin_unlock(&file_private->syncobj_table_lock);
idr_preload_end();

diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c b/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
index 93a67422ca3b..77600e064029 100644
--- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
@@ -540,8 +540,8 @@ static int file_add_object(struct file *file, struct drm_i915_gem_object *obj)
GEM_BUG_ON(obj->base.handle_count);

/* tie the object to the drm_file for easy reaping */
- err = idr_alloc(&to_drm_file(file)->object_idr,
- &obj->base, 1, 0, GFP_KERNEL);
+ err = idr_alloc_min(&to_drm_file(file)->object_idr, &obj->base, 1,
+ GFP_KERNEL);
if (err < 0)
return err;

diff --git a/drivers/gpu/drm/i915/gvt/dmabuf.c b/drivers/gpu/drm/i915/gvt/dmabuf.c
index 01e54b45c5c1..a58bf1447234 100644
--- a/drivers/gpu/drm/i915/gvt/dmabuf.c
+++ b/drivers/gpu/drm/i915/gvt/dmabuf.c
@@ -462,7 +462,7 @@ int intel_vgpu_query_plane(struct intel_vgpu *vgpu, void *args)

dmabuf_obj->vgpu = vgpu;

- ret = idr_alloc(&vgpu->object_idr, dmabuf_obj, 1, 0, GFP_NOWAIT);
+ ret = idr_alloc_min(&vgpu->object_idr, dmabuf_obj, 1, GFP_NOWAIT);
if (ret < 0)
goto out_free_info;
gfx_plane_info->dmabuf_id = ret;
diff --git a/drivers/gpu/drm/i915/gvt/vgpu.c b/drivers/gpu/drm/i915/gvt/vgpu.c
index 46da19b3225d..f2b32029abdf 100644
--- a/drivers/gpu/drm/i915/gvt/vgpu.c
+++ b/drivers/gpu/drm/i915/gvt/vgpu.c
@@ -378,8 +378,8 @@ static struct intel_vgpu *__intel_gvt_create_vgpu(struct intel_gvt *gvt,
if (!vgpu)
return ERR_PTR(-ENOMEM);

- ret = idr_alloc(&gvt->vgpu_idr, vgpu, IDLE_VGPU_IDR + 1, GVT_MAX_VGPU,
- GFP_KERNEL);
+ ret = idr_alloc_range(&gvt->vgpu_idr, vgpu, IDLE_VGPU_IDR + 1, GVT_MAX_VGPU,
+ GFP_KERNEL);
if (ret < 0)
goto out_free_vgpu;

diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c
index 1577ab6754db..4bb327f5d3a6 100644
--- a/drivers/gpu/drm/i915/i915_perf.c
+++ b/drivers/gpu/drm/i915/i915_perf.c
@@ -4211,9 +4211,8 @@ int i915_perf_add_config_ioctl(struct drm_device *dev, void *data,
}

/* Config id 0 is invalid, id 1 for kernel stored test config. */
- oa_config->id = idr_alloc(&perf->metrics_idr,
- oa_config, 2,
- 0, GFP_KERNEL);
+ oa_config->id = idr_alloc_min(&perf->metrics_idr, oa_config, 2,
+ GFP_KERNEL);
if (oa_config->id < 0) {
DRM_DEBUG("Failed to create sysfs entry for OA config\n");
err = oa_config->id;
diff --git a/drivers/gpu/drm/i915/selftests/i915_perf.c b/drivers/gpu/drm/i915/selftests/i915_perf.c
index 88db2e3d81d0..e7355594e7d4 100644
--- a/drivers/gpu/drm/i915/selftests/i915_perf.c
+++ b/drivers/gpu/drm/i915/selftests/i915_perf.c
@@ -32,7 +32,7 @@ alloc_empty_config(struct i915_perf *perf)

mutex_lock(&perf->metrics_lock);

- oa_config->id = idr_alloc(&perf->metrics_idr, oa_config, 2, 0, GFP_KERNEL);
+ oa_config->id = idr_alloc_min(&perf->metrics_idr, oa_config, 2, GFP_KERNEL);
if (oa_config->id < 0) {
mutex_unlock(&perf->metrics_lock);
i915_oa_config_put(oa_config);
diff --git a/drivers/gpu/drm/qxl/qxl_cmd.c b/drivers/gpu/drm/qxl/qxl_cmd.c
index 7b00c955cd82..3d8297949912 100644
--- a/drivers/gpu/drm/qxl/qxl_cmd.c
+++ b/drivers/gpu/drm/qxl/qxl_cmd.c
@@ -433,7 +433,7 @@ int qxl_surface_id_alloc(struct qxl_device *qdev,
again:
idr_preload(GFP_ATOMIC);
spin_lock(&qdev->surf_id_idr_lock);
- idr_ret = idr_alloc(&qdev->surf_id_idr, NULL, 1, 0, GFP_NOWAIT);
+ idr_ret = idr_alloc_min(&qdev->surf_id_idr, NULL, 1, GFP_NOWAIT);
spin_unlock(&qdev->surf_id_idr_lock);
idr_preload_end();
if (idr_ret < 0)
diff --git a/drivers/gpu/drm/qxl/qxl_release.c b/drivers/gpu/drm/qxl/qxl_release.c
index 368d26da0d6a..34aa7c9c3191 100644
--- a/drivers/gpu/drm/qxl/qxl_release.c
+++ b/drivers/gpu/drm/qxl/qxl_release.c
@@ -101,7 +101,7 @@ qxl_release_alloc(struct qxl_device *qdev, int type,

idr_preload(GFP_KERNEL);
spin_lock(&qdev->release_idr_lock);
- handle = idr_alloc(&qdev->release_idr, release, 1, 0, GFP_NOWAIT);
+ handle = idr_alloc_min(&qdev->release_idr, release, 1, GFP_NOWAIT);
release->base.seqno = ++qdev->release_seqno;
spin_unlock(&qdev->release_idr_lock);
idr_preload_end();
diff --git a/drivers/gpu/drm/sis/sis_mm.c b/drivers/gpu/drm/sis/sis_mm.c
index e51d4289a3d0..c8dfb10707a0 100644
--- a/drivers/gpu/drm/sis/sis_mm.c
+++ b/drivers/gpu/drm/sis/sis_mm.c
@@ -131,7 +131,7 @@ static int sis_drm_alloc(struct drm_device *dev, struct drm_file *file,
if (retval)
goto fail_alloc;

- retval = idr_alloc(&dev_priv->object_idr, item, 1, 0, GFP_KERNEL);
+ retval = idr_alloc_min(&dev_priv->object_idr, item, 1, GFP_KERNEL);
if (retval < 0)
goto fail_idr;
user_key = retval;
diff --git a/drivers/gpu/drm/tegra/drm.c b/drivers/gpu/drm/tegra/drm.c
index 9464f522e257..4d777c563efa 100644
--- a/drivers/gpu/drm/tegra/drm.c
+++ b/drivers/gpu/drm/tegra/drm.c
@@ -443,7 +443,7 @@ static int tegra_client_open(struct tegra_drm_file *fpriv,
return err;
}

- err = idr_alloc(&fpriv->legacy_contexts, context, 1, 0, GFP_KERNEL);
+ err = idr_alloc_min(&fpriv->legacy_contexts, context, 1, GFP_KERNEL);
if (err < 0) {
client->ops->close_channel(context);
pm_runtime_put(client->base.dev);
diff --git a/drivers/gpu/drm/v3d/v3d_perfmon.c b/drivers/gpu/drm/v3d/v3d_perfmon.c
index f6a88abccc7d..b19cd0179364 100644
--- a/drivers/gpu/drm/v3d/v3d_perfmon.c
+++ b/drivers/gpu/drm/v3d/v3d_perfmon.c
@@ -149,8 +149,8 @@ int v3d_perfmon_create_ioctl(struct drm_device *dev, void *data,
mutex_init(&perfmon->lock);

mutex_lock(&v3d_priv->perfmon.lock);
- ret = idr_alloc(&v3d_priv->perfmon.idr, perfmon, V3D_PERFMONID_MIN,
- V3D_PERFMONID_MAX, GFP_KERNEL);
+ ret = idr_alloc_range(&v3d_priv->perfmon.idr, perfmon, V3D_PERFMONID_MIN,
+ V3D_PERFMONID_MAX, GFP_KERNEL);
mutex_unlock(&v3d_priv->perfmon.lock);

if (ret < 0) {
diff --git a/drivers/gpu/drm/vc4/vc4_perfmon.c b/drivers/gpu/drm/vc4/vc4_perfmon.c
index 79a74184d732..0a1cb8a00858 100644
--- a/drivers/gpu/drm/vc4/vc4_perfmon.c
+++ b/drivers/gpu/drm/vc4/vc4_perfmon.c
@@ -178,8 +178,8 @@ int vc4_perfmon_create_ioctl(struct drm_device *dev, void *data,
refcount_set(&perfmon->refcnt, 1);

mutex_lock(&vc4file->perfmon.lock);
- ret = idr_alloc(&vc4file->perfmon.idr, perfmon, VC4_PERFMONID_MIN,
- VC4_PERFMONID_MAX, GFP_KERNEL);
+ ret = idr_alloc_range(&vc4file->perfmon.idr, perfmon, VC4_PERFMONID_MIN,
+ VC4_PERFMONID_MAX, GFP_KERNEL);
mutex_unlock(&vc4file->perfmon.lock);

if (ret < 0) {
diff --git a/drivers/gpu/drm/vgem/vgem_fence.c b/drivers/gpu/drm/vgem/vgem_fence.c
index c2a879734d40..cb76ceab663e 100644
--- a/drivers/gpu/drm/vgem/vgem_fence.c
+++ b/drivers/gpu/drm/vgem/vgem_fence.c
@@ -169,7 +169,7 @@ int vgem_fence_attach_ioctl(struct drm_device *dev,
/* Record the fence in our idr for later signaling */
if (ret == 0) {
mutex_lock(&vfile->fence_mutex);
- ret = idr_alloc(&vfile->fence_idr, fence, 1, 0, GFP_KERNEL);
+ ret = idr_alloc_min(&vfile->fence_idr, fence, 1, GFP_KERNEL);
mutex_unlock(&vfile->fence_mutex);
if (ret > 0) {
arg->out_fence = ret;
diff --git a/drivers/gpu/drm/via/via_mm.c b/drivers/gpu/drm/via/via_mm.c
index c9afa1a51f23..31cb14c75891 100644
--- a/drivers/gpu/drm/via/via_mm.c
+++ b/drivers/gpu/drm/via/via_mm.c
@@ -152,7 +152,7 @@ int via_mem_alloc(struct drm_device *dev, void *data,
if (retval)
goto fail_alloc;

- retval = idr_alloc(&dev_priv->object_idr, item, 1, 0, GFP_KERNEL);
+ retval = idr_alloc_min(&dev_priv->object_idr, item, 1, GFP_KERNEL);
if (retval < 0)
goto fail_idr;
user_key = retval;
diff --git a/drivers/gpu/drm/vmwgfx/ttm_object.c b/drivers/gpu/drm/vmwgfx/ttm_object.c
index 26a55fef1ab5..b34d10a6f85e 100644
--- a/drivers/gpu/drm/vmwgfx/ttm_object.c
+++ b/drivers/gpu/drm/vmwgfx/ttm_object.c
@@ -172,7 +172,7 @@ int ttm_base_object_init(struct ttm_object_file *tfile,
kref_init(&base->refcount);
idr_preload(GFP_KERNEL);
spin_lock(&tdev->object_lock);
- ret = idr_alloc(&tdev->idr, base, 1, 0, GFP_NOWAIT);
+ ret = idr_alloc_min(&tdev->idr, base, 1, GFP_NOWAIT);
spin_unlock(&tdev->object_lock);
idr_preload_end();
if (ret < 0)
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
index a7d62a4eb47b..605b0668eeb1 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
@@ -190,7 +190,7 @@ int vmw_resource_alloc_id(struct vmw_resource *res)
idr_preload(GFP_KERNEL);
spin_lock(&dev_priv->resource_lock);

- ret = idr_alloc(idr, res, 1, 0, GFP_NOWAIT);
+ ret = idr_alloc_min(idr, res, 1, GFP_NOWAIT);
if (ret >= 0)
res->id = ret;

diff --git a/drivers/hwtracing/coresight/coresight-tmc-etr.c b/drivers/hwtracing/coresight/coresight-tmc-etr.c
index 867ad8bb9b0c..0a56eeb4b89e 100644
--- a/drivers/hwtracing/coresight/coresight-tmc-etr.c
+++ b/drivers/hwtracing/coresight/coresight-tmc-etr.c
@@ -1318,7 +1318,7 @@ get_perf_etr_buf_cpu_wide(struct tmc_drvdata *drvdata,

/* Now that we have a buffer, add it to the IDR. */
mutex_lock(&drvdata->idr_mutex);
- ret = idr_alloc(&drvdata->idr, etr_buf, pid, pid + 1, GFP_KERNEL);
+ ret = idr_alloc_range(&drvdata->idr, etr_buf, pid, pid + 1, GFP_KERNEL);
mutex_unlock(&drvdata->idr_mutex);

/* Another event with this session ID has allocated this buffer. */
diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c
index d43db2c3876e..784ed5cf834d 100644
--- a/drivers/i2c/i2c-core-base.c
+++ b/drivers/i2c/i2c-core-base.c
@@ -1540,7 +1540,7 @@ static int __i2c_add_numbered_adapter(struct i2c_adapter *adap)
int id;

mutex_lock(&core_lock);
- id = idr_alloc(&i2c_adapter_idr, adap, adap->nr, adap->nr + 1, GFP_KERNEL);
+ id = idr_alloc_range(&i2c_adapter_idr, adap, adap->nr, adap->nr + 1, GFP_KERNEL);
mutex_unlock(&core_lock);
if (WARN(id < 0, "couldn't get idr"))
return id == -ENOSPC ? -EBUSY : id;
@@ -1576,8 +1576,9 @@ int i2c_add_adapter(struct i2c_adapter *adapter)
}

mutex_lock(&core_lock);
- id = idr_alloc(&i2c_adapter_idr, adapter,
- __i2c_first_dynamic_bus_num, 0, GFP_KERNEL);
+ id = idr_alloc_min(&i2c_adapter_idr, adapter,
+ __i2c_first_dynamic_bus_num,
+ GFP_KERNEL);
mutex_unlock(&core_lock);
if (WARN(id < 0, "couldn't get idr"))
return id;
diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c
index 7850287dfe7a..094c885dd161 100644
--- a/drivers/i3c/master.c
+++ b/drivers/i3c/master.c
@@ -430,7 +430,7 @@ static int i3c_bus_init(struct i3c_bus *i3cbus)
i3cbus->mode = I3C_BUS_MODE_PURE;

mutex_lock(&i3c_core_lock);
- ret = idr_alloc(&i3c_bus_idr, i3cbus, 0, 0, GFP_KERNEL);
+ ret = idr_alloc(&i3c_bus_idr, i3cbus, GFP_KERNEL);
mutex_unlock(&i3c_core_lock);

if (ret < 0)
diff --git a/drivers/interconnect/core.c b/drivers/interconnect/core.c
index 808f6e7a8048..eb8e38cddcb9 100644
--- a/drivers/interconnect/core.c
+++ b/drivers/interconnect/core.c
@@ -800,7 +800,7 @@ static struct icc_node *icc_node_create_nolock(int id)
if (!node)
return ERR_PTR(-ENOMEM);

- id = idr_alloc(&icc_idr, node, id, id + 1, GFP_KERNEL);
+ id = idr_alloc_range(&icc_idr, node, id, id + 1, GFP_KERNEL);
if (id < 0) {
WARN(1, "%s: couldn't get idr\n", __func__);
kfree(node);
diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index 2b75f1ef7386..94feda226f47 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -1831,7 +1831,7 @@ static int specific_minor(int minor)
idr_preload(GFP_KERNEL);
spin_lock(&_minor_lock);

- r = idr_alloc(&_minor_idr, MINOR_ALLOCED, minor, minor + 1, GFP_NOWAIT);
+ r = idr_alloc_range(&_minor_idr, MINOR_ALLOCED, minor, minor + 1, GFP_NOWAIT);

spin_unlock(&_minor_lock);
idr_preload_end();
@@ -1847,7 +1847,7 @@ static int next_free_minor(int *minor)
idr_preload(GFP_KERNEL);
spin_lock(&_minor_lock);

- r = idr_alloc(&_minor_idr, MINOR_ALLOCED, 0, 1 << MINORBITS, GFP_NOWAIT);
+ r = idr_alloc_max(&_minor_idr, MINOR_ALLOCED, 1 << MINORBITS, GFP_NOWAIT);

spin_unlock(&_minor_lock);
idr_preload_end();
diff --git a/drivers/memstick/core/memstick.c b/drivers/memstick/core/memstick.c
index 660df7d269fa..c11dbc453af4 100644
--- a/drivers/memstick/core/memstick.c
+++ b/drivers/memstick/core/memstick.c
@@ -514,7 +514,7 @@ int memstick_add_host(struct memstick_host *host)
idr_preload(GFP_KERNEL);
spin_lock(&memstick_host_lock);

- rc = idr_alloc(&memstick_host_idr, host, 0, 0, GFP_NOWAIT);
+ rc = idr_alloc(&memstick_host_idr, host, GFP_NOWAIT);
if (rc >= 0)
host->id = rc;

diff --git a/drivers/memstick/core/ms_block.c b/drivers/memstick/core/ms_block.c
index 3993bdd4b519..065a0cd0d1d6 100644
--- a/drivers/memstick/core/ms_block.c
+++ b/drivers/memstick/core/ms_block.c
@@ -2081,7 +2081,7 @@ static int msb_init_disk(struct memstick_dev *card)
unsigned long capacity;

mutex_lock(&msb_disk_lock);
- msb->disk_id = idr_alloc(&msb_disk_idr, card, 0, 256, GFP_KERNEL);
+ msb->disk_id = idr_alloc_max(&msb_disk_idr, card, 256, GFP_KERNEL);
mutex_unlock(&msb_disk_lock);

if (msb->disk_id < 0)
diff --git a/drivers/memstick/core/mspro_block.c b/drivers/memstick/core/mspro_block.c
index 725ba74ded30..0447f626b7d8 100644
--- a/drivers/memstick/core/mspro_block.c
+++ b/drivers/memstick/core/mspro_block.c
@@ -1161,7 +1161,7 @@ static int mspro_block_init_disk(struct memstick_dev *card)
msb->page_size = be16_to_cpu(sys_info->unit_size);

mutex_lock(&mspro_block_disk_lock);
- disk_id = idr_alloc(&mspro_block_disk_idr, card, 0, 256, GFP_KERNEL);
+ disk_id = idr_alloc_max(&mspro_block_disk_idr, card, 256, GFP_KERNEL);
mutex_unlock(&mspro_block_disk_lock);
if (disk_id < 0)
return disk_id;
diff --git a/drivers/misc/c2port/core.c b/drivers/misc/c2port/core.c
index fb9a1b49ff6d..62f599e2bfb3 100644
--- a/drivers/misc/c2port/core.c
+++ b/drivers/misc/c2port/core.c
@@ -905,7 +905,7 @@ struct c2port_device *c2port_device_register(char *name,

idr_preload(GFP_KERNEL);
spin_lock_irq(&c2port_idr_lock);
- ret = idr_alloc(&c2port_idr, c2dev, 0, 0, GFP_NOWAIT);
+ ret = idr_alloc(&c2port_idr, c2dev, GFP_NOWAIT);
spin_unlock_irq(&c2port_idr_lock);
idr_preload_end();

diff --git a/drivers/misc/cardreader/rtsx_pcr.c b/drivers/misc/cardreader/rtsx_pcr.c
index 2a2619e3c72c..001d8bafee0c 100644
--- a/drivers/misc/cardreader/rtsx_pcr.c
+++ b/drivers/misc/cardreader/rtsx_pcr.c
@@ -1489,7 +1489,7 @@ static int rtsx_pci_probe(struct pci_dev *pcidev,

idr_preload(GFP_KERNEL);
spin_lock(&rtsx_pci_lock);
- ret = idr_alloc(&rtsx_pci_idr, pcr, 0, 0, GFP_NOWAIT);
+ ret = idr_alloc(&rtsx_pci_idr, pcr, GFP_NOWAIT);
if (ret >= 0)
pcr->id = ret;
spin_unlock(&rtsx_pci_lock);
diff --git a/drivers/misc/cxl/context.c b/drivers/misc/cxl/context.c
index e627b4056623..20f38dfed8a7 100644
--- a/drivers/misc/cxl/context.c
+++ b/drivers/misc/cxl/context.c
@@ -91,8 +91,8 @@ int cxl_context_init(struct cxl_context *ctx, struct cxl_afu *afu, bool master)
*/
mutex_lock(&afu->contexts_lock);
idr_preload(GFP_KERNEL);
- i = idr_alloc(&ctx->afu->contexts_idr, ctx, 0,
- ctx->afu->num_procs, GFP_NOWAIT);
+ i = idr_alloc_max(&ctx->afu->contexts_idr, ctx, ctx->afu->num_procs,
+ GFP_NOWAIT);
idr_preload_end();
mutex_unlock(&afu->contexts_lock);
if (i < 0)
diff --git a/drivers/misc/cxl/main.c b/drivers/misc/cxl/main.c
index c1fbf6f588f7..f0cc1010c753 100644
--- a/drivers/misc/cxl/main.c
+++ b/drivers/misc/cxl/main.c
@@ -199,7 +199,7 @@ static int cxl_alloc_adapter_nr(struct cxl *adapter)

idr_preload(GFP_KERNEL);
spin_lock(&adapter_idr_lock);
- i = idr_alloc(&cxl_adapter_idr, adapter, 0, 0, GFP_NOWAIT);
+ i = idr_alloc(&cxl_adapter_idr, adapter, GFP_NOWAIT);
spin_unlock(&adapter_idr_lock);
idr_preload_end();
if (i < 0)
diff --git a/drivers/misc/habanalabs/common/command_submission.c b/drivers/misc/habanalabs/common/command_submission.c
index fb30b7de4aab..cb320cff88fd 100644
--- a/drivers/misc/habanalabs/common/command_submission.c
+++ b/drivers/misc/habanalabs/common/command_submission.c
@@ -1834,7 +1834,7 @@ static int cs_ioctl_reserve_signals(struct hl_fpriv *hpriv,
mgr = &hpriv->ctx->sig_mgr;

spin_lock(&mgr->lock);
- hdl_id = idr_alloc(&mgr->handles, handle, 1, 0, GFP_ATOMIC);
+ hdl_id = idr_alloc_min(&mgr->handles, handle, 1, GFP_ATOMIC);
spin_unlock(&mgr->lock);

if (hdl_id < 0) {
diff --git a/drivers/misc/habanalabs/common/context.c b/drivers/misc/habanalabs/common/context.c
index ed2cfd0c6e99..d9b41e1efc7d 100644
--- a/drivers/misc/habanalabs/common/context.c
+++ b/drivers/misc/habanalabs/common/context.c
@@ -144,7 +144,7 @@ int hl_ctx_create(struct hl_device *hdev, struct hl_fpriv *hpriv)
}

mutex_lock(&mgr->ctx_lock);
- rc = idr_alloc(&mgr->ctx_handles, ctx, 1, 0, GFP_KERNEL);
+ rc = idr_alloc_min(&mgr->ctx_handles, ctx, 1, GFP_KERNEL);
mutex_unlock(&mgr->ctx_lock);

if (rc < 0) {
diff --git a/drivers/misc/habanalabs/common/habanalabs_drv.c b/drivers/misc/habanalabs/common/habanalabs_drv.c
index 37edb69a7255..9730cb3c3669 100644
--- a/drivers/misc/habanalabs/common/habanalabs_drv.c
+++ b/drivers/misc/habanalabs/common/habanalabs_drv.c
@@ -377,11 +377,11 @@ static int create_hdev(struct hl_device **dev, struct pci_dev *pdev)
/* Always save 2 numbers, 1 for main device and 1 for control.
* They must be consecutive
*/
- main_id = idr_alloc(&hl_devs_idr, hdev, 0, HL_MAX_MINORS, GFP_KERNEL);
+ main_id = idr_alloc_max(&hl_devs_idr, hdev, HL_MAX_MINORS, GFP_KERNEL);

if (main_id >= 0)
- ctrl_id = idr_alloc(&hl_devs_idr, hdev, main_id + 1,
- main_id + 2, GFP_KERNEL);
+ ctrl_id = idr_alloc_range(&hl_devs_idr, hdev, main_id + 1,
+ main_id + 2, GFP_KERNEL);

mutex_unlock(&hl_devs_idr_lock);

diff --git a/drivers/misc/habanalabs/common/memory.c b/drivers/misc/habanalabs/common/memory.c
index 663dd7e589d4..8fad3a260eb7 100644
--- a/drivers/misc/habanalabs/common/memory.c
+++ b/drivers/misc/habanalabs/common/memory.c
@@ -169,8 +169,8 @@ static int alloc_device_memory(struct hl_ctx *ctx, struct hl_mem_in *args,
}

spin_lock(&vm->idr_lock);
- handle = idr_alloc(&vm->phys_pg_pack_handles, phys_pg_pack, 1, 0,
- GFP_ATOMIC);
+ handle = idr_alloc_min(&vm->phys_pg_pack_handles, phys_pg_pack, 1,
+ GFP_ATOMIC);
spin_unlock(&vm->idr_lock);

if (handle < 0) {
diff --git a/drivers/misc/habanalabs/common/memory_mgr.c b/drivers/misc/habanalabs/common/memory_mgr.c
index ea5f2bd31b0a..44ee56d23520 100644
--- a/drivers/misc/habanalabs/common/memory_mgr.c
+++ b/drivers/misc/habanalabs/common/memory_mgr.c
@@ -158,7 +158,7 @@ hl_mmap_mem_buf_alloc(struct hl_mem_mgr *mmg,
return NULL;

spin_lock(&mmg->lock);
- rc = idr_alloc(&mmg->handles, buf, 1, 0, GFP_ATOMIC);
+ rc = idr_alloc_min(&mmg->handles, buf, 1, GFP_ATOMIC);
spin_unlock(&mmg->lock);
if (rc < 0) {
dev_err(mmg->dev,
diff --git a/drivers/misc/mei/main.c b/drivers/misc/mei/main.c
index 786f7c8f7f61..7f63566f9bed 100644
--- a/drivers/misc/mei/main.c
+++ b/drivers/misc/mei/main.c
@@ -1189,7 +1189,7 @@ static int mei_minor_get(struct mei_device *dev)
int ret;

mutex_lock(&mei_minor_lock);
- ret = idr_alloc(&mei_idr, dev, 0, MEI_MAX_DEVS, GFP_KERNEL);
+ ret = idr_alloc_max(&mei_idr, dev, MEI_MAX_DEVS, GFP_KERNEL);
if (ret >= 0)
dev->minor = ret;
else if (ret == -ENOSPC)
diff --git a/drivers/misc/ocxl/afu_irq.c b/drivers/misc/ocxl/afu_irq.c
index a06920b7e049..2fd35ea4345c 100644
--- a/drivers/misc/ocxl/afu_irq.c
+++ b/drivers/misc/ocxl/afu_irq.c
@@ -118,8 +118,8 @@ int ocxl_afu_irq_alloc(struct ocxl_context *ctx, int *irq_id)

mutex_lock(&ctx->irq_lock);

- irq->id = idr_alloc(&ctx->irq_idr, irq, 0, MAX_IRQ_PER_CONTEXT,
- GFP_KERNEL);
+ irq->id = idr_alloc_max(&ctx->irq_idr, irq, MAX_IRQ_PER_CONTEXT,
+ GFP_KERNEL);
if (irq->id < 0) {
rc = -ENOSPC;
goto err_unlock;
diff --git a/drivers/misc/ocxl/context.c b/drivers/misc/ocxl/context.c
index 9eb0d93b01c6..ab420850f5a0 100644
--- a/drivers/misc/ocxl/context.c
+++ b/drivers/misc/ocxl/context.c
@@ -16,8 +16,8 @@ int ocxl_context_alloc(struct ocxl_context **context, struct ocxl_afu *afu,

ctx->afu = afu;
mutex_lock(&afu->contexts_lock);
- pasid = idr_alloc(&afu->contexts_idr, ctx, afu->pasid_base,
- afu->pasid_base + afu->pasid_max, GFP_KERNEL);
+ pasid = idr_alloc_range(&afu->contexts_idr, ctx, afu->pasid_base,
+ afu->pasid_base + afu->pasid_max, GFP_KERNEL);
if (pasid < 0) {
mutex_unlock(&afu->contexts_lock);
kfree(ctx);
diff --git a/drivers/misc/ocxl/file.c b/drivers/misc/ocxl/file.c
index 6777c419a8da..93dc30cc4e0d 100644
--- a/drivers/misc/ocxl/file.c
+++ b/drivers/misc/ocxl/file.c
@@ -35,7 +35,7 @@ static int allocate_minor(struct ocxl_file_info *info)
int minor;

mutex_lock(&minors_idr_lock);
- minor = idr_alloc(&minors_idr, info, 0, OCXL_NUM_MINORS, GFP_KERNEL);
+ minor = idr_alloc_max(&minors_idr, info, OCXL_NUM_MINORS, GFP_KERNEL);
mutex_unlock(&minors_idr_lock);
return minor;
}
diff --git a/drivers/misc/tifm_core.c b/drivers/misc/tifm_core.c
index a3098fea3bf7..ff39354db5c2 100644
--- a/drivers/misc/tifm_core.c
+++ b/drivers/misc/tifm_core.c
@@ -194,7 +194,7 @@ int tifm_add_adapter(struct tifm_adapter *fm)

idr_preload(GFP_KERNEL);
spin_lock(&tifm_adapter_lock);
- rc = idr_alloc(&tifm_adapter_idr, fm, 0, 0, GFP_NOWAIT);
+ rc = idr_alloc(&tifm_adapter_idr, fm, GFP_NOWAIT);
if (rc >= 0)
fm->id = rc;
spin_unlock(&tifm_adapter_lock);
diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c
index 9eb0680db312..d55642723b0c 100644
--- a/drivers/mtd/mtdcore.c
+++ b/drivers/mtd/mtdcore.c
@@ -603,9 +603,9 @@ int add_mtd_device(struct mtd_info *mtd)
if (np)
ofidx = of_alias_get_id(np, "mtd");
if (ofidx >= 0)
- i = idr_alloc(&mtd_idr, mtd, ofidx, ofidx + 1, GFP_KERNEL);
+ i = idr_alloc_range(&mtd_idr, mtd, ofidx, ofidx + 1, GFP_KERNEL);
else
- i = idr_alloc(&mtd_idr, mtd, 0, 0, GFP_KERNEL);
+ i = idr_alloc(&mtd_idr, mtd, GFP_KERNEL);
if (i < 0) {
error = i;
goto fail_locked;
diff --git a/drivers/mtd/ubi/block.c b/drivers/mtd/ubi/block.c
index a78fdf3b30f7..8893993f3606 100644
--- a/drivers/mtd/ubi/block.c
+++ b/drivers/mtd/ubi/block.c
@@ -423,7 +423,7 @@ int ubiblock_create(struct ubi_volume_info *vi)
gd->fops = &ubiblock_ops;
gd->major = ubiblock_major;
gd->minors = 1;
- gd->first_minor = idr_alloc(&ubiblock_minor_idr, dev, 0, 0, GFP_KERNEL);
+ gd->first_minor = idr_alloc(&ubiblock_minor_idr, dev, GFP_KERNEL);
if (gd->first_minor < 0) {
dev_err(disk_to_dev(gd),
"block: dynamic minor allocation failed");
diff --git a/drivers/net/ethernet/intel/ice/ice_virtchnl_fdir.c b/drivers/net/ethernet/intel/ice/ice_virtchnl_fdir.c
index c6a58343d81d..034c6cc5f928 100644
--- a/drivers/net/ethernet/intel/ice/ice_virtchnl_fdir.c
+++ b/drivers/net/ethernet/intel/ice/ice_virtchnl_fdir.c
@@ -1124,8 +1124,8 @@ ice_vc_fdir_insert_entry(struct ice_vf *vf,
int i;

/* alloc ID corresponding with conf */
- i = idr_alloc(&vf->fdir.fdir_rule_idr, conf, 0,
- ICE_FDIR_MAX_FLTRS, GFP_KERNEL);
+ i = idr_alloc_max(&vf->fdir.fdir_rule_idr, conf, ICE_FDIR_MAX_FLTRS,
+ GFP_KERNEL);
if (i < 0)
return -EINVAL;
*id = i;
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_policer.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_policer.c
index 39052e5c12fd..356222c4d765 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_policer.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_policer.c
@@ -119,8 +119,8 @@ mlxsw_sp_policer_single_rate_index_alloc(struct mlxsw_sp_policer_family *family,
int id;

mutex_lock(&family->lock);
- id = idr_alloc(&family->policer_idr, policer, family->start_index,
- family->end_index, GFP_KERNEL);
+ id = idr_alloc_range(&family->policer_idr, policer, family->start_index,
+ family->end_index, GFP_KERNEL);
mutex_unlock(&family->lock);

if (id < 0)
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
index 0d8a0068e4ca..545c70197d9a 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
@@ -8587,8 +8587,8 @@ static int mlxsw_sp_rif_mac_profile_index_alloc(struct mlxsw_sp *mlxsw_sp,
struct mlxsw_sp_router *router = mlxsw_sp->router;
int id;

- id = idr_alloc(&router->rif_mac_profiles_idr, profile, 0,
- max_rif_mac_profiles, GFP_KERNEL);
+ id = idr_alloc_max(&router->rif_mac_profiles_idr, profile,
+ max_rif_mac_profiles, GFP_KERNEL);

if (id >= 0) {
profile->id = id;
diff --git a/drivers/net/ethernet/netronome/nfp/flower/main.c b/drivers/net/ethernet/netronome/nfp/flower/main.c
index 4d960a9641b3..6c8901e73bb0 100644
--- a/drivers/net/ethernet/netronome/nfp/flower/main.c
+++ b/drivers/net/ethernet/netronome/nfp/flower/main.c
@@ -65,8 +65,9 @@ nfp_flower_get_internal_port_id(struct nfp_app *app, struct net_device *netdev)

idr_preload(GFP_ATOMIC);
spin_lock_bh(&priv->internal_ports.lock);
- id = idr_alloc(&priv->internal_ports.port_ids, netdev,
- NFP_MIN_INT_PORT_ID, NFP_MAX_INT_PORT_ID, GFP_ATOMIC);
+ id = idr_alloc_range(&priv->internal_ports.port_ids, netdev,
+ NFP_MIN_INT_PORT_ID, NFP_MAX_INT_PORT_ID,
+ GFP_ATOMIC);
spin_unlock_bh(&priv->internal_ports.lock);
idr_preload_end();

diff --git a/drivers/net/ppp/ppp_generic.c b/drivers/net/ppp/ppp_generic.c
index 4a365f15533e..2272174b29fd 100644
--- a/drivers/net/ppp/ppp_generic.c
+++ b/drivers/net/ppp/ppp_generic.c
@@ -3562,7 +3562,7 @@ static int unit_set(struct idr *p, void *ptr, int n)
{
int unit;

- unit = idr_alloc(p, ptr, n, n + 1, GFP_KERNEL);
+ unit = idr_alloc_range(p, ptr, n, n + 1, GFP_KERNEL);
if (unit == -ENOSPC)
unit = -EINVAL;
return unit;
@@ -3571,7 +3571,7 @@ static int unit_set(struct idr *p, void *ptr, int n)
/* get new free unit number and associate pointer with it */
static int unit_get(struct idr *p, void *ptr, int min)
{
- return idr_alloc(p, ptr, min, 0, GFP_KERNEL);
+ return idr_alloc_min(p, ptr, min, GFP_KERNEL);
}

/* put unit number back to a pool */
diff --git a/drivers/net/tap.c b/drivers/net/tap.c
index c3d42062559d..ea022a443745 100644
--- a/drivers/net/tap.c
+++ b/drivers/net/tap.c
@@ -423,7 +423,7 @@ int tap_get_minor(dev_t major, struct tap_dev *tap)
}

spin_lock(&tap_major->minor_lock);
- retval = idr_alloc(&tap_major->minor_idr, tap, 1, TAP_NUM_DEVS, GFP_ATOMIC);
+ retval = idr_alloc_range(&tap_major->minor_idr, tap, 1, TAP_NUM_DEVS, GFP_ATOMIC);
if (retval >= 0) {
tap->minor = retval;
} else if (retval == -ENOSPC) {
diff --git a/drivers/net/wireless/ath/ath10k/htt_tx.c b/drivers/net/wireless/ath/ath10k/htt_tx.c
index 9842a4b2f78f..25f841b4fcb2 100644
--- a/drivers/net/wireless/ath/ath10k/htt_tx.c
+++ b/drivers/net/wireless/ath/ath10k/htt_tx.c
@@ -201,8 +201,8 @@ int ath10k_htt_tx_alloc_msdu_id(struct ath10k_htt *htt, struct sk_buff *skb)
int ret;

spin_lock_bh(&htt->tx_lock);
- ret = idr_alloc(&htt->pending_tx, skb, 0,
- htt->max_num_pending_tx, GFP_ATOMIC);
+ ret = idr_alloc_max(&htt->pending_tx, skb, htt->max_num_pending_tx,
+ GFP_ATOMIC);
spin_unlock_bh(&htt->tx_lock);

ath10k_dbg(ar, ATH10K_DBG_HTT, "htt tx alloc msdu_id %d\n", ret);
diff --git a/drivers/net/wireless/ath/ath10k/wmi-tlv.c b/drivers/net/wireless/ath/ath10k/wmi-tlv.c
index 7efbe03fbca8..e15ab6415b09 100644
--- a/drivers/net/wireless/ath/ath10k/wmi-tlv.c
+++ b/drivers/net/wireless/ath/ath10k/wmi-tlv.c
@@ -3054,8 +3054,9 @@ ath10k_wmi_mgmt_tx_alloc_msdu_id(struct ath10k *ar, struct sk_buff *skb,
pkt_addr->paddr = paddr;

spin_lock_bh(&ar->data_lock);
- ret = idr_alloc(&wmi->mgmt_pending_tx, pkt_addr, 0,
- wmi->mgmt_max_num_pending_tx, GFP_ATOMIC);
+ ret = idr_alloc_max(&wmi->mgmt_pending_tx, pkt_addr,
+ wmi->mgmt_max_num_pending_tx,
+ GFP_ATOMIC);
spin_unlock_bh(&ar->data_lock);

ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi mgmt tx alloc msdu_id ret %d\n", ret);
diff --git a/drivers/net/wireless/ath/ath11k/dbring.c b/drivers/net/wireless/ath/ath11k/dbring.c
index 2107ec05d14f..157e31a6e4bc 100644
--- a/drivers/net/wireless/ath/ath11k/dbring.c
+++ b/drivers/net/wireless/ath/ath11k/dbring.c
@@ -65,7 +65,7 @@ static int ath11k_dbring_bufs_replenish(struct ath11k *ar,
goto err;

spin_lock_bh(&ring->idr_lock);
- buf_id = idr_alloc(&ring->bufs_idr, buff, 0, ring->bufs_max, GFP_ATOMIC);
+ buf_id = idr_alloc_max(&ring->bufs_idr, buff, ring->bufs_max, GFP_ATOMIC);
spin_unlock_bh(&ring->idr_lock);
if (buf_id < 0) {
ret = -ENOBUFS;
diff --git a/drivers/net/wireless/ath/ath11k/dp_rx.c b/drivers/net/wireless/ath/ath11k/dp_rx.c
index 049774cc158c..6b79f52a1cd9 100644
--- a/drivers/net/wireless/ath/ath11k/dp_rx.c
+++ b/drivers/net/wireless/ath/ath11k/dp_rx.c
@@ -389,8 +389,9 @@ int ath11k_dp_rxbufs_replenish(struct ath11k_base *ab, int mac_id,
goto fail_free_skb;

spin_lock_bh(&rx_ring->idr_lock);
- buf_id = idr_alloc(&rx_ring->bufs_idr, skb, 0,
- rx_ring->bufs_max * 3, GFP_ATOMIC);
+ buf_id = idr_alloc_max(&rx_ring->bufs_idr, skb,
+ rx_ring->bufs_max * 3,
+ GFP_ATOMIC);
spin_unlock_bh(&rx_ring->idr_lock);
if (buf_id < 0)
goto fail_dma_unmap;
@@ -2859,8 +2860,8 @@ static struct sk_buff *ath11k_dp_rx_alloc_mon_status_buf(struct ath11k_base *ab,
goto fail_free_skb;

spin_lock_bh(&rx_ring->idr_lock);
- *buf_id = idr_alloc(&rx_ring->bufs_idr, skb, 0,
- rx_ring->bufs_max, GFP_ATOMIC);
+ *buf_id = idr_alloc_max(&rx_ring->bufs_idr, skb, rx_ring->bufs_max,
+ GFP_ATOMIC);
spin_unlock_bh(&rx_ring->idr_lock);
if (*buf_id < 0)
goto fail_dma_unmap;
@@ -3384,8 +3385,9 @@ static int ath11k_dp_rx_h_defrag_reo_reinject(struct ath11k *ar, struct dp_rx_ti
return -ENOMEM;

spin_lock_bh(&rx_refill_ring->idr_lock);
- buf_id = idr_alloc(&rx_refill_ring->bufs_idr, defrag_skb, 0,
- rx_refill_ring->bufs_max * 3, GFP_ATOMIC);
+ buf_id = idr_alloc_max(&rx_refill_ring->bufs_idr, defrag_skb,
+ rx_refill_ring->bufs_max * 3,
+ GFP_ATOMIC);
spin_unlock_bh(&rx_refill_ring->idr_lock);
if (buf_id < 0) {
ret = -ENOMEM;
diff --git a/drivers/net/wireless/ath/ath11k/dp_tx.c b/drivers/net/wireless/ath/ath11k/dp_tx.c
index c17a2620aad7..a81cd7045e92 100644
--- a/drivers/net/wireless/ath/ath11k/dp_tx.c
+++ b/drivers/net/wireless/ath/ath11k/dp_tx.c
@@ -124,8 +124,8 @@ int ath11k_dp_tx(struct ath11k *ar, struct ath11k_vif *arvif,
tx_ring = &dp->tx_ring[ti.ring_id];

spin_lock_bh(&tx_ring->tx_idr_lock);
- ret = idr_alloc(&tx_ring->txbuf_idr, skb, 0,
- DP_TX_IDR_SIZE - 1, GFP_ATOMIC);
+ ret = idr_alloc_max(&tx_ring->txbuf_idr, skb, DP_TX_IDR_SIZE - 1,
+ GFP_ATOMIC);
spin_unlock_bh(&tx_ring->tx_idr_lock);

if (unlikely(ret < 0)) {
diff --git a/drivers/net/wireless/ath/ath11k/mac.c b/drivers/net/wireless/ath/ath11k/mac.c
index ee1590b16eff..d47d7f905230 100644
--- a/drivers/net/wireless/ath/ath11k/mac.c
+++ b/drivers/net/wireless/ath/ath11k/mac.c
@@ -5478,8 +5478,9 @@ static int ath11k_mac_mgmt_tx_wmi(struct ath11k *ar, struct ath11k_vif *arvif,
ATH11K_SKB_CB(skb)->ar = ar;

spin_lock_bh(&ar->txmgmt_idr_lock);
- buf_id = idr_alloc(&ar->txmgmt_idr, skb, 0,
- ATH11K_TX_MGMT_NUM_PENDING_MAX, GFP_ATOMIC);
+ buf_id = idr_alloc_max(&ar->txmgmt_idr, skb,
+ ATH11K_TX_MGMT_NUM_PENDING_MAX,
+ GFP_ATOMIC);
spin_unlock_bh(&ar->txmgmt_idr_lock);

ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
diff --git a/drivers/net/wireless/marvell/mwifiex/main.c b/drivers/net/wireless/marvell/mwifiex/main.c
index ace7371c4773..7d46ede7e6ab 100644
--- a/drivers/net/wireless/marvell/mwifiex/main.c
+++ b/drivers/net/wireless/marvell/mwifiex/main.c
@@ -867,8 +867,8 @@ mwifiex_clone_skb_for_tx_status(struct mwifiex_private *priv,
int id;

spin_lock_bh(&priv->ack_status_lock);
- id = idr_alloc(&priv->ack_status_frames, orig_skb,
- 1, 0x10, GFP_ATOMIC);
+ id = idr_alloc_range(&priv->ack_status_frames, orig_skb,
+ 1, 0x10, GFP_ATOMIC);
spin_unlock_bh(&priv->ack_status_lock);

if (id >= 0) {
diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h
index 4e8997c45c1b..162ed80dd9e1 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76.h
@@ -1411,7 +1411,7 @@ mt76_token_get(struct mt76_dev *dev, struct mt76_txwi_cache **ptxwi)
int token;

spin_lock_bh(&dev->token_lock);
- token = idr_alloc(&dev->token, *ptxwi, 0, dev->token_size, GFP_ATOMIC);
+ token = idr_alloc_max(&dev->token, *ptxwi, dev->token_size, GFP_ATOMIC);
spin_unlock_bh(&dev->token_lock);

return token;
diff --git a/drivers/net/wireless/mediatek/mt76/tx.c b/drivers/net/wireless/mediatek/mt76/tx.c
index 1d08d99e298c..13b105cb0419 100644
--- a/drivers/net/wireless/mediatek/mt76/tx.c
+++ b/drivers/net/wireless/mediatek/mt76/tx.c
@@ -131,8 +131,8 @@ mt76_tx_status_skb_add(struct mt76_dev *dev, struct mt76_wcid *wcid,

spin_lock_bh(&dev->status_lock);

- pid = idr_alloc(&wcid->pktid, skb, MT_PACKET_ID_FIRST,
- MT_PACKET_ID_MASK, GFP_ATOMIC);
+ pid = idr_alloc_range(&wcid->pktid, skb, MT_PACKET_ID_FIRST,
+ MT_PACKET_ID_MASK, GFP_ATOMIC);
if (pid < 0) {
pid = MT_PACKET_ID_NO_SKB;
goto out;
@@ -721,7 +721,7 @@ int mt76_token_consume(struct mt76_dev *dev, struct mt76_txwi_cache **ptxwi)

spin_lock_bh(&dev->token_lock);

- token = idr_alloc(&dev->token, *ptxwi, 0, dev->token_size, GFP_ATOMIC);
+ token = idr_alloc_max(&dev->token, *ptxwi, dev->token_size, GFP_ATOMIC);
if (token >= 0)
dev->token_count++;

diff --git a/drivers/of/overlay.c b/drivers/of/overlay.c
index 4044ddcb02c6..7cf58d208530 100644
--- a/drivers/of/overlay.c
+++ b/drivers/of/overlay.c
@@ -1005,7 +1005,7 @@ int of_overlay_fdt_apply(const void *overlay_fdt, u32 overlay_fdt_size,
* ovcs resources, implicitly set by kzalloc() of ovcs
*/

- ovcs->id = idr_alloc(&ovcs_idr, ovcs, 1, 0, GFP_KERNEL);
+ ovcs->id = idr_alloc_min(&ovcs_idr, ovcs, 1, GFP_KERNEL);
if (ovcs->id <= 0) {
ret = ovcs->id;
goto err_free_ovcs;
diff --git a/drivers/pci/endpoint/pci-ep-cfs.c b/drivers/pci/endpoint/pci-ep-cfs.c
index d4850bdd837f..81df9549bd8c 100644
--- a/drivers/pci/endpoint/pci-ep-cfs.c
+++ b/drivers/pci/endpoint/pci-ep-cfs.c
@@ -562,7 +562,7 @@ static struct config_group *pci_epf_make(struct config_group *group,
return ERR_PTR(-ENOMEM);

mutex_lock(&functions_mutex);
- index = idr_alloc(&functions_idr, epf_group, 0, 0, GFP_KERNEL);
+ index = idr_alloc(&functions_idr, epf_group, GFP_KERNEL);
mutex_unlock(&functions_mutex);
if (index < 0) {
err = index;
diff --git a/drivers/power/supply/bq2415x_charger.c b/drivers/power/supply/bq2415x_charger.c
index 5724001e66b9..4bce687e9d83 100644
--- a/drivers/power/supply/bq2415x_charger.c
+++ b/drivers/power/supply/bq2415x_charger.c
@@ -1540,7 +1540,7 @@ static int bq2415x_probe(struct i2c_client *client,

/* Get new ID for the new device */
mutex_lock(&bq2415x_id_mutex);
- num = idr_alloc(&bq2415x_id, client, 0, 0, GFP_KERNEL);
+ num = idr_alloc(&bq2415x_id, client, GFP_KERNEL);
mutex_unlock(&bq2415x_id_mutex);
if (num < 0)
return num;
diff --git a/drivers/power/supply/bq27xxx_battery_i2c.c b/drivers/power/supply/bq27xxx_battery_i2c.c
index cf38cbfe13e9..06dc57e0ba74 100644
--- a/drivers/power/supply/bq27xxx_battery_i2c.c
+++ b/drivers/power/supply/bq27xxx_battery_i2c.c
@@ -146,7 +146,7 @@ static int bq27xxx_battery_i2c_probe(struct i2c_client *client,

/* Get new ID for the new battery device */
mutex_lock(&battery_mutex);
- num = idr_alloc(&battery_id, client, 0, 0, GFP_KERNEL);
+ num = idr_alloc(&battery_id, client, GFP_KERNEL);
mutex_unlock(&battery_mutex);
if (num < 0)
return num;
diff --git a/drivers/power/supply/ds2782_battery.c b/drivers/power/supply/ds2782_battery.c
index 9ae273fde7a2..048001b7b050 100644
--- a/drivers/power/supply/ds2782_battery.c
+++ b/drivers/power/supply/ds2782_battery.c
@@ -390,7 +390,7 @@ static int ds278x_battery_probe(struct i2c_client *client,

/* Get an ID for this battery */
mutex_lock(&battery_lock);
- ret = idr_alloc(&battery_id, client, 0, 0, GFP_KERNEL);
+ ret = idr_alloc(&battery_id, client, GFP_KERNEL);
mutex_unlock(&battery_lock);
if (ret < 0)
goto fail_id;
diff --git a/drivers/powercap/powercap_sys.c b/drivers/powercap/powercap_sys.c
index f0654a932b37..434c2eea51c6 100644
--- a/drivers/powercap/powercap_sys.c
+++ b/drivers/powercap/powercap_sys.c
@@ -519,7 +519,7 @@ struct powercap_zone *powercap_register_zone(

mutex_lock(&control_type->lock);
/* Using idr to get the unique id */
- result = idr_alloc(power_zone->parent_idr, NULL, 0, 0, GFP_KERNEL);
+ result = idr_alloc(power_zone->parent_idr, NULL, GFP_KERNEL);
if (result < 0)
goto err_idr_alloc;

diff --git a/drivers/pps/pps.c b/drivers/pps/pps.c
index 22a65ad4e46e..cb73b3cc6bac 100644
--- a/drivers/pps/pps.c
+++ b/drivers/pps/pps.c
@@ -351,10 +351,10 @@ int pps_register_cdev(struct pps_device *pps)

mutex_lock(&pps_idr_lock);
/*
- * Get new ID for the new PPS source. After idr_alloc() calling
+ * Get new ID for the new PPS source. After idr_alloc_max() calling
* the new source will be freely available into the kernel.
*/
- err = idr_alloc(&pps_idr, pps, 0, PPS_MAX_SOURCES, GFP_KERNEL);
+ err = idr_alloc_max(&pps_idr, pps, PPS_MAX_SOURCES, GFP_KERNEL);
if (err < 0) {
if (err == -ENOSPC) {
pr_err("%s: too many PPS sources in the system\n",
diff --git a/drivers/ptp/ptp_ocp.c b/drivers/ptp/ptp_ocp.c
index 4519ef42b458..10853d551ddc 100644
--- a/drivers/ptp/ptp_ocp.c
+++ b/drivers/ptp/ptp_ocp.c
@@ -3503,7 +3503,7 @@ ptp_ocp_device_init(struct ptp_ocp *bp, struct pci_dev *pdev)
int err;

mutex_lock(&ptp_ocp_lock);
- err = idr_alloc(&ptp_ocp_idr, bp, 0, 0, GFP_KERNEL);
+ err = idr_alloc(&ptp_ocp_idr, bp, GFP_KERNEL);
mutex_unlock(&ptp_ocp_lock);
if (err < 0) {
dev_err(&pdev->dev, "idr_alloc failed: %d\n", err);
diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c
index 02a04ab34a23..38f16dc4df06 100644
--- a/drivers/remoteproc/remoteproc_core.c
+++ b/drivers/remoteproc/remoteproc_core.c
@@ -365,7 +365,7 @@ int rproc_alloc_vring(struct rproc_vdev *rvdev, int i)
* TODO: assign a notifyid for rvdev updates as well
* TODO: support predefined notifyids (via resource table)
*/
- ret = idr_alloc(&rproc->notifyids, rvring, 0, 0, GFP_KERNEL);
+ ret = idr_alloc(&rproc->notifyids, rvring, GFP_KERNEL);
if (ret < 0) {
dev_err(dev, "idr_alloc failed: %d\n", ret);
return ret;
diff --git a/drivers/reset/reset-ti-sci.c b/drivers/reset/reset-ti-sci.c
index b799aefad547..56309bb536bc 100644
--- a/drivers/reset/reset-ti-sci.c
+++ b/drivers/reset/reset-ti-sci.c
@@ -206,7 +206,7 @@ static int ti_sci_reset_of_xlate(struct reset_controller_dev *rcdev,
control->reset_mask = reset_spec->args[1];
mutex_init(&control->lock);

- return idr_alloc(&data->idr, control, 0, 0, GFP_KERNEL);
+ return idr_alloc(&data->idr, control, GFP_KERNEL);
}

static const struct of_device_id ti_sci_reset_of_match[] = {
diff --git a/drivers/rpmsg/qcom_glink_native.c b/drivers/rpmsg/qcom_glink_native.c
index 07586514991f..23e7a7cc15e0 100644
--- a/drivers/rpmsg/qcom_glink_native.c
+++ b/drivers/rpmsg/qcom_glink_native.c
@@ -974,8 +974,8 @@ static void qcom_glink_handle_intent(struct qcom_glink *glink,
intent->size = le32_to_cpu(msg->intents[i].size);

spin_lock_irqsave(&channel->intent_lock, flags);
- ret = idr_alloc(&channel->riids, intent,
- intent->id, intent->id + 1, GFP_ATOMIC);
+ ret = idr_alloc_range(&channel->riids, intent,
+ intent->id, intent->id + 1, GFP_ATOMIC);
spin_unlock_irqrestore(&channel->intent_lock, flags);

if (ret < 0)
@@ -1479,7 +1479,7 @@ static int qcom_glink_rx_open(struct qcom_glink *glink, unsigned int rcid,
}

spin_lock_irqsave(&glink->idr_lock, flags);
- ret = idr_alloc(&glink->rcids, channel, rcid, rcid + 1, GFP_ATOMIC);
+ ret = idr_alloc_range(&glink->rcids, channel, rcid, rcid + 1, GFP_ATOMIC);
if (ret < 0) {
dev_err(glink->dev, "Unable to insert channel into rcid list\n");
spin_unlock_irqrestore(&glink->idr_lock, flags);
diff --git a/drivers/rpmsg/virtio_rpmsg_bus.c b/drivers/rpmsg/virtio_rpmsg_bus.c
index 905ac7910c98..5e582aaad676 100644
--- a/drivers/rpmsg/virtio_rpmsg_bus.c
+++ b/drivers/rpmsg/virtio_rpmsg_bus.c
@@ -239,7 +239,7 @@ static struct rpmsg_endpoint *__rpmsg_create_ept(struct virtproc_info *vrp,
mutex_lock(&vrp->endpoints_lock);

/* bind the endpoint to an rpmsg address (and allocate one if needed) */
- id = idr_alloc(&vrp->endpoints, ept, id_min, id_max, GFP_KERNEL);
+ id = idr_alloc_range(&vrp->endpoints, ept, id_min, id_max, GFP_KERNEL);
if (id < 0) {
dev_err(dev, "idr_alloc failed: %d\n", id);
goto free_ept;
diff --git a/drivers/scsi/bfa/bfad_im.c b/drivers/scsi/bfa/bfad_im.c
index c335f7a188d2..9d5eefd409e5 100644
--- a/drivers/scsi/bfa/bfad_im.c
+++ b/drivers/scsi/bfa/bfad_im.c
@@ -538,7 +538,7 @@ bfad_im_scsi_host_alloc(struct bfad_s *bfad, struct bfad_im_port_s *im_port,
int error;

mutex_lock(&bfad_mutex);
- error = idr_alloc(&bfad_im_port_index, im_port, 0, 0, GFP_KERNEL);
+ error = idr_alloc(&bfad_im_port_index, im_port, GFP_KERNEL);
if (error < 0) {
mutex_unlock(&bfad_mutex);
printk(KERN_WARNING "idr_alloc failure\n");
diff --git a/drivers/scsi/ch.c b/drivers/scsi/ch.c
index 908854869864..474c71d0463f 100644
--- a/drivers/scsi/ch.c
+++ b/drivers/scsi/ch.c
@@ -900,7 +900,7 @@ static int ch_probe(struct device *dev)

idr_preload(GFP_KERNEL);
spin_lock(&ch_index_lock);
- ret = idr_alloc(&ch_index_idr, ch, 0, CH_MAX_DEVS + 1, GFP_NOWAIT);
+ ret = idr_alloc_max(&ch_index_idr, ch, CH_MAX_DEVS + 1, GFP_NOWAIT);
spin_unlock(&ch_index_lock);
idr_preload_end();

diff --git a/drivers/scsi/cxlflash/ocxl_hw.c b/drivers/scsi/cxlflash/ocxl_hw.c
index 244fc27215dc..3b2dd3f0caec 100644
--- a/drivers/scsi/cxlflash/ocxl_hw.c
+++ b/drivers/scsi/cxlflash/ocxl_hw.c
@@ -495,7 +495,7 @@ static void *ocxlflash_dev_context_init(struct pci_dev *pdev, void *afu_cookie)
}

idr_preload(GFP_KERNEL);
- rc = idr_alloc(&afu->idr, ctx, 0, afu->max_pasid, GFP_NOWAIT);
+ rc = idr_alloc_max(&afu->idr, ctx, afu->max_pasid, GFP_NOWAIT);
idr_preload_end();
if (unlikely(rc < 0)) {
dev_err(dev, "%s: idr_alloc failed rc=%d\n", __func__, rc);
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c
index 750dd1e9f2cc..554f9231ef16 100644
--- a/drivers/scsi/lpfc/lpfc_init.c
+++ b/drivers/scsi/lpfc/lpfc_init.c
@@ -4894,7 +4894,7 @@ lpfc_get_instance(void)
{
int ret;

- ret = idr_alloc(&lpfc_hba_index, NULL, 0, 0, GFP_KERNEL);
+ ret = idr_alloc(&lpfc_hba_index, NULL, GFP_KERNEL);
return ret < 0 ? -1 : ret;
}

diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c
index 5d21f07456c6..df86285773ad 100644
--- a/drivers/scsi/scsi_transport_iscsi.c
+++ b/drivers/scsi/scsi_transport_iscsi.c
@@ -217,7 +217,8 @@ iscsi_create_endpoint(int dd_size)
* First endpoint id should be 1 to comply with user space
* applications (iscsid).
*/
- id = idr_alloc(&iscsi_ep_idr, ep, 1, -1, GFP_NOIO);
+ id = idr_alloc_min(&iscsi_ep_idr, ep, 1, GFP_NOIO);
+
if (id < 0) {
mutex_unlock(&iscsi_ep_idr_mutex);
printk(KERN_ERR "Could not allocate endpoint ID. Error %d.\n",
diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c
index 118c7b4a8af2..52632741ef94 100644
--- a/drivers/scsi/sg.c
+++ b/drivers/scsi/sg.c
@@ -1450,7 +1450,7 @@ sg_alloc(struct scsi_device *scsidp)
idr_preload(GFP_KERNEL);
write_lock_irqsave(&sg_index_lock, iflags);

- error = idr_alloc(&sg_index_idr, sdp, 0, SG_MAX_DEVS, GFP_NOWAIT);
+ error = idr_alloc_max(&sg_index_idr, sdp, SG_MAX_DEVS, GFP_NOWAIT);
if (error < 0) {
if (error == -ENOSPC) {
sdev_printk(KERN_WARNING, scsidp,
diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c
index 850172a2b8f1..02dc4f24a839 100644
--- a/drivers/scsi/st.c
+++ b/drivers/scsi/st.c
@@ -4343,7 +4343,7 @@ static int st_probe(struct device *dev)

idr_preload(GFP_KERNEL);
spin_lock(&st_index_lock);
- error = idr_alloc(&st_index_idr, tpnt, 0, ST_MAX_TAPES + 1, GFP_NOWAIT);
+ error = idr_alloc_max(&st_index_idr, tpnt, ST_MAX_TAPES + 1, GFP_NOWAIT);
spin_unlock(&st_index_lock);
idr_preload_end();
if (error < 0) {
diff --git a/drivers/soc/qcom/apr.c b/drivers/soc/qcom/apr.c
index 3caabd873322..ae5417dc74e9 100644
--- a/drivers/soc/qcom/apr.c
+++ b/drivers/soc/qcom/apr.c
@@ -457,7 +457,7 @@ static int apr_add_device(struct device *dev, struct device_node *np,
adev->dev.driver = NULL;

spin_lock(&apr->svcs_lock);
- idr_alloc(&apr->svcs_idr, svc, svc_id, svc_id + 1, GFP_ATOMIC);
+ idr_alloc_range(&apr->svcs_idr, svc, svc_id, svc_id + 1, GFP_ATOMIC);
spin_unlock(&apr->svcs_lock);

of_property_read_string_index(np, "qcom,protection-domain",
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index ea09d1b42bf6..a42df3949408 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -2939,8 +2939,8 @@ int spi_register_controller(struct spi_controller *ctlr)
if (ctlr->bus_num >= 0) {
/* devices with a fixed bus num must check-in with the num */
mutex_lock(&board_lock);
- id = idr_alloc(&spi_master_idr, ctlr, ctlr->bus_num,
- ctlr->bus_num + 1, GFP_KERNEL);
+ id = idr_alloc_range(&spi_master_idr, ctlr, ctlr->bus_num,
+ ctlr->bus_num + 1, GFP_KERNEL);
mutex_unlock(&board_lock);
if (WARN(id < 0, "couldn't get idr"))
return id == -ENOSPC ? -EBUSY : id;
@@ -2951,8 +2951,8 @@ int spi_register_controller(struct spi_controller *ctlr)
if (id >= 0) {
ctlr->bus_num = id;
mutex_lock(&board_lock);
- id = idr_alloc(&spi_master_idr, ctlr, ctlr->bus_num,
- ctlr->bus_num + 1, GFP_KERNEL);
+ id = idr_alloc_range(&spi_master_idr, ctlr, ctlr->bus_num,
+ ctlr->bus_num + 1, GFP_KERNEL);
mutex_unlock(&board_lock);
if (WARN(id < 0, "couldn't get idr"))
return id == -ENOSPC ? -EBUSY : id;
@@ -2966,8 +2966,8 @@ int spi_register_controller(struct spi_controller *ctlr)
first_dynamic++;

mutex_lock(&board_lock);
- id = idr_alloc(&spi_master_idr, ctlr, first_dynamic,
- 0, GFP_KERNEL);
+ id = idr_alloc_min(&spi_master_idr, ctlr, first_dynamic,
+ GFP_KERNEL);
mutex_unlock(&board_lock);
if (WARN(id < 0, "couldn't get idr"))
return id;
diff --git a/drivers/staging/greybus/uart.c b/drivers/staging/greybus/uart.c
index dc4ed0ff1ae2..074f12fce1a5 100644
--- a/drivers/staging/greybus/uart.c
+++ b/drivers/staging/greybus/uart.c
@@ -362,7 +362,7 @@ static int alloc_minor(struct gb_tty *gb_tty)
int minor;

mutex_lock(&table_lock);
- minor = idr_alloc(&tty_minors, gb_tty, 0, GB_NUM_MINORS, GFP_KERNEL);
+ minor = idr_alloc_max(&tty_minors, gb_tty, GB_NUM_MINORS, GFP_KERNEL);
mutex_unlock(&table_lock);
if (minor >= 0)
gb_tty->minor = minor;
diff --git a/drivers/staging/pi433/pi433_if.c b/drivers/staging/pi433/pi433_if.c
index 941aaa7eab2e..a82748263cda 100644
--- a/drivers/staging/pi433/pi433_if.c
+++ b/drivers/staging/pi433/pi433_if.c
@@ -1063,7 +1063,7 @@ static int pi433_get_minor(struct pi433_device *device)
int retval = -ENOMEM;

mutex_lock(&minor_lock);
- retval = idr_alloc(&pi433_idr, device, 0, N_PI433_MINORS, GFP_KERNEL);
+ retval = idr_alloc_max(&pi433_idr, device, N_PI433_MINORS, GFP_KERNEL);
if (retval >= 0) {
device->minor = retval;
retval = 0;
diff --git a/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c b/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c
index 845b20e4d05a..1f465eb4149a 100644
--- a/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c
+++ b/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c
@@ -198,8 +198,7 @@ get_msg_context(struct vchiq_mmal_instance *instance)
* message is being replied to.
*/
mutex_lock(&instance->context_map_lock);
- handle = idr_alloc(&instance->context_map, msg_context,
- 0, 0, GFP_KERNEL);
+ handle = idr_alloc(&instance->context_map, msg_context, GFP_KERNEL);
mutex_unlock(&instance->context_map_lock);

if (handle < 0) {
diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c
index e368f038ff5c..4f3dafe6f680 100644
--- a/drivers/target/iscsi/iscsi_target.c
+++ b/drivers/target/iscsi/iscsi_target.c
@@ -138,7 +138,7 @@ struct iscsi_tiqn *iscsit_add_tiqn(unsigned char *buf)
idr_preload(GFP_KERNEL);
spin_lock(&tiqn_lock);

- ret = idr_alloc(&tiqn_idr, NULL, 0, 0, GFP_NOWAIT);
+ ret = idr_alloc(&tiqn_idr, NULL, GFP_NOWAIT);
if (ret < 0) {
pr_err("idr_alloc() failed for tiqn->tiqn_index\n");
spin_unlock(&tiqn_lock);
diff --git a/drivers/tee/optee/supp.c b/drivers/tee/optee/supp.c
index 322a543b8c27..7889b7f209c3 100644
--- a/drivers/tee/optee/supp.c
+++ b/drivers/tee/optee/supp.c
@@ -172,7 +172,7 @@ static struct optee_supp_req *supp_pop_entry(struct optee_supp *supp,
return ERR_PTR(-EINVAL);
}

- *id = idr_alloc(&supp->idr, req, 1, 0, GFP_KERNEL);
+ *id = idr_alloc_min(&supp->idr, req, 1, GFP_KERNEL);
if (*id < 0)
return ERR_PTR(-ENOMEM);

diff --git a/drivers/tee/tee_shm.c b/drivers/tee/tee_shm.c
index f2b1bcefcadd..b930229dce2a 100644
--- a/drivers/tee/tee_shm.c
+++ b/drivers/tee/tee_shm.c
@@ -161,7 +161,7 @@ struct tee_shm *tee_shm_alloc_user_buf(struct tee_context *ctx, size_t size)
int id;

mutex_lock(&teedev->mutex);
- id = idr_alloc(&teedev->idr, NULL, 1, 0, GFP_KERNEL);
+ id = idr_alloc_min(&teedev->idr, NULL, 1, GFP_KERNEL);
mutex_unlock(&teedev->mutex);
if (id < 0)
return ERR_PTR(id);
@@ -327,7 +327,7 @@ struct tee_shm *tee_shm_register_user_buf(struct tee_context *ctx,
int id;

mutex_lock(&teedev->mutex);
- id = idr_alloc(&teedev->idr, NULL, 1, 0, GFP_KERNEL);
+ id = idr_alloc_min(&teedev->idr, NULL, 1, GFP_KERNEL);
mutex_unlock(&teedev->mutex);
if (id < 0)
return ERR_PTR(id);
diff --git a/drivers/tty/rpmsg_tty.c b/drivers/tty/rpmsg_tty.c
index 29db413bbc03..afdd5454ca0f 100644
--- a/drivers/tty/rpmsg_tty.c
+++ b/drivers/tty/rpmsg_tty.c
@@ -138,7 +138,7 @@ static struct rpmsg_tty_port *rpmsg_tty_alloc_cport(void)
return ERR_PTR(-ENOMEM);

mutex_lock(&idr_lock);
- ret = idr_alloc(&tty_idr, cport, 0, MAX_TTY_RPMSG, GFP_KERNEL);
+ ret = idr_alloc_max(&tty_idr, cport, MAX_TTY_RPMSG, GFP_KERNEL);
mutex_unlock(&idr_lock);

if (ret < 0) {
diff --git a/drivers/tty/serial/mps2-uart.c b/drivers/tty/serial/mps2-uart.c
index 5e9429dcc51f..44ad5573bdd8 100644
--- a/drivers/tty/serial/mps2-uart.c
+++ b/drivers/tty/serial/mps2-uart.c
@@ -537,7 +537,7 @@ static int mps2_of_get_port(struct platform_device *pdev,
if (id < 0)
id = idr_alloc_cyclic(&ports_idr, (void *)mps_port, 0, MPS2_MAX_PORTS, GFP_KERNEL);
else
- id = idr_alloc(&ports_idr, (void *)mps_port, id, MPS2_MAX_PORTS, GFP_KERNEL);
+ id = idr_alloc_range(&ports_idr, (void *)mps_port, id, MPS2_MAX_PORTS, GFP_KERNEL);

if (id < 0)
return id;
diff --git a/drivers/uio/uio.c b/drivers/uio/uio.c
index 43afbb7c5ab9..7cdc6b98d514 100644
--- a/drivers/uio/uio.c
+++ b/drivers/uio/uio.c
@@ -403,7 +403,7 @@ static int uio_get_minor(struct uio_device *idev)
int retval;

mutex_lock(&minor_lock);
- retval = idr_alloc(&uio_idr, idev, 0, UIO_MAX_DEVICES, GFP_KERNEL);
+ retval = idr_alloc_max(&uio_idr, idev, UIO_MAX_DEVICES, GFP_KERNEL);
if (retval >= 0) {
idev->minor = retval;
retval = 0;
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
index 9b9aea24d58c..682476828ad5 100644
--- a/drivers/usb/class/cdc-acm.c
+++ b/drivers/usb/class/cdc-acm.c
@@ -89,7 +89,7 @@ static int acm_alloc_minor(struct acm *acm)
int minor;

mutex_lock(&acm_minors_lock);
- minor = idr_alloc(&acm_minors, acm, 0, ACM_TTY_MINORS, GFP_KERNEL);
+ minor = idr_alloc_max(&acm_minors, acm, ACM_TTY_MINORS, GFP_KERNEL);
mutex_unlock(&acm_minors_lock);

return minor;
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index 06eea8848ccc..10847f2817c4 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -924,7 +924,7 @@ static int usb_register_bus(struct usb_bus *bus)
int busnum;

mutex_lock(&usb_bus_idr_lock);
- busnum = idr_alloc(&usb_bus_idr, bus, 1, USB_MAXBUS, GFP_KERNEL);
+ busnum = idr_alloc_range(&usb_bus_idr, bus, 1, USB_MAXBUS, GFP_KERNEL);
if (busnum < 0) {
pr_err("%s: failed to get bus number\n", usbcore_name);
goto error_find_busnum;
diff --git a/drivers/usb/host/xhci-dbgtty.c b/drivers/usb/host/xhci-dbgtty.c
index d3acc0829ee5..1c29c4ffd6a3 100644
--- a/drivers/usb/host/xhci-dbgtty.c
+++ b/drivers/usb/host/xhci-dbgtty.c
@@ -417,7 +417,7 @@ static int xhci_dbc_tty_register_device(struct xhci_dbc *dbc)
xhci_dbc_tty_init_port(dbc, port);

mutex_lock(&dbc_tty_minors_lock);
- port->minor = idr_alloc(&dbc_tty_minors, port, 0, 64, GFP_KERNEL);
+ port->minor = idr_alloc_max(&dbc_tty_minors, port, 64, GFP_KERNEL);
mutex_unlock(&dbc_tty_minors_lock);

if (port->minor < 0) {
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c
index 24101bd7fcad..9249b3ca6112 100644
--- a/drivers/usb/serial/usb-serial.c
+++ b/drivers/usb/serial/usb-serial.c
@@ -92,8 +92,9 @@ static int allocate_minors(struct usb_serial *serial, int num_ports)
mutex_lock(&table_lock);
for (i = 0; i < num_ports; ++i) {
port = serial->port[i];
- minor = idr_alloc(&serial_minors, port, 0,
- USB_SERIAL_TTY_MINORS, GFP_KERNEL);
+ minor = idr_alloc_max(&serial_minors, port,
+ USB_SERIAL_TTY_MINORS,
+ GFP_KERNEL);
if (minor < 0)
goto error;
port->minor = minor;
diff --git a/drivers/vdpa/vdpa_user/vduse_dev.c b/drivers/vdpa/vdpa_user/vduse_dev.c
index 3bc27de58f46..cc391759862a 100644
--- a/drivers/vdpa/vdpa_user/vduse_dev.c
+++ b/drivers/vdpa/vdpa_user/vduse_dev.c
@@ -1339,7 +1339,7 @@ static int vduse_create_dev(struct vduse_dev_config *config,
spin_lock_init(&dev->vqs[i].irq_lock);
}

- ret = idr_alloc(&vduse_idr, dev, 1, VDUSE_DEV_MAX, GFP_KERNEL);
+ ret = idr_alloc_range(&vduse_idr, dev, 1, VDUSE_DEV_MAX, GFP_KERNEL);
if (ret < 0)
goto err_idr;

diff --git a/fs/cifs/cifs_swn.c b/fs/cifs/cifs_swn.c
index 1e4c7cc5287f..560f59f7da6e 100644
--- a/fs/cifs/cifs_swn.c
+++ b/fs/cifs/cifs_swn.c
@@ -328,7 +328,7 @@ static struct cifs_swn_reg *cifs_get_swn_reg(struct cifs_tcon *tcon)

kref_init(&reg->ref_count);

- reg->id = idr_alloc(&cifs_swnreg_idr, reg, 1, 0, GFP_ATOMIC);
+ reg->id = idr_alloc_min(&cifs_swnreg_idr, reg, 1, GFP_ATOMIC);
if (reg->id < 0) {
cifs_dbg(FYI, "%s: failed to allocate registration id\n", __func__);
ret = reg->id;
diff --git a/fs/dlm/lock.c b/fs/dlm/lock.c
index 226822f49d30..c6c61e80afc4 100644
--- a/fs/dlm/lock.c
+++ b/fs/dlm/lock.c
@@ -1217,7 +1217,7 @@ static int _create_lkb(struct dlm_ls *ls, struct dlm_lkb **lkb_ret,

idr_preload(GFP_NOFS);
spin_lock(&ls->ls_lkbidr_spin);
- rv = idr_alloc(&ls->ls_lkbidr, lkb, start, end, GFP_NOWAIT);
+ rv = idr_alloc_range(&ls->ls_lkbidr, lkb, start, end, GFP_NOWAIT);
if (rv >= 0)
lkb->lkb_id = rv;
spin_unlock(&ls->ls_lkbidr_spin);
diff --git a/fs/dlm/recover.c b/fs/dlm/recover.c
index ccff1791803f..9b6428c5d7eb 100644
--- a/fs/dlm/recover.c
+++ b/fs/dlm/recover.c
@@ -315,7 +315,7 @@ static int recover_idr_add(struct dlm_rsb *r)
rv = -1;
goto out_unlock;
}
- rv = idr_alloc(&ls->ls_recover_idr, r, 1, 0, GFP_NOWAIT);
+ rv = idr_alloc_min(&ls->ls_recover_idr, r, 1, GFP_NOWAIT);
if (rv < 0)
goto out_unlock;

diff --git a/fs/erofs/super.c b/fs/erofs/super.c
index 95addc5c9d34..055619b919b1 100644
--- a/fs/erofs/super.c
+++ b/fs/erofs/super.c
@@ -307,7 +307,7 @@ static int erofs_scan_devices(struct super_block *sb,
break;
}

- err = idr_alloc(&sbi->devs->tree, dif, 0, 0, GFP_KERNEL);
+ err = idr_alloc(&sbi->devs->tree, dif, GFP_KERNEL);
if (err < 0) {
kfree(dif);
break;
@@ -550,7 +550,7 @@ static int erofs_fc_parse_param(struct fs_context *fc,
return -ENOMEM;
}
down_write(&ctx->devs->rwsem);
- ret = idr_alloc(&ctx->devs->tree, dif, 0, 0, GFP_KERNEL);
+ ret = idr_alloc(&ctx->devs->tree, dif, GFP_KERNEL);
up_write(&ctx->devs->rwsem);
if (ret < 0) {
kfree(dif->path);
diff --git a/fs/nfs/nfs4client.c b/fs/nfs/nfs4client.c
index 47a6cf892c95..0f992090e30a 100644
--- a/fs/nfs/nfs4client.c
+++ b/fs/nfs/nfs4client.c
@@ -34,7 +34,7 @@ static int nfs_get_cb_ident_idr(struct nfs_client *clp, int minorversion)
return ret;
idr_preload(GFP_KERNEL);
spin_lock(&nn->nfs_client_lock);
- ret = idr_alloc(&nn->cb_ident_idr, clp, 1, 0, GFP_NOWAIT);
+ ret = idr_alloc_min(&nn->cb_ident_idr, clp, 1, GFP_NOWAIT);
if (ret >= 0)
clp->cl_cb_ident = ret;
spin_unlock(&nn->nfs_client_lock);
diff --git a/fs/ocfs2/cluster/tcp.c b/fs/ocfs2/cluster/tcp.c
index f660c0dbdb63..462952dd3273 100644
--- a/fs/ocfs2/cluster/tcp.c
+++ b/fs/ocfs2/cluster/tcp.c
@@ -292,7 +292,7 @@ static int o2net_prep_nsw(struct o2net_node *nn, struct o2net_status_wait *nsw)
int ret;

spin_lock(&nn->nn_lock);
- ret = idr_alloc(&nn->nn_status_idr, nsw, 0, 0, GFP_ATOMIC);
+ ret = idr_alloc(&nn->nn_status_idr, nsw, GFP_ATOMIC);
if (ret >= 0) {
nsw->ns_id = ret;
list_add_tail(&nsw->ns_node_item, &nn->nn_status_list);
diff --git a/include/linux/idr.h b/include/linux/idr.h
index a0dce14090a9..57094351c521 100644
--- a/include/linux/idr.h
+++ b/include/linux/idr.h
@@ -111,7 +111,7 @@ static inline void idr_set_cursor(struct idr *idr, unsigned int val)

void idr_preload(gfp_t gfp_mask);

-int idr_alloc(struct idr *, void *ptr, int start, int end, gfp_t);
+int idr_alloc_range(struct idr *, void *ptr, int start, int end, gfp_t);
int __must_check idr_alloc_u32(struct idr *, void *ptr, u32 *id,
unsigned long max, gfp_t);
int idr_alloc_cyclic(struct idr *, void *ptr, int start, int end, gfp_t);
@@ -124,6 +124,72 @@ void *idr_get_next_ul(struct idr *, unsigned long *nextid);
void *idr_replace(struct idr *, void *, unsigned long id);
void idr_destroy(struct idr *);

+/**
+ * idr_alloc() - Allocate an ID.
+ * @idr: IDR handle.
+ * @ptr: Pointer to be associated with the new ID.
+ * @gfp: Memory allocation flags.
+ *
+ * Allocates an unused ID in the range between 0 (inclusive) and INT_MAX
+ * (inclusive).
+ *
+ * The caller should provide their own locking to ensure that two
+ * concurrent modifications to the IDR are not possible. Read-only
+ * accesses to the IDR may be done under the RCU read lock or may
+ * exclude simultaneous writers.
+ *
+ * Return: The newly allocated ID, -ENOMEM if memory allocation failed,
+ * or -ENOSPC if no free IDs could be found.
+ */
+static inline int idr_alloc(struct idr *idr, void *ptr, gfp_t gfp)
+{
+ return idr_alloc_range(idr, ptr, 0, 0, gfp);
+}
+
+/**
+ * idr_alloc_min() - Allocate an ID.
+ * @idr: IDR handle.
+ * @ptr: Pointer to be associated with the new ID.
+ * @start: The minimum ID (inclusive).
+ * @gfp: Memory allocation flags.
+ *
+ * Allocates an unused ID in the range between @start and INT_MAX (inclusive).
+ *
+ * The caller should provide their own locking to ensure that two
+ * concurrent modifications to the IDR are not possible. Read-only
+ * accesses to the IDR may be done under the RCU read lock or may
+ * exclude simultaneous writers.
+ *
+ * Return: The newly allocated ID, -ENOMEM if memory allocation failed,
+ * or -ENOSPC if no free IDs could be found.
+ */
+static inline int idr_alloc_min(struct idr *idr, void *ptr, int start, gfp_t gfp)
+{
+ return idr_alloc_range(idr, ptr, start, 0, gfp);
+}
+
+/**
+ * idr_alloc_max() - Allocate an ID.
+ * @idr: IDR handle.
+ * @ptr: Pointer to be associated with the new ID.
+ * @end: The maximum ID (exclusive)
+ * @gfp: Memory allocation flags.
+ *
+ * Allocates an unused ID in the range between 0 (inclusive) and @end.
+ *
+ * The caller should provide their own locking to ensure that two
+ * concurrent modifications to the IDR are not possible. Read-only
+ * accesses to the IDR may be done under the RCU read lock or may
+ * exclude simultaneous writers.
+ *
+ * Return: The newly allocated ID, -ENOMEM if memory allocation failed,
+ * or -ENOSPC if no free IDs could be found.
+ */
+static inline int idr_alloc_max(struct idr *idr, void *ptr, int end, gfp_t gfp)
+{
+ return idr_alloc_range(idr, ptr, 0, end, gfp);
+}
+
/**
* idr_init_base() - Initialise an IDR.
* @idr: IDR handle.
diff --git a/ipc/util.c b/ipc/util.c
index a2208d0f26b2..bdfd7c0b3796 100644
--- a/ipc/util.c
+++ b/ipc/util.c
@@ -252,8 +252,8 @@ static inline int ipc_idr_alloc(struct ipc_ids *ids, struct kern_ipc_perm *new)
}
} else {
new->seq = ipcid_to_seqx(next_id);
- idx = idr_alloc(&ids->ipcs_idr, new, ipcid_to_idx(next_id),
- 0, GFP_NOWAIT);
+ idx = idr_alloc_min(&ids->ipcs_idr, new, ipcid_to_idx(next_id),
+ GFP_NOWAIT);
}
if (idx >= 0)
new->id = (new->seq << ipcmni_seq_shift()) + idx;
diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c
index 1779ccddb734..a3d2ef7f1e91 100644
--- a/kernel/cgroup/cgroup.c
+++ b/kernel/cgroup/cgroup.c
@@ -323,7 +323,7 @@ static int cgroup_idr_alloc(struct idr *idr, void *ptr, int start, int end,

idr_preload(gfp_mask);
spin_lock_bh(&cgroup_idr_lock);
- ret = idr_alloc(idr, ptr, start, end, gfp_mask & ~__GFP_DIRECT_RECLAIM);
+ ret = idr_alloc_range(idr, ptr, start, end, gfp_mask & ~__GFP_DIRECT_RECLAIM);
spin_unlock_bh(&cgroup_idr_lock);
idr_preload_end();
return ret;
diff --git a/kernel/events/core.c b/kernel/events/core.c
index 80782cddb1da..a7fc7a8e3961 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -11065,7 +11065,7 @@ int perf_pmu_register(struct pmu *pmu, const char *name, int type)
if (type >= 0)
max = type;

- ret = idr_alloc(&pmu_idr, pmu, max, 0, GFP_KERNEL);
+ ret = idr_alloc_min(&pmu_idr, pmu, max, GFP_KERNEL);
if (ret < 0)
goto free_pdc;

diff --git a/kernel/irq/timings.c b/kernel/irq/timings.c
index c43e2ac2f8de..b14b7f2f432d 100644
--- a/kernel/irq/timings.c
+++ b/kernel/irq/timings.c
@@ -622,7 +622,7 @@ int irq_timings_alloc(int irq)
return -ENOMEM;

idr_preload(GFP_KERNEL);
- id = idr_alloc(&irqt_stats, s, irq, irq + 1, GFP_NOWAIT);
+ id = idr_alloc_range(&irqt_stats, s, irq, irq + 1, GFP_NOWAIT);
idr_preload_end();

if (id < 0) {
diff --git a/kernel/pid.c b/kernel/pid.c
index 2fc0a16ec77b..1461644c49c4 100644
--- a/kernel/pid.c
+++ b/kernel/pid.c
@@ -209,8 +209,8 @@ struct pid *alloc_pid(struct pid_namespace *ns, pid_t *set_tid,
spin_lock_irq(&pidmap_lock);

if (tid) {
- nr = idr_alloc(&tmp->idr, NULL, tid,
- tid + 1, GFP_ATOMIC);
+ nr = idr_alloc_range(&tmp->idr, NULL, tid,
+ tid + 1, GFP_ATOMIC);
/*
* If ENOSPC is returned it means that the PID is
* alreay in use. Return EEXIST in that case.
diff --git a/kernel/workqueue.c b/kernel/workqueue.c
index 1ea50f6be843..ef4ac66ce9c2 100644
--- a/kernel/workqueue.c
+++ b/kernel/workqueue.c
@@ -555,8 +555,8 @@ static int worker_pool_assign_id(struct worker_pool *pool)

lockdep_assert_held(&wq_pool_mutex);

- ret = idr_alloc(&worker_pool_idr, pool, 0, WORK_OFFQ_POOL_NONE,
- GFP_KERNEL);
+ ret = idr_alloc_max(&worker_pool_idr, pool, WORK_OFFQ_POOL_NONE,
+ GFP_KERNEL);
if (ret >= 0) {
pool->id = ret;
return 0;
diff --git a/lib/idr.c b/lib/idr.c
index f4ab4f4aa3c7..e179bf643c9e 100644
--- a/lib/idr.c
+++ b/lib/idr.c
@@ -57,7 +57,7 @@ int idr_alloc_u32(struct idr *idr, void *ptr, u32 *nextid,
EXPORT_SYMBOL_GPL(idr_alloc_u32);

/**
- * idr_alloc() - Allocate an ID.
+ * idr_alloc_range() - Allocate an ID.
* @idr: IDR handle.
* @ptr: Pointer to be associated with the new ID.
* @start: The minimum ID (inclusive).
@@ -76,7 +76,7 @@ EXPORT_SYMBOL_GPL(idr_alloc_u32);
* Return: The newly allocated ID, -ENOMEM if memory allocation failed,
* or -ENOSPC if no free IDs could be found.
*/
-int idr_alloc(struct idr *idr, void *ptr, int start, int end, gfp_t gfp)
+int idr_alloc_range(struct idr *idr, void *ptr, int start, int end, gfp_t gfp)
{
u32 id = start;
int ret;
@@ -90,7 +90,7 @@ int idr_alloc(struct idr *idr, void *ptr, int start, int end, gfp_t gfp)

return id;
}
-EXPORT_SYMBOL_GPL(idr_alloc);
+EXPORT_SYMBOL_GPL(idr_alloc_range);

/**
* idr_alloc_cyclic() - Allocate an ID cyclically.
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 618c366a2f07..aa9cb41a8f75 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -5120,8 +5120,8 @@ static struct mem_cgroup *mem_cgroup_alloc(void)
if (!memcg)
return ERR_PTR(error);

- memcg->id.id = idr_alloc(&mem_cgroup_idr, NULL,
- 1, MEM_CGROUP_ID_MAX + 1, GFP_KERNEL);
+ memcg->id.id = idr_alloc_range(&mem_cgroup_idr, NULL,
+ 1, MEM_CGROUP_ID_MAX + 1, GFP_KERNEL);
if (memcg->id.id < 0) {
error = memcg->id.id;
goto fail;
diff --git a/mm/vmscan.c b/mm/vmscan.c
index f7d9a683e3a7..6a2b42a88e9b 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -360,7 +360,7 @@ static int prealloc_memcg_shrinker(struct shrinker *shrinker)

down_write(&shrinker_rwsem);
/* This may call shrinker, so it must use down_read_trylock() */
- id = idr_alloc(&shrinker_idr, shrinker, 0, 0, GFP_KERNEL);
+ id = idr_alloc(&shrinker_idr, shrinker, GFP_KERNEL);
if (id < 0)
goto unlock;

diff --git a/net/9p/client.c b/net/9p/client.c
index 8bba0d9cf975..9a60af6324b3 100644
--- a/net/9p/client.c
+++ b/net/9p/client.c
@@ -285,10 +285,10 @@ p9_tag_alloc(struct p9_client *c, int8_t type, unsigned int max_size)
idr_preload(GFP_NOFS);
spin_lock_irq(&c->lock);
if (type == P9_TVERSION)
- tag = idr_alloc(&c->reqs, req, P9_NOTAG, P9_NOTAG + 1,
- GFP_NOWAIT);
+ tag = idr_alloc_range(&c->reqs, req, P9_NOTAG, P9_NOTAG + 1,
+ GFP_NOWAIT);
else
- tag = idr_alloc(&c->reqs, req, 0, P9_NOTAG, GFP_NOWAIT);
+ tag = idr_alloc_max(&c->reqs, req, P9_NOTAG, GFP_NOWAIT);
req->tc.tag = tag;
spin_unlock_irq(&c->lock);
idr_preload_end();
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index 59a5c1341c26..e4eb3d4b0728 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -1902,8 +1902,8 @@ bool hci_add_adv_monitor(struct hci_dev *hdev, struct adv_monitor *monitor,

min = HCI_MIN_ADV_MONITOR_HANDLE;
max = HCI_MIN_ADV_MONITOR_HANDLE + HCI_MAX_ADV_MONITOR_NUM_HANDLES;
- handle = idr_alloc(&hdev->adv_monitors_idr, monitor, min, max,
- GFP_KERNEL);
+ handle = idr_alloc_range(&hdev->adv_monitors_idr, monitor, min, max,
+ GFP_KERNEL);
if (handle < 0) {
*err = handle;
return false;
diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c
index 0ec2f5906a27..604232a4f2c1 100644
--- a/net/core/net_namespace.c
+++ b/net/core/net_namespace.c
@@ -187,7 +187,7 @@ static int alloc_netid(struct net *net, struct net *peer, int reqid)
max = reqid + 1;
}

- return idr_alloc(&net->netns_ids, peer, min, max, GFP_ATOMIC);
+ return idr_alloc_range(&net->netns_ids, peer, min, max, GFP_ATOMIC);
}

/* This function is used by idr_for_each(). If net is equal to peer, the
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index f7896f257e1b..841c7877058b 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -325,9 +325,9 @@ static int ieee80211_add_nan_func(struct wiphy *wiphy,

spin_lock_bh(&sdata->u.nan.func_lock);

- ret = idr_alloc(&sdata->u.nan.function_inst_ids,
- nan_func, 1, sdata->local->hw.max_nan_de_entries + 1,
- GFP_ATOMIC);
+ ret = idr_alloc_range(&sdata->u.nan.function_inst_ids,
+ nan_func, 1, sdata->local->hw.max_nan_de_entries + 1,
+ GFP_ATOMIC);
spin_unlock_bh(&sdata->u.nan.func_lock);

if (ret < 0)
@@ -3732,8 +3732,8 @@ int ieee80211_attach_ack_skb(struct ieee80211_local *local, struct sk_buff *skb,
return -ENOMEM;

spin_lock_irqsave(&local->ack_status_lock, spin_flags);
- id = idr_alloc(&local->ack_status_frames, ack_skb,
- 1, 0x2000, GFP_ATOMIC);
+ id = idr_alloc_range(&local->ack_status_frames, ack_skb,
+ 1, 0x2000, GFP_ATOMIC);
spin_unlock_irqrestore(&local->ack_status_lock, spin_flags);

if (id < 0) {
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
index 0e4efc08c762..675bf6291e4d 100644
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
@@ -2509,8 +2509,8 @@ static u16 ieee80211_store_ack_skb(struct ieee80211_local *local,
int id;

spin_lock_irqsave(&local->ack_status_lock, flags);
- id = idr_alloc(&local->ack_status_frames, ack_skb,
- 1, 0x2000, GFP_ATOMIC);
+ id = idr_alloc_range(&local->ack_status_frames, ack_skb,
+ 1, 0x2000, GFP_ATOMIC);
spin_unlock_irqrestore(&local->ack_status_lock, flags);

if (id >= 0) {
diff --git a/net/tipc/topsrv.c b/net/tipc/topsrv.c
index 5522865deae9..8edb25a456ee 100644
--- a/net/tipc/topsrv.c
+++ b/net/tipc/topsrv.c
@@ -194,7 +194,7 @@ static struct tipc_conn *tipc_conn_alloc(struct tipc_topsrv *s)
INIT_WORK(&con->rwork, tipc_conn_recv_work);

spin_lock_bh(&s->idr_lock);
- ret = idr_alloc(&s->conn_idr, con, 0, 0, GFP_ATOMIC);
+ ret = idr_alloc(&s->conn_idr, con, GFP_ATOMIC);
if (ret < 0) {
kfree(con);
spin_unlock_bh(&s->idr_lock);
diff --git a/security/apparmor/secid.c b/security/apparmor/secid.c
index ce545f99259e..d2fca8aff08a 100644
--- a/security/apparmor/secid.c
+++ b/security/apparmor/secid.c
@@ -128,7 +128,7 @@ int aa_alloc_secid(struct aa_label *label, gfp_t gfp)

idr_preload(gfp);
spin_lock_irqsave(&secid_lock, flags);
- ret = idr_alloc(&aa_secids, label, AA_FIRST_SECID, 0, GFP_ATOMIC);
+ ret = idr_alloc_min(&aa_secids, label, AA_FIRST_SECID, GFP_ATOMIC);
spin_unlock_irqrestore(&secid_lock, flags);
idr_preload_end();

diff --git a/sound/ac97/bus.c b/sound/ac97/bus.c
index 0d31a6d71468..04f37db167a3 100644
--- a/sound/ac97/bus.c
+++ b/sound/ac97/bus.c
@@ -313,7 +313,7 @@ static int ac97_add_adapter(struct ac97_controller *ac97_ctrl)
int ret;

mutex_lock(&ac97_controllers_mutex);
- ret = idr_alloc(&ac97_adapter_idr, ac97_ctrl, 0, 0, GFP_KERNEL);
+ ret = idr_alloc(&ac97_adapter_idr, ac97_ctrl, GFP_KERNEL);
ac97_ctrl->nr = ret;
if (ret >= 0) {
dev_set_name(&ac97_ctrl->adap, "ac97-%d", ret);
diff --git a/sound/soc/qcom/qdsp6/q6apm.c b/sound/soc/qcom/qdsp6/q6apm.c
index f424d7aa389a..18c7fc0f25c4 100644
--- a/sound/soc/qcom/qdsp6/q6apm.c
+++ b/sound/soc/qcom/qdsp6/q6apm.c
@@ -72,7 +72,7 @@ static struct audioreach_graph *q6apm_get_audioreach_graph(struct q6apm *apm, ui
}

mutex_lock(&apm->lock);
- id = idr_alloc(&apm->graph_idr, graph, graph_id, graph_id + 1, GFP_KERNEL);
+ id = idr_alloc_range(&apm->graph_idr, graph, graph_id, graph_id + 1, GFP_KERNEL);
if (id < 0) {
dev_err(apm->dev, "Unable to allocate graph id (%d)\n", graph_id);
kfree(graph);
diff --git a/sound/soc/qcom/qdsp6/topology.c b/sound/soc/qcom/qdsp6/topology.c
index bd649c232a06..af6092d51ba5 100644
--- a/sound/soc/qcom/qdsp6/topology.c
+++ b/sound/soc/qcom/qdsp6/topology.c
@@ -44,7 +44,7 @@ static struct audioreach_graph_info *audioreach_tplg_alloc_graph_info(struct q6a
INIT_LIST_HEAD(&info->sg_list);

mutex_lock(&apm->lock);
- ret = idr_alloc(&apm->graph_info_idr, info, graph_id, graph_id + 1, GFP_KERNEL);
+ ret = idr_alloc_range(&apm->graph_info_idr, info, graph_id, graph_id + 1, GFP_KERNEL);
mutex_unlock(&apm->lock);

if (ret < 0) {
@@ -94,7 +94,7 @@ static struct audioreach_sub_graph *audioreach_tplg_alloc_sub_graph(struct q6apm
INIT_LIST_HEAD(&sg->container_list);

mutex_lock(&apm->lock);
- ret = idr_alloc(&apm->sub_graphs_idr, sg, sub_graph_id, sub_graph_id + 1, GFP_KERNEL);
+ ret = idr_alloc_range(&apm->sub_graphs_idr, sg, sub_graph_id, sub_graph_id + 1, GFP_KERNEL);
mutex_unlock(&apm->lock);

if (ret < 0) {
@@ -136,7 +136,8 @@ static struct audioreach_container *audioreach_tplg_alloc_container(struct q6apm
INIT_LIST_HEAD(&cont->modules_list);

mutex_lock(&apm->lock);
- ret = idr_alloc(&apm->containers_idr, cont, container_id, container_id + 1, GFP_KERNEL);
+ ret = idr_alloc_range(&apm->containers_idr, cont, container_id, container_id + 1,
+ GFP_KERNEL);
mutex_unlock(&apm->lock);

if (ret < 0) {
@@ -181,7 +182,7 @@ static struct audioreach_module *audioreach_tplg_alloc_module(struct q6apm *apm,
AR_MODULE_DYNAMIC_INSTANCE_ID_START,
AR_MODULE_DYNAMIC_INSTANCE_ID_END, GFP_KERNEL);
} else {
- ret = idr_alloc(&apm->modules_idr, mod, module_id, module_id + 1, GFP_KERNEL);
+ ret = idr_alloc_range(&apm->modules_idr, mod, module_id, module_id + 1, GFP_KERNEL);
}
mutex_unlock(&apm->lock);

diff --git a/tools/testing/radix-tree/idr-test.c b/tools/testing/radix-tree/idr-test.c
index ca24f6839d50..2a17430c7357 100644
--- a/tools/testing/radix-tree/idr-test.c
+++ b/tools/testing/radix-tree/idr-test.c
@@ -61,7 +61,7 @@ void idr_replace_test(void)
{
DEFINE_IDR(idr);

- idr_alloc(&idr, (void *)-1, 10, 11, GFP_KERNEL);
+ idr_alloc_range(&idr, (void *)-1, 10, 11, GFP_KERNEL);
idr_replace(&idr, &idr, 10);

idr_destroy(&idr);
@@ -80,18 +80,18 @@ void idr_null_test(void)

assert(idr_is_empty(&idr));

- assert(idr_alloc(&idr, NULL, 0, 0, GFP_KERNEL) == 0);
+ assert(idr_alloc(&idr, NULL, GFP_KERNEL) == 0);
assert(!idr_is_empty(&idr));
idr_remove(&idr, 0);
assert(idr_is_empty(&idr));

- assert(idr_alloc(&idr, NULL, 0, 0, GFP_KERNEL) == 0);
+ assert(idr_alloc(&idr, NULL, GFP_KERNEL) == 0);
assert(!idr_is_empty(&idr));
idr_destroy(&idr);
assert(idr_is_empty(&idr));

for (i = 0; i < 10; i++) {
- assert(idr_alloc(&idr, NULL, 0, 0, GFP_KERNEL) == i);
+ assert(idr_alloc(&idr, NULL, GFP_KERNEL) == i);
}

assert(idr_replace(&idr, DUMMY_PTR, 3) == NULL);
@@ -99,7 +99,7 @@ void idr_null_test(void)
assert(idr_replace(&idr, NULL, 4) == DUMMY_PTR);
assert(idr_replace(&idr, DUMMY_PTR, 11) == ERR_PTR(-ENOENT));
idr_remove(&idr, 5);
- assert(idr_alloc(&idr, NULL, 0, 0, GFP_KERNEL) == 5);
+ assert(idr_alloc(&idr, NULL, GFP_KERNEL) == 5);
idr_remove(&idr, 5);

for (i = 0; i < 9; i++) {
@@ -111,7 +111,7 @@ void idr_null_test(void)
idr_remove(&idr, 9);
assert(idr_is_empty(&idr));

- assert(idr_alloc(&idr, NULL, 0, 0, GFP_KERNEL) == 0);
+ assert(idr_alloc(&idr, NULL, GFP_KERNEL) == 0);
assert(idr_replace(&idr, DUMMY_PTR, 3) == ERR_PTR(-ENOENT));
assert(idr_replace(&idr, DUMMY_PTR, 0) == NULL);
assert(idr_replace(&idr, NULL, 0) == DUMMY_PTR);
@@ -120,7 +120,7 @@ void idr_null_test(void)
assert(idr_is_empty(&idr));

for (i = 1; i < 10; i++) {
- assert(idr_alloc(&idr, NULL, 1, 0, GFP_KERNEL) == i);
+ assert(idr_alloc_min(&idr, NULL, 1, GFP_KERNEL) == i);
}

idr_destroy(&idr);
@@ -136,7 +136,7 @@ void idr_nowait_test(void)

for (i = 0; i < 3; i++) {
struct item *item = item_create(i, 0);
- assert(idr_alloc(&idr, item, i, i + 1, GFP_NOWAIT) == i);
+ assert(idr_alloc_range(&idr, item, i, i + 1, GFP_NOWAIT) == i);
}

idr_preload_end();
@@ -156,7 +156,7 @@ void idr_get_next_test(int base)

for(i = 0; indices[i]; i++) {
struct item *item = item_create(indices[i], 0);
- assert(idr_alloc(&idr, item, indices[i], indices[i+1],
+ assert(idr_alloc_range(&idr, item, indices[i], indices[i+1],
GFP_KERNEL) == indices[i]);
}

@@ -226,32 +226,32 @@ static void idr_align_test(struct idr *idr)
void *entry;

for (i = 0; i < 9; i++) {
- BUG_ON(idr_alloc(idr, &name[i], 0, 0, GFP_KERNEL) != i);
+ BUG_ON(idr_alloc(idr, &name[i], GFP_KERNEL) != i);
idr_for_each_entry(idr, entry, id);
}
idr_destroy(idr);

for (i = 1; i < 10; i++) {
- BUG_ON(idr_alloc(idr, &name[i], 0, 0, GFP_KERNEL) != i - 1);
+ BUG_ON(idr_alloc(idr, &name[i], GFP_KERNEL) != i - 1);
idr_for_each_entry(idr, entry, id);
}
idr_destroy(idr);

for (i = 2; i < 11; i++) {
- BUG_ON(idr_alloc(idr, &name[i], 0, 0, GFP_KERNEL) != i - 2);
+ BUG_ON(idr_alloc(idr, &name[i], GFP_KERNEL) != i - 2);
idr_for_each_entry(idr, entry, id);
}
idr_destroy(idr);

for (i = 3; i < 12; i++) {
- BUG_ON(idr_alloc(idr, &name[i], 0, 0, GFP_KERNEL) != i - 3);
+ BUG_ON(idr_alloc(idr, &name[i], GFP_KERNEL) != i - 3);
idr_for_each_entry(idr, entry, id);
}
idr_destroy(idr);

for (i = 0; i < 8; i++) {
- BUG_ON(idr_alloc(idr, &name[i], 0, 0, GFP_KERNEL) != 0);
- BUG_ON(idr_alloc(idr, &name[i + 1], 0, 0, GFP_KERNEL) != 1);
+ BUG_ON(idr_alloc(idr, &name[i], GFP_KERNEL) != 0);
+ BUG_ON(idr_alloc_range(idr, &name[i + 1], 0, 0, GFP_KERNEL) != 1);
idr_for_each_entry(idr, entry, id);
idr_remove(idr, 1);
idr_for_each_entry(idr, entry, id);
@@ -260,7 +260,7 @@ static void idr_align_test(struct idr *idr)
}

for (i = 0; i < 8; i++) {
- BUG_ON(idr_alloc(idr, NULL, 0, 0, GFP_KERNEL) != 0);
+ BUG_ON(idr_alloc(idr, NULL, GFP_KERNEL) != 0);
idr_for_each_entry(idr, entry, id);
idr_replace(idr, &name[i], 0);
idr_for_each_entry(idr, entry, id);
@@ -269,8 +269,8 @@ static void idr_align_test(struct idr *idr)
}

for (i = 0; i < 8; i++) {
- BUG_ON(idr_alloc(idr, &name[i], 0, 0, GFP_KERNEL) != 0);
- BUG_ON(idr_alloc(idr, NULL, 0, 0, GFP_KERNEL) != 1);
+ BUG_ON(idr_alloc(idr, &name[i], GFP_KERNEL) != 0);
+ BUG_ON(idr_alloc(idr, NULL, GFP_KERNEL) != 1);
idr_remove(idr, 1);
idr_for_each_entry(idr, entry, id);
idr_replace(idr, &name[i + 1], 0);
@@ -288,7 +288,7 @@ static void *idr_throbber(void *arg)

rcu_register_thread();
do {
- idr_alloc(&find_idr, xa_mk_value(id), id, id + 1, GFP_KERNEL);
+ idr_alloc_range(&find_idr, xa_mk_value(id), id, id + 1, GFP_KERNEL);
idr_remove(&find_idr, id);
} while (time(NULL) < start + 10);
rcu_unregister_thread();
@@ -305,7 +305,7 @@ void idr_find_test_1(int anchor_id, int throbber_id)
pthread_t throbber;
time_t start = time(NULL);

- BUG_ON(idr_alloc(&find_idr, xa_mk_value(anchor_id), anchor_id,
+ BUG_ON(idr_alloc_range(&find_idr, xa_mk_value(anchor_id), anchor_id,
anchor_id + 1, GFP_KERNEL) != anchor_id);

pthread_create(&throbber, NULL, idr_throbber, &throbber_id);
@@ -344,10 +344,10 @@ void idr_checks(void)

for (i = 0; i < 10000; i++) {
struct item *item = item_create(i, 0);
- assert(idr_alloc(&idr, item, 0, 20000, GFP_KERNEL) == i);
+ assert(idr_alloc_max(&idr, item, 20000, GFP_KERNEL) == i);
}

- assert(idr_alloc(&idr, DUMMY_PTR, 5, 30, GFP_KERNEL) < 0);
+ assert(idr_alloc_range(&idr, DUMMY_PTR, 5, 30, GFP_KERNEL) < 0);

for (i = 0; i < 5000; i++)
item_idr_remove(&idr, i);
@@ -362,19 +362,19 @@ void idr_checks(void)
idr_remove(&idr, 3);
idr_remove(&idr, 0);

- assert(idr_alloc(&idr, DUMMY_PTR, 0, 0, GFP_KERNEL) == 0);
+ assert(idr_alloc(&idr, DUMMY_PTR, GFP_KERNEL) == 0);
idr_remove(&idr, 1);
for (i = 1; i < RADIX_TREE_MAP_SIZE; i++)
- assert(idr_alloc(&idr, DUMMY_PTR, 0, 0, GFP_KERNEL) == i);
+ assert(idr_alloc(&idr, DUMMY_PTR, GFP_KERNEL) == i);
idr_remove(&idr, 1 << 30);
idr_destroy(&idr);

for (i = INT_MAX - 3UL; i < INT_MAX + 1UL; i++) {
struct item *item = item_create(i, 0);
- assert(idr_alloc(&idr, item, i, i + 10, GFP_KERNEL) == i);
+ assert(idr_alloc_range(&idr, item, i, i + 10, GFP_KERNEL) == i);
}
- assert(idr_alloc(&idr, DUMMY_PTR, i - 2, i, GFP_KERNEL) == -ENOSPC);
- assert(idr_alloc(&idr, DUMMY_PTR, i - 2, i + 10, GFP_KERNEL) == -ENOSPC);
+ assert(idr_alloc_range(&idr, DUMMY_PTR, i - 2, i, GFP_KERNEL) == -ENOSPC);
+ assert(idr_alloc_range(&idr, DUMMY_PTR, i - 2, i + 10, GFP_KERNEL) == -ENOSPC);

idr_for_each(&idr, item_idr_free, &idr);
idr_destroy(&idr);
@@ -401,7 +401,7 @@ void idr_checks(void)

for (i = 1; i < 10000; i++) {
struct item *item = item_create(i, 0);
- assert(idr_alloc(&idr, item, 1, 20000, GFP_KERNEL) == i);
+ assert(idr_alloc_range(&idr, item, 1, 20000, GFP_KERNEL) == i);
}

idr_for_each(&idr, item_idr_free, &idr);
--
2.36.1