All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Alex Bennée" <alex.bennee@linaro.org>
To: Sergey Fedorov <serge.fdrv@gmail.com>
Cc: sergey.fedorov@linaro.org,
	Peter Crosthwaite <crosthwaite.peter@gmail.com>,
	Stefan Weil <sw@weilnetz.de>,
	Claudio Fontana <claudio.fontana@huawei.com>,
	qemu-devel@nongnu.org, Alexander Graf <agraf@suse.de>,
	Blue Swirl <blauwirbel@gmail.com>,
	qemu-arm@nongnu.org, "Vassili Karpov (malc)" <av1474@comtv.ru>,
	Paolo Bonzini <pbonzini@redhat.com>,
	Aurelien Jarno <aurelien@aurel32.net>,
	Richard Henderson <rth@twiddle.net>
Subject: Re: [Qemu-devel] [PATCH 1/8] tcg: Clean up direct block chaining data fields
Date: Thu, 24 Mar 2016 15:01:37 +0000	[thread overview]
Message-ID: <87mvpnrkby.fsf@linaro.org> (raw)
In-Reply-To: <56F3F377.4070809@gmail.com>


Sergey Fedorov <serge.fdrv@gmail.com> writes:

> On 24/03/16 16:42, Alex Bennée wrote:
>>> diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h
>>> > index 05a151da4a54..cc3d2ca25917 100644
>>> > --- a/include/exec/exec-all.h
>>> > +++ b/include/exec/exec-all.h
>>> > @@ -257,20 +257,32 @@ struct TranslationBlock {
>>> >      struct TranslationBlock *page_next[2];
>>> >      tb_page_addr_t page_addr[2];
>>> >
>>> > -    /* the following data are used to directly call another TB from
>>> > -       the code of this one. */
>>> > -    uint16_t tb_next_offset[2]; /* offset of original jump target */
>>> > +    /* The following data are used to directly call another TB from
>>> > +     * the code of this one. This can be done either by emitting direct or
>>> > +     * indirect native jump instructions. These jumps are reset so that the TB
>>> > +     * just continue its execution. The TB can be linked to another one by
>>> > +     * setting one of the jump targets (or patching the jump instruction). Only
>>> > +     * two of such jumps are supported.
>>> > +     */
>>> > +    uint16_t jmp_reset_offset[2]; /* offset of original jump target */
>>> > +#define TB_JMP_RESET_OFFSET_INVALID 0xffff /* indicates no jump generated */
>>> >  #ifdef USE_DIRECT_JUMP
>>> > -    uint16_t tb_jmp_offset[2]; /* offset of jump instruction */
>>> > +    uint16_t jmp_insn_offset[2]; /* offset of native jump instruction */
>>> >  #else
>>> > -    uintptr_t tb_next[2]; /* address of jump generated code */
>>> > +    uintptr_t jmp_target_addr[2]; /* target address for indirect jump */
>>> >  #endif
>>> > -    /* list of TBs jumping to this one. This is a circular list using
>>> > -       the two least significant bits of the pointers to tell what is
>>> > -       the next pointer: 0 = jmp_next[0], 1 = jmp_next[1], 2 =
>>> > -       jmp_first */
>>> > -    struct TranslationBlock *jmp_next[2];
>>> > -    struct TranslationBlock *jmp_first;
>>> > +    /* Each TB has an assosiated circular list of TBs jumping to this one.
>>> > +     * jmp_list_first points to the first TB jumping to this one.
>>> > +     * jmp_list_next is used to point to the next TB in a list.
>>> > +     * Since each TB can have two jumps, it can participate in two lists.
>>> > +     * The two least significant bits of a pointer are used to choose which
>>> > +     * data field holds a pointer to the next TB:
>>> > +     * 0 => jmp_list_next[0], 1 => jmp_list_next[1], 2 => jmp_list_first.
>>> > +     * In other words, 0/1 tells which jump is used in the pointed TB,
>>> > +     * and 2 means that this is a pointer back to the target TB of this list.
>>> > +     */
>>> > +    struct TranslationBlock *jmp_list_next[2];
>>> > +    struct TranslationBlock *jmp_list_first;
>> OK I found that tricky to follow. Where does the value of the pointer
>> come from that sets these bottom bits? The TB jumping to this TB sets it?
>
> Yeah, that's not easy to describe. Initially, we set:
>
>     tb->jmp_list_first = tb | 2
>
> That makes an empty list: jmp_list_first just points to the this TB and
> the low bits are 2.
>
> After that we can add a TB to the list in tb_add_jump():
>
>     tb->jmp_list_next[n] = tb_next->jmp_list_first;
>     tb_next->jmp_list_first = tb | n;
>
> where 'tb' is going to jump to 'tb_next', 'n' (can be 0 or 1) is an
> index of jump target of 'tb'.

Where I get confused it what is the point of jmp_list_first? If these
are two circular lists do we care which the first in the list is? The
exit condition when coming out of searching seems when ntb with index =
orig tb with index.

>
> (I simplified the code here)
>
> Any ideas how to make it more clear in the comment?
>
> Kind regards,
> Sergey


--
Alex Bennée

  reply	other threads:[~2016-03-24 15:02 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-03-24 10:39 [Qemu-devel] [PATCH 0/8] tcg: Direct block chaining clean-up sergey.fedorov
2016-03-24 10:39 ` [Qemu-devel] [PATCH 1/8] tcg: Clean up direct block chaining data fields sergey.fedorov
2016-03-24 13:42   ` Alex Bennée
2016-03-24 14:02     ` Sergey Fedorov
2016-03-24 15:01       ` Alex Bennée [this message]
2016-03-24 15:10         ` Sergey Fedorov
2016-03-24 15:11         ` Paolo Bonzini
2016-03-24 15:23           ` Alex Bennée
2016-03-28 22:12           ` Richard Henderson
2016-03-29  8:14             ` Paolo Bonzini
2016-03-29  8:51               ` Paolo Bonzini
2016-03-29  8:31             ` Sergey Fedorov
2016-03-29 15:37               ` Richard Henderson
2016-03-29 16:26               ` [Qemu-devel] [Qemu-arm] " Peter Maydell
2016-03-29 17:58                 ` Sergey Fedorov
2016-03-24 10:39 ` [Qemu-devel] [PATCH 2/8] tcg: Use uintptr_t type for jmp_list_{next|first} fields of TB sergey.fedorov
2016-03-24 14:17   ` Sergey Fedorov
2016-03-24 14:58   ` Alex Bennée
2016-03-24 15:15     ` Sergey Fedorov
2016-03-24 10:39 ` [Qemu-devel] [PATCH 3/8] tcg: Rearrange tb_link_page() to avoid forward declaration sergey.fedorov
2016-03-24 15:04   ` Alex Bennée
2016-03-24 10:39 ` [Qemu-devel] [PATCH 4/8] tcg: Init TB's direct jumps before making it visible sergey.fedorov
2016-03-24 15:11   ` Alex Bennée
2016-03-24 15:31     ` Sergey Fedorov
2016-03-24 15:40       ` Alex Bennée
2016-03-24 15:58         ` Sergey Fedorov
2016-03-24 10:39 ` [Qemu-devel] [PATCH 5/8] tcg: Clarify "thread safaty" check in tb_add_jump() sergey.fedorov
2016-03-24 11:31   ` Paolo Bonzini
2016-03-24 12:41     ` Sergey Fedorov
2016-03-24 12:23   ` Artyom Tarasenko
2016-03-24 12:28     ` Sergey Fedorov
2016-03-24 10:39 ` [Qemu-devel] [PATCH 6/8] tcg: Rename tb_jmp_remove() to tb_remove_from_jmp_list() sergey.fedorov
2016-03-24 15:24   ` Alex Bennée
2016-03-24 10:39 ` [Qemu-devel] [PATCH 7/8] tcg: Extract removing of jumps to TB from tb_phys_invalidate() sergey.fedorov
2016-03-24 15:26   ` Alex Bennée
2016-03-24 10:39 ` [Qemu-devel] [PATCH 8/8] tcg: Clean up tb_jmp_unlink() sergey.fedorov
2016-03-24 15:36   ` Alex Bennée
2016-03-24 15:42     ` Sergey Fedorov
2016-03-24 15:52       ` Sergey Fedorov
2016-03-24 11:33 ` [Qemu-devel] [PATCH 0/8] tcg: Direct block chaining clean-up Paolo Bonzini
2016-03-24 12:21   ` Alex Bennée

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=87mvpnrkby.fsf@linaro.org \
    --to=alex.bennee@linaro.org \
    --cc=agraf@suse.de \
    --cc=aurelien@aurel32.net \
    --cc=av1474@comtv.ru \
    --cc=blauwirbel@gmail.com \
    --cc=claudio.fontana@huawei.com \
    --cc=crosthwaite.peter@gmail.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-arm@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=rth@twiddle.net \
    --cc=serge.fdrv@gmail.com \
    --cc=sergey.fedorov@linaro.org \
    --cc=sw@weilnetz.de \
    /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.