diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2009-03-31 11:54:12 +0100 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2009-03-31 11:54:12 +0100 |
commit | bc0fe8ff74c3e462c9d637eb3e93645f0b97a3f8 (patch) | |
tree | 75751682cb1edb406386658d1434e2be355b4ba9 /tools/Rules.mk | |
parent | 964fae8ac2fa6732856179a2532b0914dba5e4bb (diff) | |
download | xen-bc0fe8ff74c3e462c9d637eb3e93645f0b97a3f8.tar.gz xen-bc0fe8ff74c3e462c9d637eb3e93645f0b97a3f8.tar.bz2 xen-bc0fe8ff74c3e462c9d637eb3e93645f0b97a3f8.zip |
vtd: fix multiple Dom0 S3 on hosts that support Queued Invalidation.
On such hosts we can't do multiple Dom0 S3 when VT-d is enabled.
The cause is: during the first S3 resume, init_vtd_hw() initializes
the invalidation function pointers to the register-based ones and later
enable_qinval() forgets to overwrite the flush function pointers to
queued-based ones, so actually Queued Invalidaton is enabled, but we
actually use the register-based invalidation function! Later during
the second Dom0 S3, in iommu_suspend() -> iommu_flush_all(), we try to
use the register-based invalidation functions to perform global flush
while Queued Invalidation is enabled, and this can cause a host reset
because VT-d spec says: when the queued invalidation is enabled,
software must submit invalidation commands only through the IQ (and
not through any invalidation command registers).
The attached patch fixes the buggy enable_qinval(). And in
iommu_resume(), we invoke iommu_flush_all() for safety.
Signed-off-by: Dexuan Cui <dexuan.cui@intel.com>
Diffstat (limited to 'tools/Rules.mk')
0 files changed, 0 insertions, 0 deletions