mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 10:40:03 +01:00
vpci: fix deferral of long operations
Current logic to handle long running operations is flawed because it doesn't prevent the guest vcpu from running. Fix this by raising a scheduler softirq when preemption is required, so that the do_softirq call in the guest entry path performs a rescheduling. Also move the call to vpci_process_pending into handle_hvm_io_completion, together with the IOREQ code that handles pending IO instructions. Note that a scheduler softirq is also raised when the long running operation is queued in order to prevent the guest vcpu from resuming execution. Signed-off-by: Roger Pau Monné <roger.pau@citrix.com> Reviewed-by: Paul Durrant <paul.durrant@citrix.com> Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
1 parent
0290d553e0
commit
3e568fa9e1
2 files changed
+12
-3
No files matched your search
@@ -85,9 +85,6 @@ bool hvm_io_pending(struct vcpu *v)
|
||||
struct hvm_ioreq_server *s;
|
||||
unsigned int id;
|
||||
|
||||
if ( has_vpci(d) && vpci_process_pending(v) )
|
||||
return true;
|
||||
|
||||
FOR_EACH_IOREQ_SERVER(d, id, s)
|
||||
{
|
||||
struct hvm_ioreq_vcpu *sv;
|
||||
@@ -186,6 +183,12 @@ bool handle_hvm_io_completion(struct vcpu *v)
|
||||
enum hvm_io_completion io_completion;
|
||||
unsigned int id;
|
||||
|
||||
if ( has_vpci(d) && vpci_process_pending(v) )
|
||||
{
|
||||
raise_softirq(SCHEDULE_SOFTIRQ);
|
||||
return false;
|
||||
}
|
||||
|
||||
FOR_EACH_IOREQ_SERVER(d, id, s)
|
||||
{
|
||||
struct hvm_ioreq_vcpu *sv;
|
||||
|
||||
@@ -184,6 +184,12 @@ static void defer_map(struct domain *d, struct pci_dev *pdev,
|
||||
curr->vpci.mem = mem;
|
||||
curr->vpci.cmd = cmd;
|
||||
curr->vpci.rom_only = rom_only;
|
||||
/*
|
||||
* Raise a scheduler softirq in order to prevent the guest from resuming
|
||||
* execution with pending mapping operations, to trigger the invocation
|
||||
* of vpci_process_pending().
|
||||
*/
|
||||
raise_softirq(SCHEDULE_SOFTIRQ);
|
||||
}
|
||||
|
||||
static int modify_bars(const struct pci_dev *pdev, uint16_t cmd, bool rom_only)
|
||||
|
||||