Ignore:
Timestamp:
Mar 15, 2017, 2:42:58 AM (4 months ago)
Author:
brainslayer
Message:

use new squashfs in all kernels

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/linux/universal/linux-4.9/drivers/misc/cxl/vphb.c

    r31574 r31662  
    7777}
    7878
    79 static int cxl_pcie_config_info(struct pci_bus *bus, unsigned int devfn,
    80                                 struct cxl_afu **_afu, int *_record)
    81 {
    82         struct pci_controller *phb;
    83         struct cxl_afu *afu;
     79static inline struct cxl_afu *pci_bus_to_afu(struct pci_bus *bus)
     80{
     81        struct pci_controller *phb = bus ? pci_bus_to_host(bus) : NULL;
     82
     83        return phb ? phb->private_data : NULL;
     84}
     85
     86static void cxl_afu_configured_put(struct cxl_afu *afu)
     87{
     88        atomic_dec_if_positive(&afu->configured_state);
     89}
     90
     91static bool cxl_afu_configured_get(struct cxl_afu *afu)
     92{
     93        return atomic_inc_unless_negative(&afu->configured_state);
     94}
     95
     96static inline int cxl_pcie_config_info(struct pci_bus *bus, unsigned int devfn,
     97                                       struct cxl_afu *afu, int *_record)
     98{
    8499        int record;
    85100
    86         phb = pci_bus_to_host(bus);
    87         if (phb == NULL)
    88                 return PCIBIOS_DEVICE_NOT_FOUND;
    89 
    90         afu = (struct cxl_afu *)phb->private_data;
    91101        record = cxl_pcie_cfg_record(bus->number, devfn);
    92102        if (record > afu->crs_num)
    93103                return PCIBIOS_DEVICE_NOT_FOUND;
    94104
    95         *_afu = afu;
    96105        *_record = record;
    97106        return 0;
     
    107116        u32 val32;
    108117
    109         rc = cxl_pcie_config_info(bus, devfn, &afu, &record);
     118        afu = pci_bus_to_afu(bus);
     119        /* Grab a reader lock on afu. */
     120        if (afu == NULL || !cxl_afu_configured_get(afu))
     121                return PCIBIOS_DEVICE_NOT_FOUND;
     122
     123        rc = cxl_pcie_config_info(bus, devfn, afu, &record);
    110124        if (rc)
    111                 return rc;
     125                goto out;
    112126
    113127        switch (len) {
     
    128142        }
    129143
    130         if (rc)
    131                 return PCIBIOS_DEVICE_NOT_FOUND;
    132 
    133         return PCIBIOS_SUCCESSFUL;
     144out:
     145        cxl_afu_configured_put(afu);
     146        return rc ? PCIBIOS_DEVICE_NOT_FOUND : PCIBIOS_SUCCESSFUL;
    134147}
    135148
     
    140153        struct cxl_afu *afu;
    141154
    142         rc = cxl_pcie_config_info(bus, devfn, &afu, &record);
     155        afu = pci_bus_to_afu(bus);
     156        /* Grab a reader lock on afu. */
     157        if (afu == NULL || !cxl_afu_configured_get(afu))
     158                return PCIBIOS_DEVICE_NOT_FOUND;
     159
     160        rc = cxl_pcie_config_info(bus, devfn, afu, &record);
    143161        if (rc)
    144                 return rc;
     162                goto out;
    145163
    146164        switch (len) {
     
    158176        }
    159177
    160         if (rc)
    161                 return PCIBIOS_SET_FAILED;
    162 
    163         return PCIBIOS_SUCCESSFUL;
     178out:
     179        cxl_afu_configured_put(afu);
     180        return rc ? PCIBIOS_SET_FAILED : PCIBIOS_SUCCESSFUL;
    164181}
    165182
Note: See TracChangeset for help on using the changeset viewer.