void hfi1_vnic_setup(struct hfi1_devdata *dd)
 {
-       idr_init(&dd->vnic.vesw_idr);
+       xa_init(&dd->vnic.vesws);
 }
 
 void hfi1_vnic_cleanup(struct hfi1_devdata *dd)
 {
-       idr_destroy(&dd->vnic.vesw_idr);
+       WARN_ON(!xa_empty(&dd->vnic.vesws));
 }
 
 #define SUM_GRP_COUNTERS(stats, qstats, x_grp) do {            \
        l4_type = hfi1_16B_get_l4(packet->ebuf);
        if (likely(l4_type == OPA_16B_L4_ETHR)) {
                vesw_id = HFI1_VNIC_GET_VESWID(packet->ebuf);
-               vinfo = idr_find(&dd->vnic.vesw_idr, vesw_id);
+               vinfo = xa_load(&dd->vnic.vesws, vesw_id);
 
                /*
                 * In case of invalid vesw id, count the error on
                 */
                if (unlikely(!vinfo)) {
                        struct hfi1_vnic_vport_info *vinfo_tmp;
-                       int id_tmp = 0;
+                       unsigned long index = 0;
 
-                       vinfo_tmp =  idr_get_next(&dd->vnic.vesw_idr, &id_tmp);
+                       vinfo_tmp = xa_find(&dd->vnic.vesws, &index, ULONG_MAX,
+                                       XA_PRESENT);
                        if (vinfo_tmp) {
                                spin_lock(&vport_cntr_lock);
                                vinfo_tmp->stats[0].netstats.rx_nohandler++;
        if (!vinfo->vesw_id)
                return -EINVAL;
 
-       rc = idr_alloc(&dd->vnic.vesw_idr, vinfo, vinfo->vesw_id,
-                      vinfo->vesw_id + 1, GFP_NOWAIT);
+       rc = xa_insert(&dd->vnic.vesws, vinfo->vesw_id, vinfo, GFP_KERNEL);
        if (rc < 0)
                return rc;
 
        clear_bit(HFI1_VNIC_UP, &vinfo->flags);
        netif_carrier_off(vinfo->netdev);
        netif_tx_disable(vinfo->netdev);
-       idr_remove(&dd->vnic.vesw_idr, vinfo->vesw_id);
+       xa_erase(&dd->vnic.vesws, vinfo->vesw_id);
 
        /* ensure irqs see the change */
        msix_vnic_synchronize_irq(dd);