* [PATCH] Fix stdvga performance for 32bit ops
@ 2007-10-31 20:28 Ben Guthro
2007-10-31 21:59 ` Keir Fraser
0 siblings, 1 reply; 5+ messages in thread
From: Ben Guthro @ 2007-10-31 20:28 UTC (permalink / raw)
To: xen-devel; +Cc: Robert Phillips
[-- Attachment #1.1: Type: text/plain, Size: 362 bytes --]
Corrected a bug in the stdvga code where it did not
properly handle 32 bit operations.
The buf_ioreq_t can now store 32 bits of data.
Because this increases its size to 8 bytes,
only 510 elements fit in the buffered_iopage
(down from 672 elements).
Signed-off-by: Robert Phillips <rphillips@virtualiron.com>
Signed-off-by: Ben Guthro <bguthro@virtualiron.com>
[-- Attachment #1.2: Type: text/html, Size: 707 bytes --]
[-- Attachment #2: stdvga-32b.patch --]
[-- Type: text/x-patch, Size: 4658 bytes --]
diff -r 15c6e8698fda tools/ioemu/target-i386-dm/helper2.c
--- a/tools/ioemu/target-i386-dm/helper2.c Wed Oct 31 15:07:54 2007 -0400
+++ b/tools/ioemu/target-i386-dm/helper2.c Wed Oct 31 15:08:02 2007 -0400
@@ -554,20 +554,17 @@ void __handle_buffered_iopage(CPUState *
IOREQ_BUFFER_SLOT_NUM];
req.size = 1UL << buf_req->size;
req.count = 1;
+ req.addr = buf_req->addr;
req.data = buf_req->data;
req.state = STATE_IOREQ_READY;
req.dir = buf_req->dir;
req.type = buf_req->type;
qw = req.size == 8;
if (qw) {
- req.data |= ((uint64_t)buf_req->addr) << 16;
buf_req = &buffered_io_page->buf_ioreq[(buffered_io_page->read_pointer+1) %
IOREQ_BUFFER_SLOT_NUM];
req.data |= ((uint64_t)buf_req->data) << 32;
- req.data |= ((uint64_t)buf_req->addr) << 48;
- }
- else
- req.addr = buf_req->addr;
+ }
__handle_ioreq(env, &req);
diff -r 15c6e8698fda xen/arch/x86/hvm/intercept.c
--- a/xen/arch/x86/hvm/intercept.c Wed Oct 31 15:07:54 2007 -0400
+++ b/xen/arch/x86/hvm/intercept.c Wed Oct 31 15:08:02 2007 -0400
@@ -163,8 +163,11 @@ int hvm_buffered_io_send(ioreq_t *p)
BUILD_BUG_ON(sizeof(buffered_iopage_t) > PAGE_SIZE);
/* Return 0 for the cases we can't deal with. */
- if (p->addr > 0xffffful || p->data_is_ptr || p->df || p->count != 1)
- return 0;
+ if (p->addr > 0xffffful || p->data_is_ptr || p->df || p->count != 1) {
+ gdprintk(XENLOG_DEBUG, "slow ioreq. type:%d size:%ld addr:0x%08lx dir:%d ptr:%d df:%d count:%ld\n",
+ p->type, p->size, p->addr, !!p->dir, !!p->data_is_ptr, !!p->df, p->count);
+ return 0;
+ }
bp.type = p->type;
bp.dir = p->dir;
@@ -181,7 +184,6 @@ int hvm_buffered_io_send(ioreq_t *p)
case 8:
bp.size = 3;
qw = 1;
- gdprintk(XENLOG_INFO, "quadword ioreq type:%d data:%ld\n", p->type, p->data);
break;
default:
gdprintk(XENLOG_WARNING, "unexpected ioreq size:%ld\n", p->size);
@@ -189,7 +191,7 @@ int hvm_buffered_io_send(ioreq_t *p)
}
bp.data = p->data;
- bp.addr = qw ? ((p->data >> 16) & 0xfffful) : (p->addr & 0xffffful);
+ bp.addr = p->addr;
spin_lock(&iorp->lock);
@@ -205,7 +207,6 @@ int hvm_buffered_io_send(ioreq_t *p)
if (qw) {
bp.data = p->data >> 32;
- bp.addr = (p->data >> 48) & 0xfffful;
memcpy(&pg->buf_ioreq[(pg->write_pointer+1) % IOREQ_BUFFER_SLOT_NUM],
&bp, sizeof(bp));
}
diff -r 15c6e8698fda xen/arch/x86/hvm/stdvga.c
--- a/xen/arch/x86/hvm/stdvga.c Wed Oct 31 15:07:54 2007 -0400
+++ b/xen/arch/x86/hvm/stdvga.c Wed Oct 31 15:08:02 2007 -0400
@@ -273,9 +273,12 @@ int stdvga_intercept_pio(ioreq_t *p)
}
spin_lock(&s->lock);
+
if ( p->dir == IOREQ_READ ) {
if (p->size != 1)
gdprintk(XENLOG_WARNING, "unexpected io size:%d\n", (int)p->size);
+ if (p->data_is_ptr)
+ gdprintk(XENLOG_WARNING, "unexpected data_is_ptr\n");
if (!(p->addr == 0x3c5 && s->sr_index >= sizeof(sr_mask)) &&
!(p->addr == 0x3cf && s->gr_index >= sizeof(gr_mask)))
{
@@ -591,6 +594,9 @@ int stdvga_intercept_mmio(ioreq_t *p)
s->cache = 0;
}
}
+ else
+ buf = p->dir == IOREQ_WRITE;
+
if (buf && hvm_buffered_io_send(p)) {
UPDATE_STATS(p->dir == IOREQ_READ ? s->stats.nr_mmio_buffered_rd++ : s->stats.nr_mmio_buffered_wr++);
spin_unlock(&s->lock);
diff -r 15c6e8698fda xen/include/public/hvm/ioreq.h
--- a/xen/include/public/hvm/ioreq.h Wed Oct 31 15:07:54 2007 -0400
+++ b/xen/include/public/hvm/ioreq.h Wed Oct 31 15:07:57 2007 -0400
@@ -82,13 +82,13 @@ struct buf_ioreq {
struct buf_ioreq {
uint8_t type; /* I/O type */
uint8_t dir:1; /* 1=read, 0=write */
- uint8_t size:2; /* 0=>1, 1=>2, 3=>8. If 8 then use two contig buf_ioreqs */
- uint32_t addr:20; /* physical address or high-order data */
- uint16_t data; /* (low order) data */
+ uint8_t size:2; /* 0=>1, 1=>2, 2=>4, 3=>8. If 8 then use two contig buf_ioreqs */
+ uint32_t addr:20;/* physical address */
+ uint32_t data; /* data */
};
typedef struct buf_ioreq buf_ioreq_t;
-#define IOREQ_BUFFER_SLOT_NUM 672
+#define IOREQ_BUFFER_SLOT_NUM 510
struct buffered_iopage {
volatile unsigned int read_pointer;
volatile unsigned int write_pointer;
[-- Attachment #3: Type: text/plain, Size: 138 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] Fix stdvga performance for 32bit ops
2007-10-31 20:28 [PATCH] Fix stdvga performance for 32bit ops Ben Guthro
@ 2007-10-31 21:59 ` Keir Fraser
2007-10-31 23:37 ` Robert Phillips
2007-11-01 16:33 ` Alex Williamson
0 siblings, 2 replies; 5+ messages in thread
From: Keir Fraser @ 2007-10-31 21:59 UTC (permalink / raw)
To: Ben Guthro, xen-devel; +Cc: Robert Phillips
[-- Attachment #1.1: Type: text/plain, Size: 406 bytes --]
511 entries? 511*8 + 8 bytes for the read/write pointers == 4096?
-- Keir
On 31/10/07 20:28, "Ben Guthro" <bguthro@virtualiron.com> wrote:
> Corrected a bug in the stdvga code where it did not
> properly handle 32 bit operations.
> The buf_ioreq_t can now store 32 bits of data.
> Because this increases its size to 8 bytes,
> only 510 elements fit in the buffered_iopage
> (down from 672 elements).
[-- Attachment #1.2: Type: text/html, Size: 848 bytes --]
[-- Attachment #2: Type: text/plain, Size: 138 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] Fix stdvga performance for 32bit ops
2007-10-31 21:59 ` Keir Fraser
@ 2007-10-31 23:37 ` Robert Phillips
2007-11-01 16:33 ` Alex Williamson
1 sibling, 0 replies; 5+ messages in thread
From: Robert Phillips @ 2007-10-31 23:37 UTC (permalink / raw)
To: Keir Fraser; +Cc: xen-devel, Ben Guthro
[-- Attachment #1.1: Type: text/plain, Size: 520 bytes --]
Yes, it should be 511.
Thanks.
-- rsp
On 10/31/07, Keir Fraser <Keir.Fraser@cl.cam.ac.uk> wrote:
>
> 511 entries? 511*8 + 8 bytes for the read/write pointers == 4096?
>
> -- Keir
>
> On 31/10/07 20:28, "Ben Guthro" <bguthro@virtualiron.com> wrote:
>
> Corrected a bug in the stdvga code where it did not
> properly handle 32 bit operations.
> The buf_ioreq_t can now store 32 bits of data.
> Because this increases its size to 8 bytes,
> only 510 elements fit in the buffered_iopage
> (down from 672 elements).
>
>
>
[-- Attachment #1.2: Type: text/html, Size: 1294 bytes --]
[-- Attachment #2: Type: text/plain, Size: 138 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] Fix stdvga performance for 32bit ops
2007-10-31 21:59 ` Keir Fraser
2007-10-31 23:37 ` Robert Phillips
@ 2007-11-01 16:33 ` Alex Williamson
2007-11-01 17:28 ` Keir Fraser
1 sibling, 1 reply; 5+ messages in thread
From: Alex Williamson @ 2007-11-01 16:33 UTC (permalink / raw)
To: Keir Fraser; +Cc: xen-devel, Robert Phillips, Ben Guthro
On Wed, 2007-10-31 at 21:59 +0000, Keir Fraser wrote:
> 511 entries? 511*8 + 8 bytes for the read/write pointers == 4096?
>
> -- Keir
>
> On 31/10/07 20:28, "Ben Guthro" <bguthro@virtualiron.com> wrote:
>
> Corrected a bug in the stdvga code where it did not
> properly handle 32 bit operations.
> The buf_ioreq_t can now store 32 bits of data.
> Because this increases its size to 8 bytes,
> only 510 elements fit in the buffered_iopage
> (down from 672 elements).
Aren't we relying on some compiler dependent packing to get this to 8
bytes? I think it'd be best if we were more explicit in the definition.
Thanks,
Alex
Signed-off-by: Alex Williamson <alex.williamson@hp.com>
---
diff -r 4255ca79f9d9 xen/include/public/hvm/ioreq.h
--- a/xen/include/public/hvm/ioreq.h Thu Nov 01 09:07:16 2007 -0600
+++ b/xen/include/public/hvm/ioreq.h Thu Nov 01 09:45:47 2007 -0600
@@ -78,10 +78,10 @@ typedef struct shared_iopage shared_iopa
typedef struct shared_iopage shared_iopage_t;
struct buf_ioreq {
- uint8_t type; /* I/O type */
- uint8_t dir:1; /* 1=read, 0=write */
- uint8_t size:2; /* 0=>1, 1=>2, 2=>4, 3=>8. If 8, use two buf_ioreqs */
uint32_t addr:20;/* physical address */
+ uint32_t type:8; /* I/O type */
+ uint32_t dir:1; /* 1=read, 0=write */
+ uint32_t size:2; /* 0=>1, 1=>2, 2=>4, 3=>8. If 8, use two buf_ioreqs */
uint32_t data; /* data */
};
typedef struct buf_ioreq buf_ioreq_t;
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] Fix stdvga performance for 32bit ops
2007-11-01 16:33 ` Alex Williamson
@ 2007-11-01 17:28 ` Keir Fraser
0 siblings, 0 replies; 5+ messages in thread
From: Keir Fraser @ 2007-11-01 17:28 UTC (permalink / raw)
To: Alex Williamson; +Cc: xen-devel, Robert Phillips, Ben Guthro
On 1/11/07 16:33, "Alex Williamson" <alex.williamson@hp.com> wrote:
>> Corrected a bug in the stdvga code where it did not
>> properly handle 32 bit operations.
>> The buf_ioreq_t can now store 32 bits of data.
>> Because this increases its size to 8 bytes,
>> only 510 elements fit in the buffered_iopage
>> (down from 672 elements).
>
> Aren't we relying on some compiler dependent packing to get this to 8
> bytes? I think it'd be best if we were more explicit in the definition.
> Thanks,
If gcc gets it right, that's good enough. We always build Xen and ioemu with
gcc.
-- Keir
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2007-11-01 17:28 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-10-31 20:28 [PATCH] Fix stdvga performance for 32bit ops Ben Guthro
2007-10-31 21:59 ` Keir Fraser
2007-10-31 23:37 ` Robert Phillips
2007-11-01 16:33 ` Alex Williamson
2007-11-01 17:28 ` Keir Fraser
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.