diff options
Diffstat (limited to 'drivers/vfio/pci/vfio_pci.c')
-rw-r--r-- | drivers/vfio/pci/vfio_pci.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c index 010e0f8b8e4f..e2ee80f36e3e 100644 --- a/drivers/vfio/pci/vfio_pci.c +++ b/drivers/vfio/pci/vfio_pci.c | |||
@@ -157,8 +157,10 @@ static void vfio_pci_release(void *device_data) | |||
157 | { | 157 | { |
158 | struct vfio_pci_device *vdev = device_data; | 158 | struct vfio_pci_device *vdev = device_data; |
159 | 159 | ||
160 | if (atomic_dec_and_test(&vdev->refcnt)) | 160 | if (atomic_dec_and_test(&vdev->refcnt)) { |
161 | vfio_spapr_pci_eeh_release(vdev->pdev); | ||
161 | vfio_pci_disable(vdev); | 162 | vfio_pci_disable(vdev); |
163 | } | ||
162 | 164 | ||
163 | module_put(THIS_MODULE); | 165 | module_put(THIS_MODULE); |
164 | } | 166 | } |
@@ -166,19 +168,27 @@ static void vfio_pci_release(void *device_data) | |||
166 | static int vfio_pci_open(void *device_data) | 168 | static int vfio_pci_open(void *device_data) |
167 | { | 169 | { |
168 | struct vfio_pci_device *vdev = device_data; | 170 | struct vfio_pci_device *vdev = device_data; |
171 | int ret; | ||
169 | 172 | ||
170 | if (!try_module_get(THIS_MODULE)) | 173 | if (!try_module_get(THIS_MODULE)) |
171 | return -ENODEV; | 174 | return -ENODEV; |
172 | 175 | ||
173 | if (atomic_inc_return(&vdev->refcnt) == 1) { | 176 | if (atomic_inc_return(&vdev->refcnt) == 1) { |
174 | int ret = vfio_pci_enable(vdev); | 177 | ret = vfio_pci_enable(vdev); |
178 | if (ret) | ||
179 | goto error; | ||
180 | |||
181 | ret = vfio_spapr_pci_eeh_open(vdev->pdev); | ||
175 | if (ret) { | 182 | if (ret) { |
176 | module_put(THIS_MODULE); | 183 | vfio_pci_disable(vdev); |
177 | return ret; | 184 | goto error; |
178 | } | 185 | } |
179 | } | 186 | } |
180 | 187 | ||
181 | return 0; | 188 | return 0; |
189 | error: | ||
190 | module_put(THIS_MODULE); | ||
191 | return ret; | ||
182 | } | 192 | } |
183 | 193 | ||
184 | static int vfio_pci_get_irq_count(struct vfio_pci_device *vdev, int irq_type) | 194 | static int vfio_pci_get_irq_count(struct vfio_pci_device *vdev, int irq_type) |