From: Ladi Prosek <lprosek@redhat.com>
To: qemu-devel@nongnu.org
Cc: marcel@redhat.com, geoff@hostfission.com, mst@redhat.com,
alex.williamson@redhat.com
Subject: [Qemu-devel] [PATCH v2] msix: don't mask already masked vectors on reset
Date: Fri, 8 Dec 2017 07:31:13 +0100 [thread overview]
Message-ID: <20171208063113.20383-1-lprosek@redhat.com> (raw)
msix_mask_all() is supposed to invoke the release vector notifier if the state of the
respective vector changed from unmasked to masked. The way it's currently called from
msix_reset(), though, may result in calling the release notifier even if the vector
is already masked.
1) msix_reset() clears out the msix_cap field and the msix_table.
2) msix_mask_all() runs with was_masked=false for all vectors because of 1), which
results in calling the release notifier on all vectors.
3) if msix_reset() is subsequently called again, it goes through the same steps and
calls the release notifier on all vectors again.
This commit moves msix_mask_all() up so it runs before the device state is lost. And
it adds an assignment to msix_function_masked so that the device remembers that
MSI-X is masked.
This is likely a low impact issue, found while debugging an already broken device. It
is however easy to fix and the expectation that the use and release notifier invocations
are always balanced is very natural.
Signed-off-by: Ladi Prosek <lprosek@redhat.com>
---
v1->v2:
* fixed typo in commit message "or" -> "to" (Marcel)
* directly set msix_function_masked to true instead of calling
msix_update_function_masked() (Marcel)
hw/pci/msix.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/hw/pci/msix.c b/hw/pci/msix.c
index c944c02135..d6a4dbdb6b 100644
--- a/hw/pci/msix.c
+++ b/hw/pci/msix.c
@@ -500,11 +500,12 @@ void msix_reset(PCIDevice *dev)
return;
}
msix_clear_all_vectors(dev);
+ msix_mask_all(dev, dev->msix_entries_nr);
dev->config[dev->msix_cap + MSIX_CONTROL_OFFSET] &=
~dev->wmask[dev->msix_cap + MSIX_CONTROL_OFFSET];
memset(dev->msix_table, 0, dev->msix_entries_nr * PCI_MSIX_ENTRY_SIZE);
memset(dev->msix_pba, 0, QEMU_ALIGN_UP(dev->msix_entries_nr, 64) / 8);
- msix_mask_all(dev, dev->msix_entries_nr);
+ dev->msix_function_masked = true;
}
/* PCI spec suggests that devices make it possible for software to configure
--
2.13.6
next reply other threads:[~2017-12-08 6:31 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-12-08 6:31 Ladi Prosek [this message]
2017-12-08 14:09 ` [Qemu-devel] [PATCH v2] msix: don't mask already masked vectors on reset Marcel Apfelbaum
2017-12-21 14:01 ` Michael S. Tsirkin
2017-12-21 15:08 ` Marcel Apfelbaum
2017-12-21 19:17 ` Marcel Apfelbaum
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20171208063113.20383-1-lprosek@redhat.com \
--to=lprosek@redhat.com \
--cc=alex.williamson@redhat.com \
--cc=geoff@hostfission.com \
--cc=marcel@redhat.com \
--cc=mst@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).