Re: [PATCH 01/15] KVM: arm64: vgic: Store LPIs in an xarray

Dan Carpenter
2024-02-05T06:05:06Z

Hi Oliver,

kernel test robot noticed the following build warnings:

url: https://github.com/intel-lab-lkp/linux/commits/Oliver-Upton/KVM-arm64-vgic-Store-LPIs-in-an-xarray/20240125-045255
base: 6613476e225e090cc9aad49be7fa504e290dd33d
patch link: https://lore.kernel.org/r/20240124204909.105952-2-oliver.upton%40linux.dev
patch subject: [PATCH 01/15] KVM: arm64: vgic: Store LPIs in an xarray
config: arm64-randconfig-r081-20240129 (https://download.01.org/0day-ci/archive/20240204/202402041412.mZlOxFFw-lkp@intel.com/config)
compiler: clang version 19.0.0git (https://github.com/llvm/llvm-project 4a39d08908942b2d415db405844cbe4af73e75d4)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
| Closes: https://lore.kernel.org/r/202402041412.mZlOxFFw-lkp@intel.com/

New smatch warnings:
arch/arm64/kvm/vgic/vgic-its.c:128 vgic_add_lpi() warn: inconsistent returns '&dist->lpi_list_lock'.
arch/arm64/kvm/vgic/vgic-its.c:128 vgic_add_lpi() warn: inconsistent returns 'flags'.

Old smatch warnings:
arch/arm64/kvm/vgic/vgic-its.c:324 update_lpi_config() warn: inconsistent returns '&irq->irq_lock'.
arch/arm64/kvm/vgic/vgic-its.c:324 update_lpi_config() warn: inconsistent returns 'flags'.

vim +128 arch/arm64/kvm/vgic/vgic-its.c

06bd5359549d7a virt/kvm/arm/vgic/vgic-its.c Eric Auger 2017-05-04 39 static struct vgic_irq *vgic_add_lpi(struct kvm *kvm, u32 intid,
06bd5359549d7a virt/kvm/arm/vgic/vgic-its.c Eric Auger 2017-05-04 40 struct kvm_vcpu *vcpu)
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 41 {
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 42 struct vgic_dist *dist = &kvm->arch.vgic;
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 43 struct vgic_irq *irq = vgic_get_irq(kvm, NULL, intid), *oldirq;
388d4359680b56 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2018-05-11 44 unsigned long flags;
06bd5359549d7a virt/kvm/arm/vgic/vgic-its.c Eric Auger 2017-05-04 45 int ret;
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 46
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 47 /* In this case there is no put, since we keep the reference. */
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 48 if (irq)
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 49 return irq;
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 50
3ef231670b9e90 arch/arm64/kvm/vgic/vgic-its.c Jia He 2021-09-07 51 irq = kzalloc(sizeof(struct vgic_irq), GFP_KERNEL_ACCOUNT);
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 52 if (!irq)
99e5e886a0a59d virt/kvm/arm/vgic/vgic-its.c Christoffer Dall 2016-08-01 53 return ERR_PTR(-ENOMEM);
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 54
3e55a25b7db23f arch/arm64/kvm/vgic/vgic-its.c Oliver Upton 2024-01-24 55 ret = xa_reserve_irq(&dist->lpi_xa, intid, GFP_KERNEL_ACCOUNT);
3e55a25b7db23f arch/arm64/kvm/vgic/vgic-its.c Oliver Upton 2024-01-24 56 if (ret) {
3e55a25b7db23f arch/arm64/kvm/vgic/vgic-its.c Oliver Upton 2024-01-24 57 kfree(irq);
3e55a25b7db23f arch/arm64/kvm/vgic/vgic-its.c Oliver Upton 2024-01-24 58 return ERR_PTR(ret);
3e55a25b7db23f arch/arm64/kvm/vgic/vgic-its.c Oliver Upton 2024-01-24 59 }
3e55a25b7db23f arch/arm64/kvm/vgic/vgic-its.c Oliver Upton 2024-01-24 60
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 61 INIT_LIST_HEAD(&irq->lpi_list);
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 62 INIT_LIST_HEAD(&irq->ap_list);
8fa3adb8c6beee virt/kvm/arm/vgic/vgic-its.c Julien Thierry 2019-01-07 63 raw_spin_lock_init(&irq->irq_lock);
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 64
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 65 irq->config = VGIC_CONFIG_EDGE;
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 66 kref_init(&irq->refcount);
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 67 irq->intid = intid;
06bd5359549d7a virt/kvm/arm/vgic/vgic-its.c Eric Auger 2017-05-04 68 irq->target_vcpu = vcpu;
8df3c8f33f46ad virt/kvm/arm/vgic/vgic-its.c Christoffer Dall 2018-07-16 69 irq->group = 1;
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 70
fc3bc475231e12 virt/kvm/arm/vgic/vgic-its.c Julien Thierry 2019-01-07 71 raw_spin_lock_irqsave(&dist->lpi_list_lock, flags);
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 72
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 73 /*
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 74 * There could be a race with another vgic_add_lpi(), so we need to
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 75 * check that we don't add a second list entry with the same LPI.
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 76 */
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 77 list_for_each_entry(oldirq, &dist->lpi_list_head, lpi_list) {
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 78 if (oldirq->intid != intid)
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 79 continue;
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 80
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 81 /* Someone was faster with adding this LPI, lets use that. */
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 82 kfree(irq);
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 83 irq = oldirq;
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 84
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 85 /*
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 86 * This increases the refcount, the caller is expected to
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 87 * call vgic_put_irq() on the returned pointer once it's
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 88 * finished with the IRQ.
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 89 */
d97594e6bc1b4a virt/kvm/arm/vgic/vgic-its.c Marc Zyngier 2016-07-17 90 vgic_get_irq_kref(irq);
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 91
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 92 goto out_unlock;
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 93 }
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 94
3e55a25b7db23f arch/arm64/kvm/vgic/vgic-its.c Oliver Upton 2024-01-24 95 ret = xa_err(xa_store(&dist->lpi_xa, intid, irq, 0));
3e55a25b7db23f arch/arm64/kvm/vgic/vgic-its.c Oliver Upton 2024-01-24 96 if (ret) {
3e55a25b7db23f arch/arm64/kvm/vgic/vgic-its.c Oliver Upton 2024-01-24 97 xa_release(&dist->lpi_xa, intid);
3e55a25b7db23f arch/arm64/kvm/vgic/vgic-its.c Oliver Upton 2024-01-24 98 kfree(irq);
3e55a25b7db23f arch/arm64/kvm/vgic/vgic-its.c Oliver Upton 2024-01-24 99 return ERR_PTR(ret);

should be goto out_unlock or something

3e55a25b7db23f arch/arm64/kvm/vgic/vgic-its.c Oliver Upton 2024-01-24 100 }
3e55a25b7db23f arch/arm64/kvm/vgic/vgic-its.c Oliver Upton 2024-01-24 101
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 102 list_add_tail(&irq->lpi_list, &dist->lpi_list_head);
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 103 dist->lpi_list_count++;
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 104
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 105 out_unlock:
fc3bc475231e12 virt/kvm/arm/vgic/vgic-its.c Julien Thierry 2019-01-07 106 raw_spin_unlock_irqrestore(&dist->lpi_list_lock, flags);
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 107
06bd5359549d7a virt/kvm/arm/vgic/vgic-its.c Eric Auger 2017-05-04 108 /*
06bd5359549d7a virt/kvm/arm/vgic/vgic-its.c Eric Auger 2017-05-04 109 * We "cache" the configuration table entries in our struct vgic_irq's.
06bd5359549d7a virt/kvm/arm/vgic/vgic-its.c Eric Auger 2017-05-04 110 * However we only have those structs for mapped IRQs, so we read in
06bd5359549d7a virt/kvm/arm/vgic/vgic-its.c Eric Auger 2017-05-04 111 * the respective config data from memory here upon mapping the LPI.
57bdb436ce869a virt/kvm/arm/vgic/vgic-its.c Zenghui Yu 2020-04-14 112 *
57bdb436ce869a virt/kvm/arm/vgic/vgic-its.c Zenghui Yu 2020-04-14 113 * Should any of these fail, behave as if we couldn't create the LPI
57bdb436ce869a virt/kvm/arm/vgic/vgic-its.c Zenghui Yu 2020-04-14 114 * by dropping the refcount and returning the error.
06bd5359549d7a virt/kvm/arm/vgic/vgic-its.c Eric Auger 2017-05-04 115 */
6ce18e3a5f3308 virt/kvm/arm/vgic/vgic-its.c Marc Zyngier 2017-10-27 116 ret = update_lpi_config(kvm, irq, NULL, false);
57bdb436ce869a virt/kvm/arm/vgic/vgic-its.c Zenghui Yu 2020-04-14 117 if (ret) {
57bdb436ce869a virt/kvm/arm/vgic/vgic-its.c Zenghui Yu 2020-04-14 118 vgic_put_irq(kvm, irq);
06bd5359549d7a virt/kvm/arm/vgic/vgic-its.c Eric Auger 2017-05-04 119 return ERR_PTR(ret);
57bdb436ce869a virt/kvm/arm/vgic/vgic-its.c Zenghui Yu 2020-04-14 120 }
06bd5359549d7a virt/kvm/arm/vgic/vgic-its.c Eric Auger 2017-05-04 121
06bd5359549d7a virt/kvm/arm/vgic/vgic-its.c Eric Auger 2017-05-04 122 ret = vgic_v3_lpi_sync_pending_status(kvm, irq);
57bdb436ce869a virt/kvm/arm/vgic/vgic-its.c Zenghui Yu 2020-04-14 123 if (ret) {
57bdb436ce869a virt/kvm/arm/vgic/vgic-its.c Zenghui Yu 2020-04-14 124 vgic_put_irq(kvm, irq);
06bd5359549d7a virt/kvm/arm/vgic/vgic-its.c Eric Auger 2017-05-04 125 return ERR_PTR(ret);
57bdb436ce869a virt/kvm/arm/vgic/vgic-its.c Zenghui Yu 2020-04-14 126 }
06bd5359549d7a virt/kvm/arm/vgic/vgic-its.c Eric Auger 2017-05-04 127
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 @128 return irq;
df9f58fbea9bc6 virt/kvm/arm/vgic/vgic-its.c Andre Przywara 2016-07-15 129 }

--
0-DAY CI Kernel Test Service