diff mbox

[v2] KVM: arm/arm64 : add lpi info in vgic-debug

Message ID 1521846074-66914-1-git-send-email-peng.hao2@zte.com.cn (mailing list archive)
State New, archived
Headers show

Commit Message

Peng Hao March 23, 2018, 11:01 p.m. UTC
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(-)

Comments

Marc Zyngier March 23, 2018, 3:27 p.m. UTC | #1
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.
kernel test robot March 24, 2018, 10:28 a.m. UTC | #2
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 mbox

Patch

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;
 }