Skip to content

Commit 014e611

Browse files
yliu80Eddie Dong
authored andcommitted
DM: virtio-gpio: add IRQ statistics
print each IRQ descriptor interrupts number and all of IRQ descriptors interrupts when UOS requests or releases a GPIO IRQ. Tracked-On: #2512 Signed-off-by: Yuan Liu <yuan1.liu@intel.com> Acked-by: Yu Wang <yu1.wang@intel.com>
1 parent 83a98ac commit 014e611

File tree

1 file changed

+44
-2
lines changed

1 file changed

+44
-2
lines changed

devicemodel/hw/pci/virtio/virtio_gpio.c

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -254,13 +254,15 @@ struct gpio_irq_desc {
254254
uint8_t level; /* level value */
255255
uint64_t mode; /* interrupt trigger mode */
256256
void *data; /* virtio gpio instance */
257+
uint64_t intr_stat; /* interrupts count */
257258
};
258259

259260
struct gpio_irq_chip {
260261
pthread_mutex_t intr_mtx;
261262
struct gpio_irq_desc descs[VIRTIO_GPIO_MAX_VLINES];
262263
uint64_t intr_pending; /* pending interrupts */
263264
uint64_t intr_service; /* service interrupts */
265+
uint64_t intr_stat; /* all interrupts count */
264266
};
265267

266268
struct virtio_gpio {
@@ -278,6 +280,8 @@ struct virtio_gpio {
278280
static void print_gpio_info(struct virtio_gpio *gpio);
279281
static void print_virtio_gpio_info(struct virtio_gpio_request *req,
280282
struct virtio_gpio_response *rsp, bool in);
283+
static void print_intr_statistics(struct gpio_irq_chip *chip);
284+
static void record_intr_statistics(struct gpio_irq_chip *chip, uint64_t mask);
281285

282286
static void
283287
native_gpio_update_line_info(struct gpio_line *line)
@@ -868,6 +872,9 @@ gpio_irq_deliver_intr(struct virtio_gpio *gpio, uint64_t mask)
868872
/* Generate interrupt if appropriate. */
869873
vq_endchains(vq, 1);
870874

875+
/* interrupt statistics */
876+
record_intr_statistics(&gpio->irq_chip, mask);
877+
871878
} else
872879
DPRINTF("virtio gpio failed to send an IRQ, mask %lu", mask);
873880
}
@@ -1117,12 +1124,16 @@ virtio_gpio_irq_proc(struct virtio_gpio *gpio, struct iovec *iov, uint16_t flag)
11171124
* if gpio_irq_enable failure.
11181125
*/
11191126
gpio_irq_enable(gpio, req->pin, req->mode);
1127+
1128+
/* print IRQ statistics */
1129+
print_intr_statistics(chip);
11201130
break;
11211131
case IRQ_ACTION_DISABLE:
11221132
gpio_irq_disable(chip, req->pin);
11231133

1124-
/* reopen the GPIO */
1125-
native_gpio_open_line(desc->gpio, 0, 0);
1134+
1135+
/* print IRQ statistics */
1136+
print_intr_statistics(chip);
11261137
break;
11271138
case IRQ_ACTION_ACK:
11281139
/*
@@ -1435,4 +1446,35 @@ print_virtio_gpio_info(struct virtio_gpio_request *req,
14351446
rsp->data);
14361447
}
14371448

1449+
static void
1450+
record_intr_statistics(struct gpio_irq_chip *chip, uint64_t mask)
1451+
{
1452+
struct gpio_irq_desc *desc;
1453+
int i;
1454+
1455+
for (i = 0; i < VIRTIO_GPIO_MAX_VLINES; i++) {
1456+
desc = &chip->descs[i];
1457+
if (mask & BIT(desc->pin))
1458+
desc->intr_stat++;
1459+
}
1460+
chip->intr_stat++;
1461+
}
1462+
1463+
static void
1464+
print_intr_statistics(struct gpio_irq_chip *chip)
1465+
{
1466+
struct gpio_irq_desc *desc;
1467+
int i;
1468+
1469+
DPRINTF("virtio gpio generated interrupts %lu\n", chip->intr_stat);
1470+
for (i = 0; i < VIRTIO_GPIO_MAX_VLINES; i++) {
1471+
desc = &chip->descs[i];
1472+
if (!desc->gpio || desc->intr_stat == 0)
1473+
continue;
1474+
DPRINTF("Chip %s GPIO %d generated interrupts %lu\n",
1475+
desc->gpio->chip->dev_name, desc->gpio->offset,
1476+
desc->intr_stat);
1477+
}
1478+
}
1479+
14381480
DEFINE_PCI_DEVTYPE(pci_ops_virtio_gpio);

0 commit comments

Comments
 (0)