* [Qemu-devel] [PATCH block v1 1/2] block: m25p80: sync_page(): Deindent function body.
@ 2014-06-19 1:36 Peter Crosthwaite
2014-06-19 1:36 ` [Qemu-devel] [PATCH block v1 2/2] block: m25p80: Support read only bdrvs Peter Crosthwaite
2014-06-19 3:21 ` [Qemu-devel] [PATCH block v1 1/2] block: m25p80: sync_page(): Deindent function body Stefan Hajnoczi
0 siblings, 2 replies; 5+ messages in thread
From: Peter Crosthwaite @ 2014-06-19 1:36 UTC (permalink / raw)
To: qemu-devel; +Cc: stefanha
sync_page() was conditionalizing it's whole fn body on the bdrv being
non-null. Just return for the function immediately on NULL brdv and
get rid of the big if.
Makes implementation consistent with flash_zynq_area().
Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
---
hw/block/m25p80.c | 24 +++++++++++++-----------
1 file changed, 13 insertions(+), 11 deletions(-)
diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
index 4076114..e4ef733 100644
--- a/hw/block/m25p80.c
+++ b/hw/block/m25p80.c
@@ -288,18 +288,20 @@ static void bdrv_sync_complete(void *opaque, int ret)
static void flash_sync_page(Flash *s, int page)
{
- if (s->bdrv) {
- int bdrv_sector, nb_sectors;
- QEMUIOVector iov;
-
- bdrv_sector = (page * s->pi->page_size) / BDRV_SECTOR_SIZE;
- nb_sectors = DIV_ROUND_UP(s->pi->page_size, BDRV_SECTOR_SIZE);
- qemu_iovec_init(&iov, 1);
- qemu_iovec_add(&iov, s->storage + bdrv_sector * BDRV_SECTOR_SIZE,
- nb_sectors * BDRV_SECTOR_SIZE);
- bdrv_aio_writev(s->bdrv, bdrv_sector, &iov, nb_sectors,
- bdrv_sync_complete, NULL);
+ int bdrv_sector, nb_sectors;
+ QEMUIOVector iov;
+
+ if (!s->bdrv) {
+ return;
}
+
+ bdrv_sector = (page * s->pi->page_size) / BDRV_SECTOR_SIZE;
+ nb_sectors = DIV_ROUND_UP(s->pi->page_size, BDRV_SECTOR_SIZE);
+ qemu_iovec_init(&iov, 1);
+ qemu_iovec_add(&iov, s->storage + bdrv_sector * BDRV_SECTOR_SIZE,
+ nb_sectors * BDRV_SECTOR_SIZE);
+ bdrv_aio_writev(s->bdrv, bdrv_sector, &iov, nb_sectors, bdrv_sync_complete,
+ NULL);
}
static inline void flash_sync_area(Flash *s, int64_t off, int64_t len)
--
2.0.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [Qemu-devel] [PATCH block v1 2/2] block: m25p80: Support read only bdrvs.
2014-06-19 1:36 [Qemu-devel] [PATCH block v1 1/2] block: m25p80: sync_page(): Deindent function body Peter Crosthwaite
@ 2014-06-19 1:36 ` Peter Crosthwaite
2014-06-19 9:08 ` Paolo Bonzini
2014-06-19 3:21 ` [Qemu-devel] [PATCH block v1 1/2] block: m25p80: sync_page(): Deindent function body Stefan Hajnoczi
1 sibling, 1 reply; 5+ messages in thread
From: Peter Crosthwaite @ 2014-06-19 1:36 UTC (permalink / raw)
To: qemu-devel; +Cc: stefanha
By just never doing write-backs. This is completely invisible to the
guest, as the entire storage area is implemented as device state (at
realize time the entire drive is read in).
Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
---
hw/block/m25p80.c | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
index e4ef733..5893773 100644
--- a/hw/block/m25p80.c
+++ b/hw/block/m25p80.c
@@ -291,7 +291,7 @@ static void flash_sync_page(Flash *s, int page)
int bdrv_sector, nb_sectors;
QEMUIOVector iov;
- if (!s->bdrv) {
+ if (!s->bdrv || bdrv_is_read_only(s->bdrv)) {
return;
}
@@ -309,7 +309,7 @@ static inline void flash_sync_area(Flash *s, int64_t off, int64_t len)
int64_t start, end, nb_sectors;
QEMUIOVector iov;
- if (!s->bdrv) {
+ if (!s->bdrv || bdrv_is_read_only(s->bdrv)) {
return;
}
@@ -627,10 +627,6 @@ static int m25p80_init(SSISlave *ss)
if (dinfo && dinfo->bdrv) {
DB_PRINT_L(0, "Binding to IF_MTD drive\n");
s->bdrv = dinfo->bdrv;
- if (bdrv_is_read_only(s->bdrv)) {
- fprintf(stderr, "Can't use a read-only drive");
- return 1;
- }
/* FIXME: Move to late init */
if (bdrv_read(s->bdrv, 0, s->storage, DIV_ROUND_UP(s->size,
--
2.0.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [Qemu-devel] [PATCH block v1 1/2] block: m25p80: sync_page(): Deindent function body.
2014-06-19 1:36 [Qemu-devel] [PATCH block v1 1/2] block: m25p80: sync_page(): Deindent function body Peter Crosthwaite
2014-06-19 1:36 ` [Qemu-devel] [PATCH block v1 2/2] block: m25p80: Support read only bdrvs Peter Crosthwaite
@ 2014-06-19 3:21 ` Stefan Hajnoczi
1 sibling, 0 replies; 5+ messages in thread
From: Stefan Hajnoczi @ 2014-06-19 3:21 UTC (permalink / raw)
To: Peter Crosthwaite; +Cc: qemu-devel, stefanha
[-- Attachment #1: Type: text/plain, Size: 682 bytes --]
On Wed, Jun 18, 2014 at 06:36:03PM -0700, Peter Crosthwaite wrote:
> sync_page() was conditionalizing it's whole fn body on the bdrv being
> non-null. Just return for the function immediately on NULL brdv and
> get rid of the big if.
>
> Makes implementation consistent with flash_zynq_area().
>
> Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
> ---
>
> hw/block/m25p80.c | 24 +++++++++++++-----------
> 1 file changed, 13 insertions(+), 11 deletions(-)
I don't know the hardware in question but from a block layer standpoint,
this series is fine.
Thanks, applied to my block tree:
https://github.com/stefanha/qemu/commits/block
Stefan
[-- Attachment #2: Type: application/pgp-signature, Size: 473 bytes --]
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Qemu-devel] [PATCH block v1 2/2] block: m25p80: Support read only bdrvs.
2014-06-19 1:36 ` [Qemu-devel] [PATCH block v1 2/2] block: m25p80: Support read only bdrvs Peter Crosthwaite
@ 2014-06-19 9:08 ` Paolo Bonzini
2014-06-21 9:06 ` Stefan Hajnoczi
0 siblings, 1 reply; 5+ messages in thread
From: Paolo Bonzini @ 2014-06-19 9:08 UTC (permalink / raw)
To: Peter Crosthwaite, qemu-devel; +Cc: stefanha
> static void bdrv_sync_complete(void *opaque, int ret)
> {
> /* do nothing. Masters do not directly interact with the backing store,
> * only the working copy so no mutexing required.
> */
> }
>
> static void flash_sync_page(Flash *s, int page)
> {
> if (s->bdrv) {
> int bdrv_sector, nb_sectors;
> QEMUIOVector iov;
>
> bdrv_sector = (page * s->pi->page_size) / BDRV_SECTOR_SIZE;
> nb_sectors = DIV_ROUND_UP(s->pi->page_size, BDRV_SECTOR_SIZE);
> qemu_iovec_init(&iov, 1);
> qemu_iovec_add(&iov, s->storage + bdrv_sector * BDRV_SECTOR_SIZE,
> nb_sectors * BDRV_SECTOR_SIZE);
> bdrv_aio_writev(s->bdrv, bdrv_sector, &iov, nb_sectors,
> bdrv_sync_complete, NULL);
> }
> }
Using AIO is a good idea, but you could have overlapping writes here if
you get close calls to flash_sync_page. It can be bad.
Serializing can be done in fancy manners, but it can be as easy as
adding bdrv_drain(s->bdrv) before the bdrv_aio_writev.
Paolo
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Qemu-devel] [PATCH block v1 2/2] block: m25p80: Support read only bdrvs.
2014-06-19 9:08 ` Paolo Bonzini
@ 2014-06-21 9:06 ` Stefan Hajnoczi
0 siblings, 0 replies; 5+ messages in thread
From: Stefan Hajnoczi @ 2014-06-21 9:06 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: Peter Crosthwaite, qemu-devel, stefanha
[-- Attachment #1: Type: text/plain, Size: 1409 bytes --]
On Thu, Jun 19, 2014 at 11:08:42AM +0200, Paolo Bonzini wrote:
> >static void bdrv_sync_complete(void *opaque, int ret)
> >{
> > /* do nothing. Masters do not directly interact with the backing store,
> > * only the working copy so no mutexing required.
> > */
> >}
> >
> >static void flash_sync_page(Flash *s, int page)
> >{
> > if (s->bdrv) {
> > int bdrv_sector, nb_sectors;
> > QEMUIOVector iov;
> >
> > bdrv_sector = (page * s->pi->page_size) / BDRV_SECTOR_SIZE;
> > nb_sectors = DIV_ROUND_UP(s->pi->page_size, BDRV_SECTOR_SIZE);
> > qemu_iovec_init(&iov, 1);
> > qemu_iovec_add(&iov, s->storage + bdrv_sector * BDRV_SECTOR_SIZE,
> > nb_sectors * BDRV_SECTOR_SIZE);
> > bdrv_aio_writev(s->bdrv, bdrv_sector, &iov, nb_sectors,
> > bdrv_sync_complete, NULL);
> > }
> >}
>
> Using AIO is a good idea, but you could have overlapping writes here if you
> get close calls to flash_sync_page. It can be bad.
>
> Serializing can be done in fancy manners, but it can be as easy as adding
> bdrv_drain(s->bdrv) before the bdrv_aio_writev.
Since this issue was present before the patch and not caused by this
series I'm keeping it in the block queue.
It would be nice to address this in a separate series.
Stefan
[-- Attachment #2: Type: application/pgp-signature, Size: 473 bytes --]
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2014-06-21 9:06 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-06-19 1:36 [Qemu-devel] [PATCH block v1 1/2] block: m25p80: sync_page(): Deindent function body Peter Crosthwaite
2014-06-19 1:36 ` [Qemu-devel] [PATCH block v1 2/2] block: m25p80: Support read only bdrvs Peter Crosthwaite
2014-06-19 9:08 ` Paolo Bonzini
2014-06-21 9:06 ` Stefan Hajnoczi
2014-06-19 3:21 ` [Qemu-devel] [PATCH block v1 1/2] block: m25p80: sync_page(): Deindent function body Stefan Hajnoczi
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.