All of lore.kernel.org
 help / color / mirror / Atom feed
From: Julien Grall <julien.grall@citrix.com>
To: Vijay Kilari <vijay.kilari@gmail.com>,
	Ian Campbell <ian.campbell@citrix.com>
Cc: "xen-devel@lists.xen.org" <xen-devel@lists.xen.org>,
	Stefano Stabellini <stefano.stabellini@citrix.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: Re: xen/arm: gicv3: Computation of GICD_TYPER.IDbits
Date: Fri, 18 Sep 2015 11:21:03 +0100	[thread overview]
Message-ID: <55FBE58F.1040006@citrix.com> (raw)
In-Reply-To: <CALicx6t5zFvWCD7ZOe=wBDp9NHGqY2H8gprjuFxN8k-u02xeYw@mail.gmail.com>

On 18/09/15 10:48, Vijay Kilari wrote:
> On Fri, Sep 18, 2015 at 2:03 PM, Ian Campbell <ian.campbell@citrix.com> wrote:
>> On Fri, 2015-09-18 at 12:56 +0530, Vijay Kilari wrote:
>>> Hi Julien,
>>>
>>>  static int vgic_v3_distr_mmio_read(struct vcpu *v, mmio_info_t *info)
>>>  {
>>>      ...
>>>            case GICD_TYPER:
>>>            {
>>>                /*
>>>                 * Number of interrupt identifier bits supported by the
>>> GIC
>>>                 * Stream Protocol Interface
>>>                 */
>>>                unsigned int irq_bits =
>>> get_count_order(vgic_num_irqs(v->domain));
>>> }
>>>
>>> I think we should use ilog2() instead of get_count_order()?
>>
>> Please explain why.
> 
> For a given value, get_count_order returns next highest 2^n bit that can contain
> this number, where as ilog2 returns number max highest bit set to
> contain the value.
> (Here is the output of get_count_order() and ilog2() for various sizes )
> 
> 128K get_count_order 17 log2 17
> 64K get_count_order   16 log2 16
> 48K get_count_order   16 log2 15

2^16 = 64K
2^15 = 32K

So here the number of bits returned wouldn't be enough to fit the value.
We would expose the wrong number of IRQ to the guest.

> 32K get_count_order   15 log2 15
> 24K get_count_order   15 log2 14
> 16K get_count_order   14 log2 14
> 8K get_count_order     13 log2 13
> 
> Here if irq_bits should specify number of bits required to specify the number.
> So log2 is more appropriate. Even Linux ITS driver uses ilog2 to count number
> of bits required.

ilog2 is used in the ITS code because they round up the number of ITEs
to a power of 2.

ilog2 will always return the highest bit set in the number. So if it's
not a power of two it will return one bit less than it's required to
contain the value.

get_count_order will take care of it by adding 1 if the number is not a
power of 2.

Regards,

-- 
Julien Grall

      reply	other threads:[~2015-09-18 10:21 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-18  7:26 xen/arm: gicv3: Computation of GICD_TYPER.IDbits Vijay Kilari
2015-09-18  8:33 ` Ian Campbell
2015-09-18  9:48   ` Vijay Kilari
2015-09-18 10:21     ` Julien Grall [this message]

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=55FBE58F.1040006@citrix.com \
    --to=julien.grall@citrix.com \
    --cc=ian.campbell@citrix.com \
    --cc=stefano.stabellini@citrix.com \
    --cc=stefano.stabellini@eu.citrix.com \
    --cc=vijay.kilari@gmail.com \
    --cc=xen-devel@lists.xen.org \
    /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.