diff options
Diffstat (limited to 'drivers/misc/cxl/pci.c')
| -rw-r--r-- | drivers/misc/cxl/pci.c | 11 | 
1 files changed, 9 insertions, 2 deletions
| diff --git a/drivers/misc/cxl/pci.c b/drivers/misc/cxl/pci.c index cca938845ffd..91f645992c94 100644 --- a/drivers/misc/cxl/pci.c +++ b/drivers/misc/cxl/pci.c @@ -1129,7 +1129,7 @@ static int pci_configure_afu(struct cxl_afu *afu, struct cxl *adapter, struct pc  	if ((rc = cxl_native_register_psl_irq(afu)))  		goto err2; -	up_write(&afu->configured_rwsem); +	atomic_set(&afu->configured_state, 0);  	return 0;  err2: @@ -1142,7 +1142,14 @@ err1:  static void pci_deconfigure_afu(struct cxl_afu *afu)  { -	down_write(&afu->configured_rwsem); +	/* +	 * It's okay to deconfigure when AFU is already locked, otherwise wait +	 * until there are no readers +	 */ +	if (atomic_read(&afu->configured_state) != -1) { +		while (atomic_cmpxchg(&afu->configured_state, 0, -1) != -1) +			schedule(); +	}  	cxl_native_release_psl_irq(afu);  	if (afu->adapter->native->sl_ops->release_serr_irq)  		afu->adapter->native->sl_ops->release_serr_irq(afu); | 
