|
@@ -83,6 +83,16 @@ static inline struct cxl_afu *pci_bus_to_afu(struct pci_bus *bus)
|
|
|
return phb ? phb->private_data : NULL;
|
|
|
}
|
|
|
|
|
|
+static void cxl_afu_configured_put(struct cxl_afu *afu)
|
|
|
+{
|
|
|
+ atomic_dec_if_positive(&afu->configured_state);
|
|
|
+}
|
|
|
+
|
|
|
+static bool cxl_afu_configured_get(struct cxl_afu *afu)
|
|
|
+{
|
|
|
+ return atomic_inc_unless_negative(&afu->configured_state);
|
|
|
+}
|
|
|
+
|
|
|
static inline int cxl_pcie_config_info(struct pci_bus *bus, unsigned int devfn,
|
|
|
struct cxl_afu *afu, int *_record)
|
|
|
{
|
|
@@ -107,7 +117,7 @@ static int cxl_pcie_read_config(struct pci_bus *bus, unsigned int devfn,
|
|
|
|
|
|
afu = pci_bus_to_afu(bus);
|
|
|
/* Grab a reader lock on afu. */
|
|
|
- if (afu == NULL || !down_read_trylock(&afu->configured_rwsem))
|
|
|
+ if (afu == NULL || !cxl_afu_configured_get(afu))
|
|
|
return PCIBIOS_DEVICE_NOT_FOUND;
|
|
|
|
|
|
rc = cxl_pcie_config_info(bus, devfn, afu, &record);
|
|
@@ -132,7 +142,7 @@ static int cxl_pcie_read_config(struct pci_bus *bus, unsigned int devfn,
|
|
|
}
|
|
|
|
|
|
out:
|
|
|
- up_read(&afu->configured_rwsem);
|
|
|
+ cxl_afu_configured_put(afu);
|
|
|
return rc ? PCIBIOS_DEVICE_NOT_FOUND : PCIBIOS_SUCCESSFUL;
|
|
|
}
|
|
|
|
|
@@ -144,7 +154,7 @@ static int cxl_pcie_write_config(struct pci_bus *bus, unsigned int devfn,
|
|
|
|
|
|
afu = pci_bus_to_afu(bus);
|
|
|
/* Grab a reader lock on afu. */
|
|
|
- if (afu == NULL || !down_read_trylock(&afu->configured_rwsem))
|
|
|
+ if (afu == NULL || !cxl_afu_configured_get(afu))
|
|
|
return PCIBIOS_DEVICE_NOT_FOUND;
|
|
|
|
|
|
rc = cxl_pcie_config_info(bus, devfn, afu, &record);
|
|
@@ -166,7 +176,7 @@ static int cxl_pcie_write_config(struct pci_bus *bus, unsigned int devfn,
|
|
|
}
|
|
|
|
|
|
out:
|
|
|
- up_read(&afu->configured_rwsem);
|
|
|
+ cxl_afu_configured_put(afu);
|
|
|
return rc ? PCIBIOS_SET_FAILED : PCIBIOS_SUCCESSFUL;
|
|
|
}
|
|
|
|