@@ -173,13 +173,34 @@ static union hv_device_id hv_build_pci_dev_id(struct pci_dev *dev)
173
173
return dev_id ;
174
174
}
175
175
176
- static int hv_map_msi_interrupt (struct pci_dev * dev , int cpu , int vector ,
177
- struct hv_interrupt_entry * entry )
176
+ /**
177
+ * hv_map_msi_interrupt() - "Map" the MSI IRQ in the hypervisor.
178
+ * @data: Describes the IRQ
179
+ * @out_entry: Hypervisor (MSI) interrupt entry (can be NULL)
180
+ *
181
+ * Map the IRQ in the hypervisor by issuing a MAP_DEVICE_INTERRUPT hypercall.
182
+ *
183
+ * Return: 0 on success, -errno on failure
184
+ */
185
+ int hv_map_msi_interrupt (struct irq_data * data ,
186
+ struct hv_interrupt_entry * out_entry )
178
187
{
179
- union hv_device_id device_id = hv_build_pci_dev_id (dev );
188
+ struct irq_cfg * cfg = irqd_cfg (data );
189
+ struct hv_interrupt_entry dummy ;
190
+ union hv_device_id device_id ;
191
+ struct msi_desc * msidesc ;
192
+ struct pci_dev * dev ;
193
+ int cpu ;
180
194
181
- return hv_map_interrupt (device_id , false, cpu , vector , entry );
195
+ msidesc = irq_data_get_msi_desc (data );
196
+ dev = msi_desc_to_pci_dev (msidesc );
197
+ device_id = hv_build_pci_dev_id (dev );
198
+ cpu = cpumask_first (irq_data_get_effective_affinity_mask (data ));
199
+
200
+ return hv_map_interrupt (device_id , false, cpu , cfg -> vector ,
201
+ out_entry ? out_entry : & dummy );
182
202
}
203
+ EXPORT_SYMBOL_GPL (hv_map_msi_interrupt );
183
204
184
205
static inline void entry_to_msi_msg (struct hv_interrupt_entry * entry , struct msi_msg * msg )
185
206
{
@@ -192,11 +213,11 @@ static inline void entry_to_msi_msg(struct hv_interrupt_entry *entry, struct msi
192
213
static int hv_unmap_msi_interrupt (struct pci_dev * dev , struct hv_interrupt_entry * old_entry );
193
214
static void hv_irq_compose_msi_msg (struct irq_data * data , struct msi_msg * msg )
194
215
{
195
- struct hv_interrupt_entry out_entry , * stored_entry ;
216
+ struct hv_interrupt_entry * stored_entry ;
196
217
struct irq_cfg * cfg = irqd_cfg (data );
197
218
struct msi_desc * msidesc ;
198
219
struct pci_dev * dev ;
199
- int cpu , ret ;
220
+ int ret ;
200
221
201
222
msidesc = irq_data_get_msi_desc (data );
202
223
dev = msi_desc_to_pci_dev (msidesc );
@@ -206,8 +227,6 @@ static void hv_irq_compose_msi_msg(struct irq_data *data, struct msi_msg *msg)
206
227
return ;
207
228
}
208
229
209
- cpu = cpumask_first (irq_data_get_effective_affinity_mask (data ));
210
-
211
230
if (data -> chip_data ) {
212
231
/*
213
232
* This interrupt is already mapped. Let's unmap first.
@@ -234,15 +253,14 @@ static void hv_irq_compose_msi_msg(struct irq_data *data, struct msi_msg *msg)
234
253
return ;
235
254
}
236
255
237
- ret = hv_map_msi_interrupt (dev , cpu , cfg -> vector , & out_entry );
256
+ ret = hv_map_msi_interrupt (data , stored_entry );
238
257
if (ret ) {
239
258
kfree (stored_entry );
240
259
return ;
241
260
}
242
261
243
- * stored_entry = out_entry ;
244
262
data -> chip_data = stored_entry ;
245
- entry_to_msi_msg (& out_entry , msg );
263
+ entry_to_msi_msg (data -> chip_data , msg );
246
264
247
265
return ;
248
266
}
0 commit comments