From: Jan Kiszka <jan.kiszka@web.de>
To: Blue Swirl <blauwirbel@gmail.com>
Cc: Avi Kivity <avi@redhat.com>,
Marcelo Tosatti <mtosatti@redhat.com>,
Alex Williamson <alex.williamson@redhat.com>,
qemu-devel@nongnu.org, kvm@vger.kernel.org,
"Michael S. Tsirkin" <mst@redhat.com>
Subject: Re: [Qemu-devel] [PATCH 4/4] kvm: i386: Add classic PCI device assignment
Date: Tue, 28 Aug 2012 02:30:39 +0200 [thread overview]
Message-ID: <503C112F.7060307@web.de> (raw)
In-Reply-To: <CAAu8pHu7XZ4OStiKG78X2TuHd2RaJ08FTq5coDPRWbDbi9UBBQ@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 4242 bytes --]
Hi Blue,
thanks for the review. I addressed most of them, the others a commented
below.
On 2012-08-27 20:56, Blue Swirl wrote:
>> +typedef struct AssignedDevice {
>> + PCIDevice dev;
>> + PCIHostDeviceAddress host;
>> + uint32_t dev_id;
>> + uint32_t features;
>> + int intpin;
>> + AssignedDevRegion v_addrs[PCI_NUM_REGIONS - 1];
>> + PCIDevRegions real_device;
>> + PCIINTxRoute intx_route;
>> + AssignedIRQType assigned_irq_type;
>> + struct {
>> +#define ASSIGNED_DEVICE_CAP_MSI (1 << 0)
>> +#define ASSIGNED_DEVICE_CAP_MSIX (1 << 1)
>> + uint32_t available;
>> +#define ASSIGNED_DEVICE_MSI_ENABLED (1 << 0)
>> +#define ASSIGNED_DEVICE_MSIX_ENABLED (1 << 1)
>> +#define ASSIGNED_DEVICE_MSIX_MASKED (1 << 2)
>> + uint32_t state;
>> + } cap;
>> + uint8_t emulate_config_read[PCI_CONFIG_SPACE_SIZE];
>> + uint8_t emulate_config_write[PCI_CONFIG_SPACE_SIZE];
>> + int msi_virq_nr;
>> + int *msi_virq;
>> + MSIXTableEntry *msix_table;
>> + target_phys_addr_t msix_table_addr;
>> + uint16_t msix_max;
>> + MemoryRegion mmio;
>> + char *configfd_name;
>
> const? Not if this would mean more casts.
DEFINE_PROP_STRING, where this is used, doesn't allow this.
...
>> + } else {
>> + uint32_t port = addr + dev_region->u.r_baseport;
>> +
>> + if (data) {
>> + DEBUG("out data=%lx, size=%d, e_phys=%lx, host=%x\n",
>> + *data, size, addr, port);
>> + switch (size) {
>> + case 1:
>> + outb(*data, port);
>> + break;
>> + case 2:
>> + outw(*data, port);
>> + break;
>> + case 4:
>> + outl(*data, port);
>> + break;
>
> Maybe add case 8: and default: with abort(), also below.
PIO is never 8 bytes long, the generic layer protects us.
...
>> +
>> + fclose(f);
>> +
>> + /* read and fill vendor ID */
>> + v = get_real_vendor_id(dir, &id);
>> + if (v) {
>> + return 1;
>> + }
>> + pci_dev->dev.config[0] = id & 0xff;
>> + pci_dev->dev.config[1] = (id & 0xff00) >> 8;
>> +
>> + /* read and fill device ID */
>> + v = get_real_device_id(dir, &id);
>> + if (v) {
>> + return 1;
>> + }
>> + pci_dev->dev.config[2] = id & 0xff;
>> + pci_dev->dev.config[3] = (id & 0xff00) >> 8;
>> +
>> + pci_word_test_and_clear_mask(pci_dev->emulate_config_write + PCI_COMMAND,
>> + PCI_COMMAND_MASTER | PCI_COMMAND_INTX_DISABLE);
>> +
>> + dev->region_number = r;
>> + return 0;
>> +}
>
> Pretty long function, how about refactoring?
Possibly, but I'd prefer to do such changes in-tree, after the more
important refactoring on MSI[-X] is done.
...
>> + if (ctrl_byte & PCI_MSI_FLAGS_ENABLE) {
>> + uint8_t *pos = pci_dev->config + pci_dev->msi_cap;
>> + MSIMessage msg;
>> + int virq;
>> +
>> + msg.address = pci_get_long(pos + PCI_MSI_ADDRESS_LO);
>> + msg.data = pci_get_word(pos + PCI_MSI_DATA_32);
>> + virq = kvm_irqchip_add_msi_route(kvm_state, msg);
>> + if (virq < 0) {
>> + perror("assigned_dev_update_msi: kvm_irqchip_add_msi_route");
>> + return;
>> + }
>> +
>> + assigned_dev->msi_virq = g_malloc(sizeof(*assigned_dev->msi_virq));
>
> Is this ever freed?
Yep, in free_msi_virqs. If you think you spotted a path where this is
not the case, let me know.
...
>> +
>> +static Property da_properties[] = {
>
> const?
Nope, properties must remain writable.
>
>> + DEFINE_PROP_PCI_HOST_DEVADDR("host", AssignedDevice, host),
>> + DEFINE_PROP_BIT("prefer_msi", AssignedDevice, features,
>> + ASSIGNED_DEVICE_PREFER_MSI_BIT, false),
>> + DEFINE_PROP_BIT("share_intx", AssignedDevice, features,
>> + ASSIGNED_DEVICE_SHARE_INTX_BIT, true),
>> + DEFINE_PROP_INT32("bootindex", AssignedDevice, bootindex, -1),
>> + DEFINE_PROP_STRING("configfd", AssignedDevice, configfd_name),
>> + DEFINE_PROP_END_OF_LIST(),
>> +};
>> +
Jan
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 259 bytes --]
WARNING: multiple messages have this Message-ID (diff)
From: Jan Kiszka <jan.kiszka@web.de>
To: Blue Swirl <blauwirbel@gmail.com>
Cc: kvm@vger.kernel.org, "Michael S. Tsirkin" <mst@redhat.com>,
Marcelo Tosatti <mtosatti@redhat.com>,
qemu-devel@nongnu.org,
Alex Williamson <alex.williamson@redhat.com>,
Avi Kivity <avi@redhat.com>
Subject: Re: [Qemu-devel] [PATCH 4/4] kvm: i386: Add classic PCI device assignment
Date: Tue, 28 Aug 2012 02:30:39 +0200 [thread overview]
Message-ID: <503C112F.7060307@web.de> (raw)
In-Reply-To: <CAAu8pHu7XZ4OStiKG78X2TuHd2RaJ08FTq5coDPRWbDbi9UBBQ@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 4242 bytes --]
Hi Blue,
thanks for the review. I addressed most of them, the others a commented
below.
On 2012-08-27 20:56, Blue Swirl wrote:
>> +typedef struct AssignedDevice {
>> + PCIDevice dev;
>> + PCIHostDeviceAddress host;
>> + uint32_t dev_id;
>> + uint32_t features;
>> + int intpin;
>> + AssignedDevRegion v_addrs[PCI_NUM_REGIONS - 1];
>> + PCIDevRegions real_device;
>> + PCIINTxRoute intx_route;
>> + AssignedIRQType assigned_irq_type;
>> + struct {
>> +#define ASSIGNED_DEVICE_CAP_MSI (1 << 0)
>> +#define ASSIGNED_DEVICE_CAP_MSIX (1 << 1)
>> + uint32_t available;
>> +#define ASSIGNED_DEVICE_MSI_ENABLED (1 << 0)
>> +#define ASSIGNED_DEVICE_MSIX_ENABLED (1 << 1)
>> +#define ASSIGNED_DEVICE_MSIX_MASKED (1 << 2)
>> + uint32_t state;
>> + } cap;
>> + uint8_t emulate_config_read[PCI_CONFIG_SPACE_SIZE];
>> + uint8_t emulate_config_write[PCI_CONFIG_SPACE_SIZE];
>> + int msi_virq_nr;
>> + int *msi_virq;
>> + MSIXTableEntry *msix_table;
>> + target_phys_addr_t msix_table_addr;
>> + uint16_t msix_max;
>> + MemoryRegion mmio;
>> + char *configfd_name;
>
> const? Not if this would mean more casts.
DEFINE_PROP_STRING, where this is used, doesn't allow this.
...
>> + } else {
>> + uint32_t port = addr + dev_region->u.r_baseport;
>> +
>> + if (data) {
>> + DEBUG("out data=%lx, size=%d, e_phys=%lx, host=%x\n",
>> + *data, size, addr, port);
>> + switch (size) {
>> + case 1:
>> + outb(*data, port);
>> + break;
>> + case 2:
>> + outw(*data, port);
>> + break;
>> + case 4:
>> + outl(*data, port);
>> + break;
>
> Maybe add case 8: and default: with abort(), also below.
PIO is never 8 bytes long, the generic layer protects us.
...
>> +
>> + fclose(f);
>> +
>> + /* read and fill vendor ID */
>> + v = get_real_vendor_id(dir, &id);
>> + if (v) {
>> + return 1;
>> + }
>> + pci_dev->dev.config[0] = id & 0xff;
>> + pci_dev->dev.config[1] = (id & 0xff00) >> 8;
>> +
>> + /* read and fill device ID */
>> + v = get_real_device_id(dir, &id);
>> + if (v) {
>> + return 1;
>> + }
>> + pci_dev->dev.config[2] = id & 0xff;
>> + pci_dev->dev.config[3] = (id & 0xff00) >> 8;
>> +
>> + pci_word_test_and_clear_mask(pci_dev->emulate_config_write + PCI_COMMAND,
>> + PCI_COMMAND_MASTER | PCI_COMMAND_INTX_DISABLE);
>> +
>> + dev->region_number = r;
>> + return 0;
>> +}
>
> Pretty long function, how about refactoring?
Possibly, but I'd prefer to do such changes in-tree, after the more
important refactoring on MSI[-X] is done.
...
>> + if (ctrl_byte & PCI_MSI_FLAGS_ENABLE) {
>> + uint8_t *pos = pci_dev->config + pci_dev->msi_cap;
>> + MSIMessage msg;
>> + int virq;
>> +
>> + msg.address = pci_get_long(pos + PCI_MSI_ADDRESS_LO);
>> + msg.data = pci_get_word(pos + PCI_MSI_DATA_32);
>> + virq = kvm_irqchip_add_msi_route(kvm_state, msg);
>> + if (virq < 0) {
>> + perror("assigned_dev_update_msi: kvm_irqchip_add_msi_route");
>> + return;
>> + }
>> +
>> + assigned_dev->msi_virq = g_malloc(sizeof(*assigned_dev->msi_virq));
>
> Is this ever freed?
Yep, in free_msi_virqs. If you think you spotted a path where this is
not the case, let me know.
...
>> +
>> +static Property da_properties[] = {
>
> const?
Nope, properties must remain writable.
>
>> + DEFINE_PROP_PCI_HOST_DEVADDR("host", AssignedDevice, host),
>> + DEFINE_PROP_BIT("prefer_msi", AssignedDevice, features,
>> + ASSIGNED_DEVICE_PREFER_MSI_BIT, false),
>> + DEFINE_PROP_BIT("share_intx", AssignedDevice, features,
>> + ASSIGNED_DEVICE_SHARE_INTX_BIT, true),
>> + DEFINE_PROP_INT32("bootindex", AssignedDevice, bootindex, -1),
>> + DEFINE_PROP_STRING("configfd", AssignedDevice, configfd_name),
>> + DEFINE_PROP_END_OF_LIST(),
>> +};
>> +
Jan
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 259 bytes --]
next prev parent reply other threads:[~2012-08-28 0:30 UTC|newest]
Thread overview: 146+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-08-27 6:28 [PATCH 0/4] uq/master: Add classic PCI device assignment Jan Kiszka
2012-08-27 6:28 ` [Qemu-devel] " Jan Kiszka
2012-08-27 6:28 ` [PATCH 1/4] kvm: Introduce kvm_irqchip_update_msi_route Jan Kiszka
2012-08-27 6:28 ` [Qemu-devel] " Jan Kiszka
2012-08-27 6:28 ` [PATCH 2/4] kvm: Introduce kvm_has_intx_set_mask Jan Kiszka
2012-08-27 6:28 ` [Qemu-devel] " Jan Kiszka
2012-08-27 6:28 ` [PATCH 3/4] kvm: i386: Add services required for PCI device assignment Jan Kiszka
2012-08-27 6:28 ` [Qemu-devel] " Jan Kiszka
2012-08-27 6:28 ` [PATCH 4/4] kvm: i386: Add classic " Jan Kiszka
2012-08-27 6:28 ` [Qemu-devel] " Jan Kiszka
2012-08-27 12:07 ` Andreas Färber
2012-08-27 12:07 ` Andreas Färber
2012-08-27 12:15 ` Jan Kiszka
2012-08-27 12:15 ` [Qemu-devel] " Jan Kiszka
2012-08-28 21:26 ` Peter Maydell
2012-08-28 21:26 ` [Qemu-devel] " Peter Maydell
2012-08-29 8:47 ` Jan Kiszka
2012-08-29 8:47 ` [Qemu-devel] " Jan Kiszka
2012-08-29 8:49 ` Peter Maydell
2012-08-29 8:49 ` Peter Maydell
2012-08-29 8:50 ` Jan Kiszka
2012-08-29 8:50 ` Jan Kiszka
2012-09-03 15:59 ` Avi Kivity
2012-09-03 15:59 ` Avi Kivity
2012-09-04 3:31 ` Alex Williamson
2012-09-04 3:31 ` [Qemu-devel] " Alex Williamson
2012-08-28 12:57 ` Anthony Liguori
2012-08-28 12:57 ` Anthony Liguori
2012-08-29 14:08 ` Andreas Färber
2012-08-29 14:08 ` Andreas Färber
2012-08-29 18:32 ` Anthony Liguori
2012-08-29 18:32 ` [Qemu-devel] " Anthony Liguori
2012-09-04 21:00 ` Anthony Liguori
2012-09-04 21:00 ` [Qemu-devel] " Anthony Liguori
2012-09-05 15:26 ` Avi Kivity
2012-09-05 15:26 ` [Qemu-devel] " Avi Kivity
2012-09-05 15:29 ` Michael S. Tsirkin
2012-09-05 15:29 ` Michael S. Tsirkin
2012-09-05 15:41 ` Anthony Liguori
2012-09-05 15:41 ` Anthony Liguori
2012-09-05 15:52 ` Avi Kivity
2012-09-05 15:52 ` Avi Kivity
2012-09-05 19:04 ` Blue Swirl
2012-09-05 19:04 ` Blue Swirl
2012-09-05 19:22 ` Anthony Liguori
2012-09-05 19:22 ` Anthony Liguori
2012-09-05 19:38 ` Blue Swirl
2012-09-05 19:38 ` Blue Swirl
2012-09-05 20:46 ` Anthony Liguori
2012-09-05 20:46 ` [Qemu-devel] " Anthony Liguori
2012-09-10 15:33 ` Andreas Färber
2012-09-10 15:33 ` Andreas Färber
2012-09-06 3:42 ` [Qemu-ppc] " Alexander Graf
2012-09-06 3:42 ` [Qemu-devel] [Qemu-ppc] " Alexander Graf
2012-09-08 7:54 ` [Qemu-ppc] [Qemu-devel] " Blue Swirl
2012-09-08 7:54 ` [Qemu-devel] [Qemu-ppc] " Blue Swirl
2012-09-05 19:24 ` Eric Blake
2012-09-05 19:24 ` [Qemu-devel] " Eric Blake
2012-09-05 19:43 ` Blue Swirl
2012-09-05 19:43 ` Blue Swirl
2012-09-06 8:44 ` Avi Kivity
2012-09-06 8:44 ` Avi Kivity
2012-09-08 8:06 ` Blue Swirl
2012-09-08 8:06 ` [Qemu-devel] " Blue Swirl
2012-09-08 9:28 ` [Qemu-ppc] " Alexander Graf
2012-09-08 9:28 ` [Qemu-devel] " Alexander Graf
2012-09-08 10:16 ` [Qemu-ppc] [Qemu-devel] " Blue Swirl
2012-09-08 10:16 ` [Qemu-devel] [Qemu-ppc] " Blue Swirl
2012-09-08 12:13 ` Alexander Graf
2012-09-08 12:13 ` [Qemu-devel] " Alexander Graf
2012-09-08 12:30 ` Blue Swirl
2012-09-08 12:30 ` [Qemu-devel] " Blue Swirl
2012-09-08 14:59 ` Alexander Graf
2012-09-08 14:59 ` [Qemu-devel] " Alexander Graf
2012-08-27 18:56 ` Blue Swirl
2012-08-27 18:56 ` [Qemu-devel] " Blue Swirl
2012-08-27 19:01 ` Michael S. Tsirkin
2012-08-27 19:01 ` Michael S. Tsirkin
2012-08-27 19:06 ` Blue Swirl
2012-08-27 19:06 ` [Qemu-devel] " Blue Swirl
2012-08-28 0:30 ` Jan Kiszka [this message]
2012-08-28 0:30 ` Jan Kiszka
2012-09-03 16:06 ` Avi Kivity
2012-09-03 16:06 ` Avi Kivity
2012-08-28 7:35 ` Michael Tokarev
2012-08-28 7:35 ` Michael Tokarev
2012-08-28 17:01 ` Blue Swirl
2012-08-28 17:01 ` Blue Swirl
2012-08-28 17:28 ` Michael S. Tsirkin
2012-08-28 17:28 ` Michael S. Tsirkin
2012-08-28 17:38 ` Blue Swirl
2012-08-28 17:38 ` Blue Swirl
2012-08-28 19:31 ` Anthony Liguori
2012-08-28 19:31 ` [Qemu-devel] " Anthony Liguori
2012-08-28 19:49 ` malc
2012-08-28 19:49 ` [Qemu-devel] " malc
2012-08-28 20:06 ` Blue Swirl
2012-08-28 20:06 ` Blue Swirl
2012-08-28 21:51 ` Anthony Liguori
2012-08-28 21:51 ` Anthony Liguori
2012-09-01 9:20 ` Blue Swirl
2012-09-01 9:20 ` [Qemu-devel] " Blue Swirl
2012-08-29 8:27 ` Markus Armbruster
2012-08-29 8:27 ` [Qemu-devel] " Markus Armbruster
2012-09-03 16:14 ` Avi Kivity
2012-09-03 16:14 ` [Qemu-devel] " Avi Kivity
2012-09-03 19:32 ` Blue Swirl
2012-09-03 19:32 ` [Qemu-devel] " Blue Swirl
2012-09-04 8:32 ` Avi Kivity
2012-09-04 8:32 ` Avi Kivity
2012-09-04 19:27 ` Blue Swirl
2012-09-04 19:27 ` Blue Swirl
2012-09-04 21:28 ` Michael S. Tsirkin
2012-09-04 21:28 ` [Qemu-devel] " Michael S. Tsirkin
2012-09-05 19:09 ` Blue Swirl
2012-09-05 19:09 ` Blue Swirl
2012-08-28 11:02 ` [PATCH v2 " Jan Kiszka
2012-08-28 11:02 ` [Qemu-devel] " Jan Kiszka
2012-08-28 21:49 ` Michael S. Tsirkin
2012-08-28 21:49 ` [Qemu-devel] " Michael S. Tsirkin
2012-08-29 8:44 ` Jan Kiszka
2012-08-29 8:44 ` [Qemu-devel] " Jan Kiszka
2012-08-29 10:35 ` Michael S. Tsirkin
2012-08-29 10:35 ` [Qemu-devel] " Michael S. Tsirkin
2012-08-30 18:30 ` [PATCH v3 " Jan Kiszka
2012-08-30 18:30 ` [Qemu-devel] " Jan Kiszka
2012-09-06 8:44 ` Jan Kiszka
2012-09-06 8:44 ` [Qemu-devel] " Jan Kiszka
2012-09-06 8:49 ` Michael S. Tsirkin
2012-09-06 8:49 ` [Qemu-devel] " Michael S. Tsirkin
2012-09-06 16:06 ` Andreas Färber
2012-09-06 16:06 ` [Qemu-devel] " Andreas Färber
2012-09-06 16:16 ` Jan Kiszka
2012-09-06 16:16 ` [Qemu-devel] " Jan Kiszka
2012-09-08 7:55 ` Blue Swirl
2012-09-08 7:55 ` [Qemu-devel] " Blue Swirl
2012-09-09 14:13 ` Avi Kivity
2012-09-09 14:13 ` [Qemu-devel] " Avi Kivity
2012-09-10 9:26 ` Jan Kiszka
2012-09-10 9:26 ` [Qemu-devel] " Jan Kiszka
2012-09-10 12:30 ` Avi Kivity
2012-09-10 12:30 ` [Qemu-devel] " Avi Kivity
2012-08-28 15:04 ` [PATCH " Michael S. Tsirkin
2012-08-28 15:04 ` [Qemu-devel] " Michael S. Tsirkin
2012-08-29 10:50 ` Jan Kiszka
2012-08-29 10:50 ` [Qemu-devel] " Jan Kiszka
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=503C112F.7060307@web.de \
--to=jan.kiszka@web.de \
--cc=alex.williamson@redhat.com \
--cc=avi@redhat.com \
--cc=blauwirbel@gmail.com \
--cc=kvm@vger.kernel.org \
--cc=mst@redhat.com \
--cc=mtosatti@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.