[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 03/66] dma: keep a device alive while it has SGL
From: |
Jan Kiszka |
Subject: |
Re: [Qemu-devel] [PATCH 03/66] dma: keep a device alive while it has SGLists |
Date: |
Thu, 04 Jul 2013 17:59:59 +0200 |
User-agent: |
Mozilla/5.0 (X11; U; Linux i686 (x86_64); de; rv:1.8.1.12) Gecko/20080226 SUSE/2.0.0.12-1.1 Thunderbird/2.0.0.12 Mnenhy/0.7.5.666 |
On 2013-07-04 17:51, Jan Kiszka wrote:
> On 2013-07-04 17:12, Paolo Bonzini wrote:
>> Signed-off-by: Paolo Bonzini <address@hidden>
>> ---
>> dma-helpers.c | 6 +++++-
>> hw/ide/ahci.c | 3 ++-
>> hw/ide/macio.c | 4 ++--
>> hw/scsi/virtio-scsi.c | 10 ++++++----
>> hw/usb/hcd-ehci.c | 4 ++--
>> include/hw/pci/pci.h | 2 +-
>> include/sysemu/dma.h | 4 +++-
>> 7 files changed, 21 insertions(+), 12 deletions(-)
>>
>> diff --git a/dma-helpers.c b/dma-helpers.c
>> index 5afba47..499550f 100644
>> --- a/dma-helpers.c
>> +++ b/dma-helpers.c
>> @@ -34,13 +34,16 @@ int dma_memory_set(AddressSpace *as, dma_addr_t addr,
>> uint8_t c, dma_addr_t len)
>> return error;
>> }
>>
>> -void qemu_sglist_init(QEMUSGList *qsg, int alloc_hint, AddressSpace *as)
>> +void qemu_sglist_init(QEMUSGList *qsg, DeviceState *dev, int alloc_hint,
>> + AddressSpace *as)
>> {
>> qsg->sg = g_malloc(alloc_hint * sizeof(ScatterGatherEntry));
>> qsg->nsg = 0;
>> qsg->nalloc = alloc_hint;
>> qsg->size = 0;
>> qsg->as = as;
>> + qsg->dev = dev;
>> + object_ref(OBJECT(dev));
>> }
>>
>> void qemu_sglist_add(QEMUSGList *qsg, dma_addr_t base, dma_addr_t len)
>> @@ -57,6 +60,7 @@ void qemu_sglist_add(QEMUSGList *qsg, dma_addr_t base,
>> dma_addr_t len)
>>
>> void qemu_sglist_destroy(QEMUSGList *qsg)
>> {
>> + object_unref(OBJECT(qsg->dev));
>> g_free(qsg->sg);
>> memset(qsg, 0, sizeof(*qsg));
>> }
>> diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c
>> index 1adfa0b..6b87549 100644
>> --- a/hw/ide/ahci.c
>> +++ b/hw/ide/ahci.c
>> @@ -691,7 +691,8 @@ static int ahci_populate_sglist(AHCIDevice *ad,
>> QEMUSGList *sglist, int offset)
>> goto out;
>> }
>>
>> - qemu_sglist_init(sglist, (sglist_alloc_hint - off_idx),
>> ad->hba->as);
>> + qemu_sglist_init(sglist, DEVICE(ad->hba), (sglist_alloc_hint -
>> off_idx),
>> + ad->hba->as);
>> qemu_sglist_add(sglist, le64_to_cpu(tbl[off_idx].addr + off_pos),
>> le32_to_cpu(tbl[off_idx].flags_size) + 1 - off_pos);
>>
>> diff --git a/hw/ide/macio.c b/hw/ide/macio.c
>> index a1952b0..84288ae 100644
>> --- a/hw/ide/macio.c
>> +++ b/hw/ide/macio.c
>> @@ -70,7 +70,7 @@ static void pmac_ide_atapi_transfer_cb(void *opaque, int
>> ret)
>>
>> s->io_buffer_size = io->len;
>>
>> - qemu_sglist_init(&s->sg, io->len / MACIO_PAGE_SIZE + 1,
>> + qemu_sglist_init(&s->sg, DEVICE(m), io->len / MACIO_PAGE_SIZE + 1,
>> &address_space_memory);
>> qemu_sglist_add(&s->sg, io->addr, io->len);
>> io->addr += io->len;
>> @@ -127,7 +127,7 @@ static void pmac_ide_transfer_cb(void *opaque, int ret)
>> s->io_buffer_index = 0;
>> s->io_buffer_size = io->len;
>>
>> - qemu_sglist_init(&s->sg, io->len / MACIO_PAGE_SIZE + 1,
>> + qemu_sglist_init(&s->sg, DEVICE(m), io->len / MACIO_PAGE_SIZE + 1,
>> &address_space_memory);
>> qemu_sglist_add(&s->sg, io->addr, io->len);
>> io->addr += io->len;
>> diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c
>> index b8a0abf..712f0ad 100644
>> --- a/hw/scsi/virtio-scsi.c
>> +++ b/hw/scsi/virtio-scsi.c
>> @@ -77,10 +77,12 @@ static void virtio_scsi_bad_req(void)
>> exit(1);
>> }
>>
>> -static void qemu_sgl_init_external(QEMUSGList *qsgl, struct iovec *sg,
>> +static void qemu_sgl_init_external(VirtIOSCSIReq *req, struct iovec *sg,
>> hwaddr *addr, int num)
>> {
>> - qemu_sglist_init(qsgl, num, &address_space_memory);
>> + QEMUSGList *qsgl = &req->qsgl;
>> +
>> + qemu_sglist_init(qsgl, DEVICE(req->dev), num, &address_space_memory);
>> while (num--) {
>> qemu_sglist_add(qsgl, *(addr++), (sg++)->iov_len);
>> }
>> @@ -99,11 +101,11 @@ static void virtio_scsi_parse_req(VirtIOSCSI *s,
>> VirtQueue *vq,
>> req->resp.buf = req->elem.in_sg[0].iov_base;
>>
>> if (req->elem.out_num > 1) {
>> - qemu_sgl_init_external(&req->qsgl, &req->elem.out_sg[1],
>> + qemu_sgl_init_external(req, &req->elem.out_sg[1],
>> &req->elem.out_addr[1],
>> req->elem.out_num - 1);
>> } else {
>> - qemu_sgl_init_external(&req->qsgl, &req->elem.in_sg[1],
>> + qemu_sgl_init_external(req, &req->elem.in_sg[1],
>> &req->elem.in_addr[1],
>> req->elem.in_num - 1);
>> }
>> diff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c
>> index 16d6356..65e6680 100644
>> --- a/hw/usb/hcd-ehci.c
>> +++ b/hw/usb/hcd-ehci.c
>> @@ -1245,7 +1245,7 @@ static int ehci_init_transfer(EHCIPacket *p)
>> cpage = get_field(p->qtd.token, QTD_TOKEN_CPAGE);
>> bytes = get_field(p->qtd.token, QTD_TOKEN_TBYTES);
>> offset = p->qtd.bufptr[0] & ~QTD_BUFPTR_MASK;
>> - qemu_sglist_init(&p->sgl, 5, p->queue->ehci->as);
>> + qemu_sglist_init(&p->sgl, DEVICE(p->queue->ehci), 5,
>> p->queue->ehci->as);
>
> I was just testing this from your current git tree, and it causes
>
> qemu/hw/usb/hcd-ehci.c:1248:ehci_init_transfer: Object 0x7f3eb39c6500 is
> not an instance of type device
>
> when booting a q35 machine (as it pulls in EHCI). The cast is obviously
> wrong, but I didn't spot yet what is required instead.
The problem is that EHCIState is embedded into the actual QOM device
states, but not at a known location. So you likely need a generic device
pointer from EHCIState back to the device using it.
Jan
--
Siemens AG, Corporate Technology, CT RTC ITP SES-DE
Corporate Competence Center Embedded Linux
- [Qemu-devel] [PULL 00/66] Memory API changes for 1.6: ownership, I/O ports, RCU preparation, Paolo Bonzini, 2013/07/04
- [Qemu-devel] [PATCH 04/66] adlib: replace register_ioport*, Paolo Bonzini, 2013/07/04
- [Qemu-devel] [PATCH 05/66] applesmc: replace register_ioport*, Paolo Bonzini, 2013/07/04
- [Qemu-devel] [PATCH 06/66] wdt_ib700: replace register_ioport*, Paolo Bonzini, 2013/07/04
- [Qemu-devel] [PATCH 07/66] i82374: replace register_ioport*, Paolo Bonzini, 2013/07/04
- [Qemu-devel] [PATCH 08/66] prep: replace register_ioport*, Paolo Bonzini, 2013/07/04
- [Qemu-devel] [PATCH 09/66] vt82c686: replace register_ioport*, Paolo Bonzini, 2013/07/04
- [Qemu-devel] [PATCH 10/66] Privatize register_ioport_read/write, Paolo Bonzini, 2013/07/04
- [Qemu-devel] [PATCH 11/66] isa: implement isa_is_ioport_assigned via memory_region_find, Paolo Bonzini, 2013/07/04