Move the calling of request_irq() and other related irq setup code until after the WQ is successfully enabled. This reduces the amount of setup/teardown if the wq is not configured correctly and cannot be enabled.
Unified · Split
| @@ -291,13 +291,6 @@ static int idxd_dmaengine_drv_probe(struct idxd_dev *idxd_dev) · 290 unmodified lines | ||
| 291 | 291 | mutex_lock(&wq->wq_lock); |
| 292 | 292 | wq->type = IDXD_WQT_KERNEL; |
| 293 | 293 | |
| 294 | − rc = idxd_wq_request_irq(wq); | |
| 295 | − if (rc < 0) { | |
| 296 | − idxd->cmd_status = IDXD_SCMD_WQ_IRQ_ERR; | |
| 297 | − dev_dbg(dev, "WQ %d irq setup failed: %d\n", wq->id, rc); | |
| 298 | − goto err_irq; | |
| 299 | − } | |
| 300 | − | |
| 301 | 294 | rc = __drv_enable_wq(wq); |
| 302 | 295 | if (rc < 0) { |
| 303 | 296 | dev_dbg(dev, "Enable wq %d failed: %d\n", wq->id, rc); |
| @@ -305,6 +298,13 @@ static int idxd_dmaengine_drv_probe(struct idxd_dev *idxd_dev) · 1 unmodified line | ||
| 305 | 298 | goto err; |
| 306 | 299 | } |
| 307 | 300 | |
| 301 | + rc = idxd_wq_request_irq(wq); | |
| 302 | + if (rc < 0) { | |
| 303 | + idxd->cmd_status = IDXD_SCMD_WQ_IRQ_ERR; | |
| 304 | + dev_dbg(dev, "WQ %d irq setup failed: %d\n", wq->id, rc); | |
| 305 | + goto err_irq; | |
| 306 | + } | |
| 307 | + | |
| 308 | 308 | rc = idxd_wq_alloc_resources(wq); |
| 309 | 309 | if (rc < 0) { |
| 310 | 310 | idxd->cmd_status = IDXD_SCMD_WQ_RES_ALLOC_ERR; |
| @@ -336,10 +336,10 @@ err_dma: · 25 unmodified lines | ||
| 336 | 336 | err_ref: |
| 337 | 337 | idxd_wq_free_resources(wq); |
| 338 | 338 | err_res_alloc: |
| 339 | − __drv_disable_wq(wq); | |
| 340 | −err: | |
| 341 | 339 | idxd_wq_free_irq(wq); |
| 342 | 340 | err_irq: |
| 341 | + __drv_disable_wq(wq); | |
| 342 | +err: | |
| 343 | 343 | wq->type = IDXD_WQT_NONE; |
| 344 | 344 | mutex_unlock(&wq->wq_lock); |
| 345 | 345 | return rc; |