All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Benoît Canet" <benoit.canet@irqsave.net>
To: Markus Armbruster <armbru@redhat.com>
Cc: kwolf@redhat.com, benoit.canet@irqsave.net, famz@redhat.com,
	qemu-devel@nongnu.org, stefanha@redhat.com
Subject: Re: [Qemu-devel] [PATCH 06/23] block: Eliminate bdrv_states, use block_next() instead
Date: Thu, 11 Sep 2014 12:25:12 +0200	[thread overview]
Message-ID: <20140911102511.GA8522@irqsave.net> (raw)
In-Reply-To: <1410336832-22160-7-git-send-email-armbru@redhat.com>

The Wednesday 10 Sep 2014 à 10:13:35 (+0200), Markus Armbruster wrote :
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>  block.c                   | 43 +++++++++++++++++++------------------------
>  block/block-backend.c     |  4 ++++
>  include/block/block_int.h |  2 --
>  3 files changed, 23 insertions(+), 26 deletions(-)
> 
> diff --git a/block.c b/block.c
> index a6c03da..89f9cf0 100644
> --- a/block.c
> +++ b/block.c
> @@ -24,6 +24,7 @@
>  #include "config-host.h"
>  #include "qemu-common.h"
>  #include "trace.h"
> +#include "sysemu/block-backend.h"
>  #include "block/block_int.h"
>  #include "block/blockjob.h"
>  #include "qemu/module.h"
> @@ -90,9 +91,6 @@ static void coroutine_fn bdrv_co_do_rw(void *opaque);
>  static int coroutine_fn bdrv_co_do_write_zeroes(BlockDriverState *bs,
>      int64_t sector_num, int nb_sectors, BdrvRequestFlags flags);
>  
> -static QTAILQ_HEAD(, BlockDriverState) bdrv_states =
> -    QTAILQ_HEAD_INITIALIZER(bdrv_states);
> -
>  static QTAILQ_HEAD(, BlockDriverState) graph_bdrv_states =
>      QTAILQ_HEAD_INITIALIZER(graph_bdrv_states);
>  
> @@ -355,9 +353,6 @@ BlockDriverState *bdrv_new_named(const char *device_name, Error **errp)
>      bs = bdrv_new();
>  
>      pstrcpy(bs->device_name, sizeof(bs->device_name), device_name);
> -    if (device_name[0] != '\0') {
> -        QTAILQ_INSERT_TAIL(&bdrv_states, bs, device_list);
> -    }
>  
>      return bs;
>  }
> @@ -1888,7 +1883,7 @@ void bdrv_close_all(void)
>  {
>      BlockDriverState *bs;
>  
> -    QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
> +    for (bs = bdrv_next(NULL); bs; bs = bdrv_next(bs)) {
>          AioContext *aio_context = bdrv_get_aio_context(bs);
>  
>          aio_context_acquire(aio_context);
> @@ -1939,7 +1934,7 @@ void bdrv_drain_all(void)
>      while (busy) {
>          busy = false;
>  
> -        QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
> +        for (bs = bdrv_next(NULL); bs; bs = bdrv_next(bs)) {
>              AioContext *aio_context = bdrv_get_aio_context(bs);
>              bool bs_busy;
>  
> @@ -1960,9 +1955,6 @@ void bdrv_drain_all(void)
>     Also, NULL terminate the device_name to prevent double remove */
>  void bdrv_make_anon(BlockDriverState *bs)
>  {
> -    if (bs->device_name[0] != '\0') {
> -        QTAILQ_REMOVE(&bdrv_states, bs, device_list);
> -    }
>      bs->device_name[0] = '\0';
>      if (bs->node_name[0] != '\0') {
>          QTAILQ_REMOVE(&graph_bdrv_states, bs, node_list);
> @@ -2016,10 +2008,9 @@ static void bdrv_move_feature_fields(BlockDriverState *bs_dest,
>      /* job */
>      bs_dest->job                = bs_src->job;
>  
> -    /* keep the same entry in bdrv_states */
>      pstrcpy(bs_dest->device_name, sizeof(bs_dest->device_name),
>              bs_src->device_name);
> -    bs_dest->device_list = bs_src->device_list;
> +
>      memcpy(bs_dest->op_blockers, bs_src->op_blockers,
>             sizeof(bs_dest->op_blockers));
>  }
> @@ -2363,7 +2354,7 @@ int bdrv_commit_all(void)
>  {
>      BlockDriverState *bs;
>  
> -    QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
> +    for (bs = bdrv_next(NULL); bs; bs = bdrv_next(bs)) {
>          AioContext *aio_context = bdrv_get_aio_context(bs);
>  
>          aio_context_acquire(aio_context);
> @@ -3807,7 +3798,7 @@ BlockDriverState *bdrv_find(const char *name)
>  {
>      BlockDriverState *bs;
>  
> -    QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
> +    for (bs = bdrv_next(NULL); bs; bs = bdrv_next(bs)) {
>          if (!strcmp(name, bs->device_name)) {
>              return bs;
>          }
> @@ -3888,17 +3879,21 @@ bool bdrv_chain_contains(BlockDriverState *top, BlockDriverState *base)
>  
>  BlockDriverState *bdrv_next(BlockDriverState *bs)
>  {
> -    if (!bs) {
> -        return QTAILQ_FIRST(&bdrv_states);
> -    }
> -    return QTAILQ_NEXT(bs, device_list);

> +    BlockBackend *blk;
> +
> +    for (blk = blk_next(bs ? bs->blk : NULL);
> +         blk && !blk_bs(blk);
> +         blk = blk_next(blk))
> +        ;
> +
> +    return blk ? blk_bs(blk) : NULL;

I find ?: hard to read and I know at least one maintainer
prefers simples ifs to it.

BlockDriverState *bdrv_next(BlockDriverState *bs)
{
    BlockBackend *blk = NULL;

    /* if a BDS is provided use it's block backend as a starting point */
    if (bs) {
        blk = bl->blk;
    }

    /* looking for the next block backend having a BDS attached */
    for (blk = blk_next(blk);
         blk && !blk_bs(blk);
         blk = blk_next(blk))
         ;

   /* the search was successfull */
   if (blk) {
       return blk_bs(blk);
   }

   return NULL;
}

I think getting rid of ?: spread the brain load sequentially by being less compact
but anyway your code is correct so it's up to you.

>  }
>  
>  void bdrv_iterate(void (*it)(void *opaque, BlockDriverState *bs), void *opaque)
>  {
>      BlockDriverState *bs;
>  
> -    QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
> +    for (bs = bdrv_next(NULL); bs; bs = bdrv_next(bs)) {
>          it(opaque, bs);
>      }
>  }
> @@ -3918,7 +3913,7 @@ int bdrv_flush_all(void)
>      BlockDriverState *bs;
>      int result = 0;
>  
> -    QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
> +    for (bs = bdrv_next(NULL); bs; bs = bdrv_next(bs)) {
>          AioContext *aio_context = bdrv_get_aio_context(bs);
>          int ret;
>  
> @@ -5065,7 +5060,7 @@ void bdrv_invalidate_cache_all(Error **errp)
>      BlockDriverState *bs;
>      Error *local_err = NULL;
>  
> -    QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
> +    for (bs = bdrv_next(NULL); bs; bs = bdrv_next(bs)) {
>          AioContext *aio_context = bdrv_get_aio_context(bs);
>  
>          aio_context_acquire(aio_context);
> @@ -5082,7 +5077,7 @@ void bdrv_clear_incoming_migration_all(void)
>  {
>      BlockDriverState *bs;
>  
> -    QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
> +    for (bs = bdrv_next(NULL); bs; bs = bdrv_next(bs)) {
>          AioContext *aio_context = bdrv_get_aio_context(bs);
>  
>          aio_context_acquire(aio_context);
> @@ -5918,7 +5913,7 @@ bool bdrv_is_first_non_filter(BlockDriverState *candidate)
>      BlockDriverState *bs;
>  
>      /* walk down the bs forest recursively */
> -    QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
> +    for (bs = bdrv_next(NULL); bs; bs = bdrv_next(bs)) {
>          bool perm;
>  
>          /* try to recurse in this top level bs */
> diff --git a/block/block-backend.c b/block/block-backend.c
> index ae51f7f..c0876fa 100644
> --- a/block/block-backend.c
> +++ b/block/block-backend.c
> @@ -191,6 +191,10 @@ BlockDriverState *blk_detach_bs(BlockBackend *blk)
>  {
>      BlockDriverState *bs = blk->bs;
>  
> +    /*
> +     * Must bdrv_unref() before zapping bs->blk, or else
> +     * bdrv_drain_all() will miss bs.
> +     */
>      if (bs) {
>          bs->blk = NULL;
>          blk->bs = NULL;
> diff --git a/include/block/block_int.h b/include/block/block_int.h
> index a04c852..d5de08b 100644
> --- a/include/block/block_int.h
> +++ b/include/block/block_int.h
> @@ -396,8 +396,6 @@ struct BlockDriverState {
>      QTAILQ_ENTRY(BlockDriverState) node_list;
>      /* Device name is the name associated with the "drive" the guest sees */
>      char device_name[32];
> -    /* element of the list of "drives" the guest sees */
> -    QTAILQ_ENTRY(BlockDriverState) device_list;
>      QLIST_HEAD(, BdrvDirtyBitmap) dirty_bitmaps;
>      int refcnt;
>  
> -- 
> 1.9.3
> 

  reply	other threads:[~2014-09-11 10:26 UTC|newest]

Thread overview: 76+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-10  8:13 [Qemu-devel] [PATCH 00/23] Split BlockBackend off BDS with an axe Markus Armbruster
2014-09-10  8:13 ` [Qemu-devel] [PATCH 01/23] block: Split bdrv_new_named() off bdrv_new() Markus Armbruster
2014-09-10 11:03   ` Benoît Canet
2014-09-10 15:05     ` Eric Blake
2014-09-11  8:20       ` Markus Armbruster
2014-09-11  8:29     ` Markus Armbruster
2014-09-10 15:07   ` Eric Blake
2014-09-10 15:27   ` Benoît Canet
2014-09-10 21:22   ` Benoît Canet
2014-09-11  6:33   ` Fam Zheng
2014-09-10  8:13 ` [Qemu-devel] [PATCH 02/23] block: New BlockBackend Markus Armbruster
2014-09-10  9:56   ` Kevin Wolf
2014-09-11 10:03     ` Markus Armbruster
2014-09-11 11:45       ` Markus Armbruster
2014-09-11 14:38       ` Markus Armbruster
2014-09-10 11:34   ` Benoît Canet
2014-09-10 11:44     ` Kevin Wolf
2014-09-10 11:51       ` Benoît Canet
2014-09-11 10:11     ` Markus Armbruster
2014-09-10 12:40   ` Benoît Canet
2014-09-10 12:46     ` Benoît Canet
2014-09-11 10:22       ` Markus Armbruster
2014-09-11 10:21     ` Markus Armbruster
2014-09-10  8:13 ` [Qemu-devel] [PATCH 03/23] block: Connect BlockBackend to BlockDriverState Markus Armbruster
2014-09-10 11:55   ` Benoît Canet
2014-09-11 10:52     ` Markus Armbruster
2014-09-10 12:24   ` Kevin Wolf
2014-09-11 15:27     ` Markus Armbruster
2014-09-10  8:13 ` [Qemu-devel] [PATCH 04/23] block: Connect BlockBackend and DriveInfo Markus Armbruster
2014-09-10 13:08   ` Benoît Canet
2014-09-11 18:03     ` Markus Armbruster
2014-09-11 20:43       ` Eric Blake
2014-09-10 13:30   ` Kevin Wolf
2014-09-11 17:41     ` Markus Armbruster
2014-09-10  8:13 ` [Qemu-devel] [PATCH 05/23] block: Make BlockBackend own its BlockDriverState Markus Armbruster
2014-09-10 10:14   ` Kevin Wolf
2014-09-11 18:38     ` Markus Armbruster
2014-09-10  8:13 ` [Qemu-devel] [PATCH 06/23] block: Eliminate bdrv_states, use block_next() instead Markus Armbruster
2014-09-11 10:25   ` Benoît Canet [this message]
2014-09-10  8:13 ` [Qemu-devel] [PATCH 07/23] block: Eliminate bdrv_iterate(), use bdrv_next() Markus Armbruster
2014-09-11 10:46   ` Benoît Canet
2014-09-11 18:44     ` Markus Armbruster
2014-09-10  8:13 ` [Qemu-devel] [PATCH 08/23] block: Eliminate BlockDriverState member device_name[] Markus Armbruster
2014-09-10 16:09   ` Eric Blake
2014-09-11 18:45     ` Markus Armbruster
2014-09-11 11:34   ` Benoît Canet
2014-09-11 11:43     ` Benoît Canet
2014-09-11 13:00     ` Eric Blake
2014-09-11 13:18       ` Benoît Canet
2014-09-11 19:11         ` Markus Armbruster
2014-09-11 19:01     ` Markus Armbruster
2014-09-10  8:13 ` [Qemu-devel] [PATCH 09/23] block: Merge BlockBackend and BlockDriverState name spaces Markus Armbruster
2014-09-10  8:13 ` [Qemu-devel] [PATCH 10/23] block: Eliminate DriveInfo member bdrv, use blk_by_legacy_dinfo() Markus Armbruster
2014-09-11 12:07   ` Benoît Canet
2014-09-11 19:20     ` Markus Armbruster
2014-09-11 17:06   ` Benoît Canet
2014-09-11 19:12     ` Markus Armbruster
2014-09-11 19:34       ` Benoît Canet
2014-09-11 19:40         ` Eric Blake
2014-09-12  6:38           ` Markus Armbruster
2014-09-10  8:13 ` [Qemu-devel] [PATCH 11/23] block: Rename BlockDriverAIOCB* to BlockAIOCB* Markus Armbruster
2014-09-11 12:15   ` Benoît Canet
2014-09-11 19:23     ` Markus Armbruster
2014-09-10  8:13 ` [Qemu-devel] [PATCH 12/23] virtio-blk: Drop redundant VirtIOBlock member conf Markus Armbruster
2014-09-10  8:13 ` [Qemu-devel] [PATCH 13/23] virtio-blk: Rename VirtIOBlkConf variables to conf Markus Armbruster
2014-09-10  8:13 ` [Qemu-devel] [PATCH 14/23] hw: Convert from BlockDriverState to BlockBackend, mostly Markus Armbruster
2014-09-10  8:13 ` [Qemu-devel] [PATCH 15/23] ide: Complete conversion from BlockDriverState to BlockBackend Markus Armbruster
2014-09-10  8:13 ` [Qemu-devel] [PATCH 16/23] pc87312: Drop unused members of PC87312State Markus Armbruster
2014-09-10  8:13 ` [Qemu-devel] [PATCH 17/23] blockdev: Drop superfluous DriveInfo member id Markus Armbruster
2014-09-10  8:13 ` [Qemu-devel] [PATCH 18/23] blockdev: Fix blockdev-add not to create IDE drive (0, 0) Markus Armbruster
2014-09-10  8:13 ` [Qemu-devel] [PATCH 19/23] blockdev: Drop DriveInfo member enable_auto_del Markus Armbruster
2014-09-10  8:13 ` [Qemu-devel] [PATCH 20/23] block/qapi: Convert qmp_query_block() to BlockBackend Markus Armbruster
2014-09-10  8:13 ` [Qemu-devel] [PATCH 21/23] blockdev: Convert qmp_eject(), qmp_change_blockdev() " Markus Armbruster
2014-09-10  8:13 ` [Qemu-devel] [PATCH 22/23] block: Lift device model API into BlockBackend Markus Armbruster
2014-09-10  8:13 ` [Qemu-devel] [PATCH 23/23] block: Make device model's references to BlockBackend strong Markus Armbruster
2014-09-11 19:24 ` [Qemu-devel] [PATCH 00/23] Split BlockBackend off BDS with an axe Markus Armbruster

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=20140911102511.GA8522@irqsave.net \
    --to=benoit.canet@irqsave.net \
    --cc=armbru@redhat.com \
    --cc=famz@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    /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.