qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [v7 10/14] migration: Add the core code for decompressi


From: Juan Quintela
Subject: Re: [Qemu-devel] [v7 10/14] migration: Add the core code for decompression
Date: Wed, 08 Apr 2015 16:48:39 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.4 (gnu/linux)

"Li, Liang Z" <address@hidden> wrote:
>> > @@ -889,7 +889,6 @@ static inline void
>> start_compression(CompressParam *param)
>> >      qemu_mutex_unlock(&param->mutex);  }
>> >
>> > -
>> >  static uint64_t bytes_transferred;
>> >
>> >  static void flush_compressed_data(QEMUFile *f) @@ -1458,8 +1457,28
>> @@
>> > void ram_handle_compressed(void *host, uint8_t ch, uint64_t size)
>> >
>> >  static void *do_data_decompress(void *opaque)  {
>> > +    DecompressParam *param = opaque;
>> > +    size_t pagesize;
>> > +
>> >      while (true) {
>> > -        /* To be done */
>> > +        qemu_mutex_lock(&param->mutex);
>> > +        while (!param->start && !param->quit) {
>> > +            qemu_cond_wait(&param->cond, &param->mutex);
>> 
>> We don't check here if we have received a quit
>> 
>> 
>> > +            pagesize = TARGET_PAGE_SIZE;
>> > +            /* uncompress() will return failed in some case, especially
>> > +             * when the page is dirted when doing the compression, it's
>> > +             * not a problem because the dirty page will be retransferred
>> > +             * and uncompress() won't break the data in other pages.
>> > +             */
>> > +            uncompress((Bytef *)param->des, &pagesize,
>> > +                       (const Bytef *)param->compbuf, param->len);
>> > +            param->start = false;
>> > +        }
>> > +        if (param->quit) {
>> > +            qemu_mutex_unlock(&param->mutex);
>> > +            break;
>> > +        }
>> > +        qemu_mutex_unlock(&param->mutex);
>> >      }
>> >
>> >      return NULL;
>> > @@ -1489,6 +1508,12 @@ void migrate_decompress_threads_join(void)
>> >
>> >      thread_count = migrate_decompress_threads();
>> >      for (i = 0; i < thread_count; i++) {
>> > +        qemu_mutex_lock(&decomp_param[i].mutex);
>> > +        decomp_param[i].quit = true;
>> > +        qemu_cond_signal(&decomp_param[i].cond);
>> 
>> We set quit and send a signal to wakeup the thread, but it will try to
>> uncompress a page.  Shouldn't we change the position of the param->quit
>> check for exit?  I think it should be inside the loop.
>
> Yes, you are right. if (param->quit)  should be put in front of uncompress().
>  I will change it in the final version. (I really hope the next
> version is the final version :) )

I am sorry this took so long :p

Later, Juan.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]