Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

crypto: qat - free irq in case of failure

If devm_request_irq() fails inside adf_request_irqs(), unwind properly by
freeing the allocated irqs.

Signed-off-by: Wojciech Ziemba <wojciech.ziemba@intel.com>
Co-developed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Signed-off-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

authored by

Wojciech Ziemba and committed by
Herbert Xu
70fead3a 9832fdc9

+34 -29
+34 -29
drivers/crypto/qat/qat_common/adf_isr.c
··· 126 126 return IRQ_NONE; 127 127 } 128 128 129 + static void adf_free_irqs(struct adf_accel_dev *accel_dev) 130 + { 131 + struct adf_accel_pci *pci_dev_info = &accel_dev->accel_pci_dev; 132 + struct adf_hw_device_data *hw_data = accel_dev->hw_device; 133 + struct adf_irq *irqs = pci_dev_info->msix_entries.irqs; 134 + struct adf_etr_data *etr_data = accel_dev->transport; 135 + int clust_irq = hw_data->num_banks; 136 + int irq, i = 0; 137 + 138 + if (pci_dev_info->msix_entries.num_entries > 1) { 139 + for (i = 0; i < hw_data->num_banks; i++) { 140 + if (irqs[i].enabled) { 141 + irq = pci_irq_vector(pci_dev_info->pci_dev, i); 142 + irq_set_affinity_hint(irq, NULL); 143 + free_irq(irq, &etr_data->banks[i]); 144 + } 145 + } 146 + } 147 + 148 + if (irqs[i].enabled) { 149 + irq = pci_irq_vector(pci_dev_info->pci_dev, clust_irq); 150 + free_irq(irq, accel_dev); 151 + } 152 + } 153 + 129 154 static int adf_request_irqs(struct adf_accel_dev *accel_dev) 130 155 { 131 156 struct adf_accel_pci *pci_dev_info = &accel_dev->accel_pci_dev; ··· 175 150 dev_err(&GET_DEV(accel_dev), 176 151 "Failed to get IRQ number of device vector %d - %s\n", 177 152 i, name); 178 - return irq; 153 + ret = irq; 154 + goto err; 179 155 } 180 156 ret = request_irq(irq, adf_msix_isr_bundle, 0, 181 157 &name[0], bank); ··· 184 158 dev_err(&GET_DEV(accel_dev), 185 159 "Failed to allocate IRQ %d for %s\n", 186 160 irq, name); 187 - return ret; 161 + goto err; 188 162 } 189 163 190 164 cpu = ((accel_dev->accel_id * hw_data->num_banks) + ··· 203 177 dev_err(&GET_DEV(accel_dev), 204 178 "Failed to get IRQ number of device vector %d - %s\n", 205 179 i, name); 206 - return irq; 180 + ret = irq; 181 + goto err; 207 182 } 208 183 ret = request_irq(irq, adf_msix_isr_ae, 0, &name[0], accel_dev); 209 184 if (ret) { 210 185 dev_err(&GET_DEV(accel_dev), 211 186 "Failed to allocate IRQ %d for %s\n", irq, name); 212 - return ret; 187 + goto err; 213 188 } 214 189 irqs[i].enabled = true; 215 190 return ret; 216 - } 217 - 218 - static void adf_free_irqs(struct adf_accel_dev *accel_dev) 219 - { 220 - struct adf_accel_pci *pci_dev_info = &accel_dev->accel_pci_dev; 221 - struct adf_hw_device_data *hw_data = accel_dev->hw_device; 222 - struct adf_irq *irqs = pci_dev_info->msix_entries.irqs; 223 - struct adf_etr_data *etr_data = accel_dev->transport; 224 - int clust_irq = hw_data->num_banks; 225 - int irq, i = 0; 226 - 227 - if (pci_dev_info->msix_entries.num_entries > 1) { 228 - for (i = 0; i < hw_data->num_banks; i++) { 229 - if (irqs[i].enabled) { 230 - irq = pci_irq_vector(pci_dev_info->pci_dev, i); 231 - irq_set_affinity_hint(irq, NULL); 232 - free_irq(irq, &etr_data->banks[i]); 233 - } 234 - } 235 - } 236 - 237 - if (irqs[i].enabled) { 238 - irq = pci_irq_vector(pci_dev_info->pci_dev, clust_irq); 239 - free_irq(irq, accel_dev); 240 - } 191 + err: 192 + adf_free_irqs(accel_dev); 193 + return ret; 241 194 } 242 195 243 196 static int adf_isr_alloc_msix_vectors_data(struct adf_accel_dev *accel_dev)