All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ashijeet Acharya <ashijeetacharya@gmail.com>
To: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
Cc: Thomas Huth <thuth@redhat.com>,
	Juan Quintela <quintela@redhat.com>,
	Amit Shah <amit.shah@redhat.com>,
	"Daniel P. Berrange" <berrange@redhat.com>,
	Paolo Bonzini <pbonzini@redhat.com>, Greg Kurz <groug@kaod.org>,
	QEMU Developers <qemu-devel@nongnu.org>
Subject: Re: [Qemu-devel] [PATCH v2] migrate: Introduce zero RAM checks to skip RAM migration
Date: Wed, 8 Feb 2017 18:37:07 +0530	[thread overview]
Message-ID: <CAC2QTZYwyHoHx5K7b4RNiHccCTWq_sc-LuwNNoQE_QnDfR64Pg@mail.gmail.com> (raw)
In-Reply-To: <20170208112542.GC2341@work-vm>

On Wed, Feb 8, 2017 at 4:55 PM, Dr. David Alan Gilbert
<dgilbert@redhat.com> wrote:
> * Ashijeet Acharya (ashijeetacharya@gmail.com) wrote:
>> Migration of a "none" machine with no RAM crashes abruptly as
>> bitmap_new() fails and thus aborts. Instead place zero RAM checks at
>> appropriate places to skip migration of RAM in this case and complete
>> migration successfully for devices only.
>>
>> Signed-off-by: Ashijeet Acharya <ashijeetacharya@gmail.com>
>
> Yes it seems to work, but there is a small bug,
> if we look at:
>
> static void ram_migration_cleanup(void *opaque)
> {
>     /* caller have hold iothread lock or is in a bh, so there is
>      * no writing race against this migration_bitmap
>      */
>     struct BitmapRcu *bitmap = migration_bitmap_rcu;
>     atomic_rcu_set(&migration_bitmap_rcu, NULL);
>     if (bitmap) {
>         memory_global_dirty_log_stop();
>         call_rcu(bitmap, migration_bitmap_free, rcu);
>     }
>
>
> we see it doesn't cause memory_global_dirty_log_stop
> if migration_bitmap_rcu is NULL; so we end up
> still calling dirty_log_start in ram_save_init but
> never call stop.
>

Exactly. This is what kept bugging me too, which is why I asked you on
the IRC the other day (if you vaguely remember) about whether I will
have to handle cleanup separately...Maybe I didn't frame it well that
day.

> I suggest you change it to:
>
>     migration_bitmap_rcu = g_new0(struct BitmapRcu, 1);
>     if (ram_bytes_total()) {
>         ram_bitmap_pages = last_ram_offset() >> TARGET_PAGE_BITS;
>         migration_bitmap_rcu->bmap = bitmap_new(ram_bitmap_pages);
>         bitmap_set(migration_bitmap_rcu->bmap, 0, ram_bitmap_pages);
>
> The cleanup routine still causes the dirty_log_stop() then.

Right, I will do that.

Ashijeet

> Dave
>
>> ---
>> Changes in v2:
>> - try to migrate successfully by skipping RAM (Paolo, Greg)
>> - drop the idea of erroring out and failing nicely
>>  migration/ram.c | 22 +++++++++++++++-------
>>  1 file changed, 15 insertions(+), 7 deletions(-)
>>
>> diff --git a/migration/ram.c b/migration/ram.c
>> index ef8fadf..2f19566 100644
>> --- a/migration/ram.c
>> +++ b/migration/ram.c
>> @@ -1325,6 +1325,11 @@ static int ram_find_and_save_block(QEMUFile *f, bool last_stage,
>>      ram_addr_t dirty_ram_abs; /* Address of the start of the dirty page in
>>                                   ram_addr_t space */
>>
>> +    /* No dirty page as there is zero RAM */
>> +    if (!ram_bytes_total()) {
>> +        return pages;
>> +    }
>> +
>>      pss.block = last_seen_block;
>>      pss.offset = last_offset;
>>      pss.complete_round = false;
>> @@ -1912,14 +1917,17 @@ static int ram_save_init_globals(void)
>>      bytes_transferred = 0;
>>      reset_ram_globals();
>>
>> -    ram_bitmap_pages = last_ram_offset() >> TARGET_PAGE_BITS;
>> -    migration_bitmap_rcu = g_new0(struct BitmapRcu, 1);
>> -    migration_bitmap_rcu->bmap = bitmap_new(ram_bitmap_pages);
>> -    bitmap_set(migration_bitmap_rcu->bmap, 0, ram_bitmap_pages);
>> +    /* Skip setting bitmap if there is no RAM */
>> +    if (ram_bytes_total()) {
>> +        ram_bitmap_pages = last_ram_offset() >> TARGET_PAGE_BITS;
>> +        migration_bitmap_rcu = g_new0(struct BitmapRcu, 1);
>> +        migration_bitmap_rcu->bmap = bitmap_new(ram_bitmap_pages);
>> +        bitmap_set(migration_bitmap_rcu->bmap, 0, ram_bitmap_pages);
>>
>> -    if (migrate_postcopy_ram()) {
>> -        migration_bitmap_rcu->unsentmap = bitmap_new(ram_bitmap_pages);
>> -        bitmap_set(migration_bitmap_rcu->unsentmap, 0, ram_bitmap_pages);
>> +        if (migrate_postcopy_ram()) {
>> +            migration_bitmap_rcu->unsentmap = bitmap_new(ram_bitmap_pages);
>> +            bitmap_set(migration_bitmap_rcu->unsentmap, 0, ram_bitmap_pages);
>> +        }
>>      }
>>
>>      /*
>> --
>> 2.6.2
>>
> --
> Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK

  reply	other threads:[~2017-02-08 13:07 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-02-03 10:36 [Qemu-devel] [PATCH v2] migrate: Introduce zero RAM checks to skip RAM migration Ashijeet Acharya
2017-02-03 17:14 ` Paolo Bonzini
2017-02-03 17:17   ` Ashijeet Acharya
2017-02-08 11:25 ` Dr. David Alan Gilbert
2017-02-08 13:07   ` Ashijeet Acharya [this message]
2017-02-08 11:49 ` Thomas Huth
2017-02-08 13:48   ` Ashijeet Acharya

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=CAC2QTZYwyHoHx5K7b4RNiHccCTWq_sc-LuwNNoQE_QnDfR64Pg@mail.gmail.com \
    --to=ashijeetacharya@gmail.com \
    --cc=amit.shah@redhat.com \
    --cc=berrange@redhat.com \
    --cc=dgilbert@redhat.com \
    --cc=groug@kaod.org \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.com \
    --cc=thuth@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.