Message ID | 1521846074-66914-1-git-send-email-peng.hao2@zte.com.cn (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 23/03/18 23:01, Peng Hao wrote: > Add lpi debug info to vgic-stat. > the printed info like this: > SPI 287 0 000001 0 0 0 160 -1 > LPI 8192 2 000100 0 0 0 160 -1 > > Signed-off-by: Peng Hao <peng.hao2@zte.com.cn> > --- > virt/kvm/arm/vgic/vgic-debug.c | 56 ++++++++++++++++++++++++++++++++++++++---- > 1 file changed, 51 insertions(+), 5 deletions(-) > > diff --git a/virt/kvm/arm/vgic/vgic-debug.c b/virt/kvm/arm/vgic/vgic-debug.c > index 10b3817..cb85550 100644 > --- a/virt/kvm/arm/vgic/vgic-debug.c > +++ b/virt/kvm/arm/vgic/vgic-debug.c > @@ -36,9 +36,12 @@ > struct vgic_state_iter { > int nr_cpus; > int nr_spis; > + int nr_lpis; > int dist_id; > int vcpu_id; > int intid; > + int lpi_print_count; > + struct vgic_irq **lpi_irqs; > }; > > static void iter_next(struct vgic_state_iter *iter) > @@ -52,6 +55,35 @@ static void iter_next(struct vgic_state_iter *iter) > if (iter->intid == VGIC_NR_PRIVATE_IRQS && > ++iter->vcpu_id < iter->nr_cpus) > iter->intid = 0; > + > + if (iter->intid >= VGIC_NR_PRIVATE_IRQS + iter->nr_spis) { > + if (iter->lpi_print_count < iter->nr_lpis) > + iter->intid = iter->lpi_irqs[iter->lpi_print_count]->intid; > + iter->lpi_print_count++; > + } > +} > + > +static void vgic_debug_get_lpis(struct kvm *kvm, struct vgic_state_iter *iter) > +{ > + struct vgic_dist *dist = &kvm->arch.vgic; > + int i = 0; > + struct vgic_irq *irq = NULL, **lpi_irqs; > + > + iter->nr_lpis = dist->lpi_list_count; > + lpi_irqs = kmalloc_array(iter->nr_lpis, sizeof(irq), GFP_KERNEL); > + if (!lpi_irqs) { > + iter->nr_lpis = 0; > + return; > + } > + spin_lock(&dist->lpi_list_lock); > + list_for_each_entry(irq, &dist->lpi_list_head, lpi_list) { > + vgic_get_irq_kref(irq); > + if (i < iter->nr_lpis) > + lpi_irqs[i++] = irq; > + } > + iter->nr_lpis = i; > + spin_unlock(&dist->lpi_list_lock); > + iter->lpi_irqs = lpi_irqs; I've already explained why I didn't like this construct. I still don't like it. M.
Hi Peng,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on kvmarm/next]
[also build test WARNING on v4.16-rc6]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Peng-Hao/KVM-arm-arm64-add-lpi-info-in-vgic-debug/20180324-151050
base: https://git.kernel.org/pub/scm/linux/kernel/git/kvmarm/kvmarm.git next
config: arm64-defconfig (attached as .config)
compiler: aarch64-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=arm64
Note: it may well be a FALSE warning. FWIW you are at least aware of it now.
http://gcc.gnu.org/wiki/Better_Uninitialized_Warnings
All warnings (new ones prefixed by >>):
arch/arm64/kvm/../../../virt/kvm/arm/vgic/vgic-debug.c: In function 'vgic_debug_show':
>> arch/arm64/kvm/../../../virt/kvm/arm/vgic/vgic-debug.c:225:2: warning: 'type' may be used uninitialized in this function [-Wmaybe-uninitialized]
seq_printf(s, " %s %4d "
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
" %2d "
~~~~~~~~~~
"%d%d%d%d%d%d "
~~~~~~~~~~~~~~~
"%8d "
~~~~~~
"%8x "
~~~~~~
" %2x "
~~~~~~~
"%3d "
~~~~~~
" %2d "
~~~~~~~~~~~
"\n",
~~~~~
type, irq->intid,
~~~~~~~~~~~~~~~~~
(irq->target_vcpu) ? irq->target_vcpu->vcpu_id : -1,
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
irq->pending_latch,
~~~~~~~~~~~~~~~~~~~
irq->line_level,
~~~~~~~~~~~~~~~~
irq->active,
~~~~~~~~~~~~
irq->enabled,
~~~~~~~~~~~~~
irq->hw,
~~~~~~~~
irq->config == VGIC_CONFIG_LEVEL,
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
irq->hwintid,
~~~~~~~~~~~~~
irq->mpidr,
~~~~~~~~~~~
irq->source,
~~~~~~~~~~~~
irq->priority,
~~~~~~~~~~~~~~
(irq->vcpu) ? irq->vcpu->vcpu_id : -1);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/arm64/kvm/../../../virt/kvm/arm/vgic/vgic-debug.c:212:8: note: 'type' was declared here
char *type;
^~~~
vim +/type +225 arch/arm64/kvm/../../../virt/kvm/arm/vgic/vgic-debug.c
10f92c4c Christoffer Dall 2017-01-17 208
10f92c4c Christoffer Dall 2017-01-17 209 static void print_irq_state(struct seq_file *s, struct vgic_irq *irq,
10f92c4c Christoffer Dall 2017-01-17 210 struct kvm_vcpu *vcpu)
10f92c4c Christoffer Dall 2017-01-17 211 {
10f92c4c Christoffer Dall 2017-01-17 212 char *type;
10f92c4c Christoffer Dall 2017-01-17 213 if (irq->intid < VGIC_NR_SGIS)
10f92c4c Christoffer Dall 2017-01-17 214 type = "SGI";
10f92c4c Christoffer Dall 2017-01-17 215 else if (irq->intid < VGIC_NR_PRIVATE_IRQS)
10f92c4c Christoffer Dall 2017-01-17 216 type = "PPI";
01d84373 Peng Hao 2018-03-24 217 else if (irq->intid < VGIC_MAX_SPI)
10f92c4c Christoffer Dall 2017-01-17 218 type = "SPI";
01d84373 Peng Hao 2018-03-24 219 else if (irq->intid >= VGIC_MIN_LPI)
01d84373 Peng Hao 2018-03-24 220 type = "LPI";
10f92c4c Christoffer Dall 2017-01-17 221
10f92c4c Christoffer Dall 2017-01-17 222 if (irq->intid ==0 || irq->intid == VGIC_NR_PRIVATE_IRQS)
10f92c4c Christoffer Dall 2017-01-17 223 print_header(s, irq, vcpu);
10f92c4c Christoffer Dall 2017-01-17 224
10f92c4c Christoffer Dall 2017-01-17 @225 seq_printf(s, " %s %4d "
10f92c4c Christoffer Dall 2017-01-17 226 " %2d "
10f92c4c Christoffer Dall 2017-01-17 227 "%d%d%d%d%d%d "
10f92c4c Christoffer Dall 2017-01-17 228 "%8d "
10f92c4c Christoffer Dall 2017-01-17 229 "%8x "
10f92c4c Christoffer Dall 2017-01-17 230 " %2x "
10f92c4c Christoffer Dall 2017-01-17 231 "%3d "
10f92c4c Christoffer Dall 2017-01-17 232 " %2d "
10f92c4c Christoffer Dall 2017-01-17 233 "\n",
10f92c4c Christoffer Dall 2017-01-17 234 type, irq->intid,
10f92c4c Christoffer Dall 2017-01-17 235 (irq->target_vcpu) ? irq->target_vcpu->vcpu_id : -1,
10f92c4c Christoffer Dall 2017-01-17 236 irq->pending_latch,
10f92c4c Christoffer Dall 2017-01-17 237 irq->line_level,
10f92c4c Christoffer Dall 2017-01-17 238 irq->active,
10f92c4c Christoffer Dall 2017-01-17 239 irq->enabled,
10f92c4c Christoffer Dall 2017-01-17 240 irq->hw,
10f92c4c Christoffer Dall 2017-01-17 241 irq->config == VGIC_CONFIG_LEVEL,
10f92c4c Christoffer Dall 2017-01-17 242 irq->hwintid,
10f92c4c Christoffer Dall 2017-01-17 243 irq->mpidr,
10f92c4c Christoffer Dall 2017-01-17 244 irq->source,
10f92c4c Christoffer Dall 2017-01-17 245 irq->priority,
10f92c4c Christoffer Dall 2017-01-17 246 (irq->vcpu) ? irq->vcpu->vcpu_id : -1);
10f92c4c Christoffer Dall 2017-01-17 247
:::::: The code at line 225 was first introduced by commit
:::::: 10f92c4c537794f4e2b5f545a8953790c5445d0f KVM: arm/arm64: vgic: Add debugfs vgic-state file
:::::: TO: Christoffer Dall <christoffer.dall@linaro.org>
:::::: CC: Christoffer Dall <christoffer.dall@linaro.org>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
diff --git a/virt/kvm/arm/vgic/vgic-debug.c b/virt/kvm/arm/vgic/vgic-debug.c index 10b3817..cb85550 100644 --- a/virt/kvm/arm/vgic/vgic-debug.c +++ b/virt/kvm/arm/vgic/vgic-debug.c @@ -36,9 +36,12 @@ struct vgic_state_iter { int nr_cpus; int nr_spis; + int nr_lpis; int dist_id; int vcpu_id; int intid; + int lpi_print_count; + struct vgic_irq **lpi_irqs; }; static void iter_next(struct vgic_state_iter *iter) @@ -52,6 +55,35 @@ static void iter_next(struct vgic_state_iter *iter) if (iter->intid == VGIC_NR_PRIVATE_IRQS && ++iter->vcpu_id < iter->nr_cpus) iter->intid = 0; + + if (iter->intid >= VGIC_NR_PRIVATE_IRQS + iter->nr_spis) { + if (iter->lpi_print_count < iter->nr_lpis) + iter->intid = iter->lpi_irqs[iter->lpi_print_count]->intid; + iter->lpi_print_count++; + } +} + +static void vgic_debug_get_lpis(struct kvm *kvm, struct vgic_state_iter *iter) +{ + struct vgic_dist *dist = &kvm->arch.vgic; + int i = 0; + struct vgic_irq *irq = NULL, **lpi_irqs; + + iter->nr_lpis = dist->lpi_list_count; + lpi_irqs = kmalloc_array(iter->nr_lpis, sizeof(irq), GFP_KERNEL); + if (!lpi_irqs) { + iter->nr_lpis = 0; + return; + } + spin_lock(&dist->lpi_list_lock); + list_for_each_entry(irq, &dist->lpi_list_head, lpi_list) { + vgic_get_irq_kref(irq); + if (i < iter->nr_lpis) + lpi_irqs[i++] = irq; + } + iter->nr_lpis = i; + spin_unlock(&dist->lpi_list_lock); + iter->lpi_irqs = lpi_irqs; } static void iter_init(struct kvm *kvm, struct vgic_state_iter *iter, @@ -64,6 +96,8 @@ static void iter_init(struct kvm *kvm, struct vgic_state_iter *iter, iter->nr_cpus = nr_cpus; iter->nr_spis = kvm->arch.vgic.nr_spis; + if (vgic_supports_direct_msis(kvm) && !pos) + vgic_debug_get_lpis(kvm, iter); /* Fast forward to the right position if needed */ while (pos--) iter_next(iter); @@ -73,7 +107,9 @@ static bool end_of_vgic(struct vgic_state_iter *iter) { return iter->dist_id > 0 && iter->vcpu_id == iter->nr_cpus && - (iter->intid - VGIC_NR_PRIVATE_IRQS) == iter->nr_spis; + (iter->intid - VGIC_NR_PRIVATE_IRQS) >= iter->nr_spis && + ((iter->nr_lpis == 0) || + (iter->lpi_print_count == iter->nr_lpis + 1)); } static void *vgic_debug_start(struct seq_file *s, loff_t *pos) @@ -130,6 +166,7 @@ static void vgic_debug_stop(struct seq_file *s, void *v) mutex_lock(&kvm->lock); iter = kvm->arch.vgic.iter; + kfree(iter->lpi_irqs); kfree(iter); kvm->arch.vgic.iter = NULL; mutex_unlock(&kvm->lock); @@ -154,7 +191,7 @@ static void print_header(struct seq_file *s, struct vgic_irq *irq, struct kvm_vcpu *vcpu) { int id = 0; - char *hdr = "SPI "; + char *hdr = "Global"; if (vcpu) { hdr = "VCPU"; @@ -162,7 +199,10 @@ static void print_header(struct seq_file *s, struct vgic_irq *irq, } seq_printf(s, "\n"); - seq_printf(s, "%s%2d TYP ID TGT_ID PLAEHC HWID TARGET SRC PRI VCPU_ID\n", hdr, id); + if (vcpu) + seq_printf(s, "%s%2d TYP ID TGT_ID PLAEHC HWID TARGET SRC PRI VCPU_ID\n", hdr, id); + else + seq_printf(s, "%s TYP ID TGT_ID PLAEHC HWID TARGET SRC PRI VCPU_ID\n", hdr); seq_printf(s, "---------------------------------------------------------------\n"); } @@ -174,8 +214,10 @@ static void print_irq_state(struct seq_file *s, struct vgic_irq *irq, type = "SGI"; else if (irq->intid < VGIC_NR_PRIVATE_IRQS) type = "PPI"; - else + else if (irq->intid < VGIC_MAX_SPI) type = "SPI"; + else if (irq->intid >= VGIC_MIN_LPI) + type = "LPI"; if (irq->intid ==0 || irq->intid == VGIC_NR_PRIVATE_IRQS) print_header(s, irq, vcpu); @@ -220,7 +262,9 @@ static int vgic_debug_show(struct seq_file *s, void *v) if (!kvm->arch.vgic.initialized) return 0; - if (iter->vcpu_id < iter->nr_cpus) { + if (iter->intid >= VGIC_MIN_LPI) + irq = iter->lpi_irqs[iter->lpi_print_count - 1]; + else if (iter->vcpu_id < iter->nr_cpus) { vcpu = kvm_get_vcpu(kvm, iter->vcpu_id); irq = &vcpu->arch.vgic_cpu.private_irqs[iter->intid]; } else { @@ -230,6 +274,8 @@ static int vgic_debug_show(struct seq_file *s, void *v) spin_lock(&irq->irq_lock); print_irq_state(s, irq, vcpu); spin_unlock(&irq->irq_lock); + + vgic_put_irq(kvm, irq); return 0; }
Add lpi debug info to vgic-stat. the printed info like this: SPI 287 0 000001 0 0 0 160 -1 LPI 8192 2 000100 0 0 0 160 -1 Signed-off-by: Peng Hao <peng.hao2@zte.com.cn> --- virt/kvm/arm/vgic/vgic-debug.c | 56 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 51 insertions(+), 5 deletions(-)