* [PATCH] hw/i386: De-duplicate gsi_handler() to remove kvm_pc_gsi_handler()
@ 2019-12-13 11:07 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 6+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-12-13 11:07 UTC (permalink / raw)
To: qemu-devel
Cc: Paolo Bonzini, Marcel Apfelbaum, kvm, Eduardo Habkost,
Richard Henderson, Michael S. Tsirkin,
Philippe Mathieu-Daudé
Both gsi_handler() and kvm_pc_gsi_handler() have the same content,
except one comment. Move the comment, and de-duplicate the code.
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
---
include/sysemu/kvm.h | 1 -
hw/i386/kvm/ioapic.c | 12 ------------
hw/i386/pc.c | 5 ++---
3 files changed, 2 insertions(+), 16 deletions(-)
diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h
index 9fe233b9bf..f5d0d0d710 100644
--- a/include/sysemu/kvm.h
+++ b/include/sysemu/kvm.h
@@ -515,7 +515,6 @@ int kvm_irqchip_add_irqfd_notifier(KVMState *s, EventNotifier *n,
int kvm_irqchip_remove_irqfd_notifier(KVMState *s, EventNotifier *n,
qemu_irq irq);
void kvm_irqchip_set_qemuirq_gsi(KVMState *s, qemu_irq irq, int gsi);
-void kvm_pc_gsi_handler(void *opaque, int n, int level);
void kvm_pc_setup_irq_routing(bool pci_enabled);
void kvm_init_irq_routing(KVMState *s);
diff --git a/hw/i386/kvm/ioapic.c b/hw/i386/kvm/ioapic.c
index f94729c565..bae7413a39 100644
--- a/hw/i386/kvm/ioapic.c
+++ b/hw/i386/kvm/ioapic.c
@@ -48,18 +48,6 @@ void kvm_pc_setup_irq_routing(bool pci_enabled)
}
}
-void kvm_pc_gsi_handler(void *opaque, int n, int level)
-{
- GSIState *s = opaque;
-
- if (n < ISA_NUM_IRQS) {
- /* Kernel will forward to both PIC and IOAPIC */
- qemu_set_irq(s->i8259_irq[n], level);
- } else {
- qemu_set_irq(s->ioapic_irq[n], level);
- }
-}
-
typedef struct KVMIOAPICState KVMIOAPICState;
struct KVMIOAPICState {
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index ac08e63604..97e9049b71 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -350,6 +350,7 @@ void gsi_handler(void *opaque, int n, int level)
DPRINTF("pc: %s GSI %d\n", level ? "raising" : "lowering", n);
if (n < ISA_NUM_IRQS) {
+ /* Under KVM, Kernel will forward to both PIC and IOAPIC */
qemu_set_irq(s->i8259_irq[n], level);
}
qemu_set_irq(s->ioapic_irq[n], level);
@@ -362,10 +363,8 @@ GSIState *pc_gsi_create(qemu_irq **irqs, bool pci_enabled)
s = g_new0(GSIState, 1);
if (kvm_ioapic_in_kernel()) {
kvm_pc_setup_irq_routing(pci_enabled);
- *irqs = qemu_allocate_irqs(kvm_pc_gsi_handler, s, GSI_NUM_PINS);
- } else {
- *irqs = qemu_allocate_irqs(gsi_handler, s, GSI_NUM_PINS);
}
+ *irqs = qemu_allocate_irqs(gsi_handler, s, GSI_NUM_PINS);
return s;
}
--
2.21.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH] hw/i386: De-duplicate gsi_handler() to remove kvm_pc_gsi_handler()
@ 2019-12-13 11:07 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 6+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-12-13 11:07 UTC (permalink / raw)
To: qemu-devel
Cc: Eduardo Habkost, kvm, Michael S. Tsirkin, Paolo Bonzini,
Philippe Mathieu-Daudé,
Richard Henderson
Both gsi_handler() and kvm_pc_gsi_handler() have the same content,
except one comment. Move the comment, and de-duplicate the code.
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
---
include/sysemu/kvm.h | 1 -
hw/i386/kvm/ioapic.c | 12 ------------
hw/i386/pc.c | 5 ++---
3 files changed, 2 insertions(+), 16 deletions(-)
diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h
index 9fe233b9bf..f5d0d0d710 100644
--- a/include/sysemu/kvm.h
+++ b/include/sysemu/kvm.h
@@ -515,7 +515,6 @@ int kvm_irqchip_add_irqfd_notifier(KVMState *s, EventNotifier *n,
int kvm_irqchip_remove_irqfd_notifier(KVMState *s, EventNotifier *n,
qemu_irq irq);
void kvm_irqchip_set_qemuirq_gsi(KVMState *s, qemu_irq irq, int gsi);
-void kvm_pc_gsi_handler(void *opaque, int n, int level);
void kvm_pc_setup_irq_routing(bool pci_enabled);
void kvm_init_irq_routing(KVMState *s);
diff --git a/hw/i386/kvm/ioapic.c b/hw/i386/kvm/ioapic.c
index f94729c565..bae7413a39 100644
--- a/hw/i386/kvm/ioapic.c
+++ b/hw/i386/kvm/ioapic.c
@@ -48,18 +48,6 @@ void kvm_pc_setup_irq_routing(bool pci_enabled)
}
}
-void kvm_pc_gsi_handler(void *opaque, int n, int level)
-{
- GSIState *s = opaque;
-
- if (n < ISA_NUM_IRQS) {
- /* Kernel will forward to both PIC and IOAPIC */
- qemu_set_irq(s->i8259_irq[n], level);
- } else {
- qemu_set_irq(s->ioapic_irq[n], level);
- }
-}
-
typedef struct KVMIOAPICState KVMIOAPICState;
struct KVMIOAPICState {
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index ac08e63604..97e9049b71 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -350,6 +350,7 @@ void gsi_handler(void *opaque, int n, int level)
DPRINTF("pc: %s GSI %d\n", level ? "raising" : "lowering", n);
if (n < ISA_NUM_IRQS) {
+ /* Under KVM, Kernel will forward to both PIC and IOAPIC */
qemu_set_irq(s->i8259_irq[n], level);
}
qemu_set_irq(s->ioapic_irq[n], level);
@@ -362,10 +363,8 @@ GSIState *pc_gsi_create(qemu_irq **irqs, bool pci_enabled)
s = g_new0(GSIState, 1);
if (kvm_ioapic_in_kernel()) {
kvm_pc_setup_irq_routing(pci_enabled);
- *irqs = qemu_allocate_irqs(kvm_pc_gsi_handler, s, GSI_NUM_PINS);
- } else {
- *irqs = qemu_allocate_irqs(gsi_handler, s, GSI_NUM_PINS);
}
+ *irqs = qemu_allocate_irqs(gsi_handler, s, GSI_NUM_PINS);
return s;
}
--
2.21.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH] hw/i386: De-duplicate gsi_handler() to remove kvm_pc_gsi_handler()
2019-12-13 11:07 ` Philippe Mathieu-Daudé
@ 2019-12-13 11:53 ` Paolo Bonzini
-1 siblings, 0 replies; 6+ messages in thread
From: Paolo Bonzini @ 2019-12-13 11:53 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-devel
Cc: Marcel Apfelbaum, kvm, Eduardo Habkost, Richard Henderson,
Michael S. Tsirkin
On 13/12/19 12:07, Philippe Mathieu-Daudé wrote:
> Both gsi_handler() and kvm_pc_gsi_handler() have the same content,
> except one comment. Move the comment, and de-duplicate the code.
>
> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> ---
> include/sysemu/kvm.h | 1 -
> hw/i386/kvm/ioapic.c | 12 ------------
> hw/i386/pc.c | 5 ++---
> 3 files changed, 2 insertions(+), 16 deletions(-)
>
> diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h
> index 9fe233b9bf..f5d0d0d710 100644
> --- a/include/sysemu/kvm.h
> +++ b/include/sysemu/kvm.h
> @@ -515,7 +515,6 @@ int kvm_irqchip_add_irqfd_notifier(KVMState *s, EventNotifier *n,
> int kvm_irqchip_remove_irqfd_notifier(KVMState *s, EventNotifier *n,
> qemu_irq irq);
> void kvm_irqchip_set_qemuirq_gsi(KVMState *s, qemu_irq irq, int gsi);
> -void kvm_pc_gsi_handler(void *opaque, int n, int level);
> void kvm_pc_setup_irq_routing(bool pci_enabled);
> void kvm_init_irq_routing(KVMState *s);
>
> diff --git a/hw/i386/kvm/ioapic.c b/hw/i386/kvm/ioapic.c
> index f94729c565..bae7413a39 100644
> --- a/hw/i386/kvm/ioapic.c
> +++ b/hw/i386/kvm/ioapic.c
> @@ -48,18 +48,6 @@ void kvm_pc_setup_irq_routing(bool pci_enabled)
> }
> }
>
> -void kvm_pc_gsi_handler(void *opaque, int n, int level)
> -{
> - GSIState *s = opaque;
> -
> - if (n < ISA_NUM_IRQS) {
> - /* Kernel will forward to both PIC and IOAPIC */
> - qemu_set_irq(s->i8259_irq[n], level);
> - } else {
> - qemu_set_irq(s->ioapic_irq[n], level);
> - }
> -}
> -
> typedef struct KVMIOAPICState KVMIOAPICState;
>
> struct KVMIOAPICState {
> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
> index ac08e63604..97e9049b71 100644
> --- a/hw/i386/pc.c
> +++ b/hw/i386/pc.c
> @@ -350,6 +350,7 @@ void gsi_handler(void *opaque, int n, int level)
>
> DPRINTF("pc: %s GSI %d\n", level ? "raising" : "lowering", n);
> if (n < ISA_NUM_IRQS) {
> + /* Under KVM, Kernel will forward to both PIC and IOAPIC */
> qemu_set_irq(s->i8259_irq[n], level);
> }
> qemu_set_irq(s->ioapic_irq[n], level);
> @@ -362,10 +363,8 @@ GSIState *pc_gsi_create(qemu_irq **irqs, bool pci_enabled)
> s = g_new0(GSIState, 1);
> if (kvm_ioapic_in_kernel()) {
> kvm_pc_setup_irq_routing(pci_enabled);
> - *irqs = qemu_allocate_irqs(kvm_pc_gsi_handler, s, GSI_NUM_PINS);
> - } else {
> - *irqs = qemu_allocate_irqs(gsi_handler, s, GSI_NUM_PINS);
> }
> + *irqs = qemu_allocate_irqs(gsi_handler, s, GSI_NUM_PINS);
>
> return s;
> }
>
Queued, thanks.
Paolo
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] hw/i386: De-duplicate gsi_handler() to remove kvm_pc_gsi_handler()
@ 2019-12-13 11:53 ` Paolo Bonzini
0 siblings, 0 replies; 6+ messages in thread
From: Paolo Bonzini @ 2019-12-13 11:53 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-devel
Cc: Richard Henderson, Michael S. Tsirkin, kvm, Eduardo Habkost
On 13/12/19 12:07, Philippe Mathieu-Daudé wrote:
> Both gsi_handler() and kvm_pc_gsi_handler() have the same content,
> except one comment. Move the comment, and de-duplicate the code.
>
> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> ---
> include/sysemu/kvm.h | 1 -
> hw/i386/kvm/ioapic.c | 12 ------------
> hw/i386/pc.c | 5 ++---
> 3 files changed, 2 insertions(+), 16 deletions(-)
>
> diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h
> index 9fe233b9bf..f5d0d0d710 100644
> --- a/include/sysemu/kvm.h
> +++ b/include/sysemu/kvm.h
> @@ -515,7 +515,6 @@ int kvm_irqchip_add_irqfd_notifier(KVMState *s, EventNotifier *n,
> int kvm_irqchip_remove_irqfd_notifier(KVMState *s, EventNotifier *n,
> qemu_irq irq);
> void kvm_irqchip_set_qemuirq_gsi(KVMState *s, qemu_irq irq, int gsi);
> -void kvm_pc_gsi_handler(void *opaque, int n, int level);
> void kvm_pc_setup_irq_routing(bool pci_enabled);
> void kvm_init_irq_routing(KVMState *s);
>
> diff --git a/hw/i386/kvm/ioapic.c b/hw/i386/kvm/ioapic.c
> index f94729c565..bae7413a39 100644
> --- a/hw/i386/kvm/ioapic.c
> +++ b/hw/i386/kvm/ioapic.c
> @@ -48,18 +48,6 @@ void kvm_pc_setup_irq_routing(bool pci_enabled)
> }
> }
>
> -void kvm_pc_gsi_handler(void *opaque, int n, int level)
> -{
> - GSIState *s = opaque;
> -
> - if (n < ISA_NUM_IRQS) {
> - /* Kernel will forward to both PIC and IOAPIC */
> - qemu_set_irq(s->i8259_irq[n], level);
> - } else {
> - qemu_set_irq(s->ioapic_irq[n], level);
> - }
> -}
> -
> typedef struct KVMIOAPICState KVMIOAPICState;
>
> struct KVMIOAPICState {
> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
> index ac08e63604..97e9049b71 100644
> --- a/hw/i386/pc.c
> +++ b/hw/i386/pc.c
> @@ -350,6 +350,7 @@ void gsi_handler(void *opaque, int n, int level)
>
> DPRINTF("pc: %s GSI %d\n", level ? "raising" : "lowering", n);
> if (n < ISA_NUM_IRQS) {
> + /* Under KVM, Kernel will forward to both PIC and IOAPIC */
> qemu_set_irq(s->i8259_irq[n], level);
> }
> qemu_set_irq(s->ioapic_irq[n], level);
> @@ -362,10 +363,8 @@ GSIState *pc_gsi_create(qemu_irq **irqs, bool pci_enabled)
> s = g_new0(GSIState, 1);
> if (kvm_ioapic_in_kernel()) {
> kvm_pc_setup_irq_routing(pci_enabled);
> - *irqs = qemu_allocate_irqs(kvm_pc_gsi_handler, s, GSI_NUM_PINS);
> - } else {
> - *irqs = qemu_allocate_irqs(gsi_handler, s, GSI_NUM_PINS);
> }
> + *irqs = qemu_allocate_irqs(gsi_handler, s, GSI_NUM_PINS);
>
> return s;
> }
>
Queued, thanks.
Paolo
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] hw/i386: De-duplicate gsi_handler() to remove kvm_pc_gsi_handler()
2019-12-13 11:07 ` Philippe Mathieu-Daudé
@ 2019-12-13 12:02 ` Paolo Bonzini
-1 siblings, 0 replies; 6+ messages in thread
From: Paolo Bonzini @ 2019-12-13 12:02 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-devel
Cc: Marcel Apfelbaum, kvm, Eduardo Habkost, Richard Henderson,
Michael S. Tsirkin
On 13/12/19 12:07, Philippe Mathieu-Daudé wrote:
> Both gsi_handler() and kvm_pc_gsi_handler() have the same content,
> except one comment. Move the comment, and de-duplicate the code.
>
> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> ---
> include/sysemu/kvm.h | 1 -
> hw/i386/kvm/ioapic.c | 12 ------------
> hw/i386/pc.c | 5 ++---
> 3 files changed, 2 insertions(+), 16 deletions(-)
>
> diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h
> index 9fe233b9bf..f5d0d0d710 100644
> --- a/include/sysemu/kvm.h
> +++ b/include/sysemu/kvm.h
> @@ -515,7 +515,6 @@ int kvm_irqchip_add_irqfd_notifier(KVMState *s, EventNotifier *n,
> int kvm_irqchip_remove_irqfd_notifier(KVMState *s, EventNotifier *n,
> qemu_irq irq);
> void kvm_irqchip_set_qemuirq_gsi(KVMState *s, qemu_irq irq, int gsi);
> -void kvm_pc_gsi_handler(void *opaque, int n, int level);
> void kvm_pc_setup_irq_routing(bool pci_enabled);
> void kvm_init_irq_routing(KVMState *s);
>
> diff --git a/hw/i386/kvm/ioapic.c b/hw/i386/kvm/ioapic.c
> index f94729c565..bae7413a39 100644
> --- a/hw/i386/kvm/ioapic.c
> +++ b/hw/i386/kvm/ioapic.c
> @@ -48,18 +48,6 @@ void kvm_pc_setup_irq_routing(bool pci_enabled)
> }
> }
>
> -void kvm_pc_gsi_handler(void *opaque, int n, int level)
> -{
> - GSIState *s = opaque;
> -
> - if (n < ISA_NUM_IRQS) {
> - /* Kernel will forward to both PIC and IOAPIC */
> - qemu_set_irq(s->i8259_irq[n], level);
> - } else {
> - qemu_set_irq(s->ioapic_irq[n], level);
> - }
> -}
> -
> typedef struct KVMIOAPICState KVMIOAPICState;
>
> struct KVMIOAPICState {
> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
> index ac08e63604..97e9049b71 100644
> --- a/hw/i386/pc.c
> +++ b/hw/i386/pc.c
> @@ -350,6 +350,7 @@ void gsi_handler(void *opaque, int n, int level)
>
> DPRINTF("pc: %s GSI %d\n", level ? "raising" : "lowering", n);
> if (n < ISA_NUM_IRQS) {
> + /* Under KVM, Kernel will forward to both PIC and IOAPIC */
> qemu_set_irq(s->i8259_irq[n], level);
> }
> qemu_set_irq(s->ioapic_irq[n], level);
> @@ -362,10 +363,8 @@ GSIState *pc_gsi_create(qemu_irq **irqs, bool pci_enabled)
> s = g_new0(GSIState, 1);
> if (kvm_ioapic_in_kernel()) {
> kvm_pc_setup_irq_routing(pci_enabled);
> - *irqs = qemu_allocate_irqs(kvm_pc_gsi_handler, s, GSI_NUM_PINS);
> - } else {
> - *irqs = qemu_allocate_irqs(gsi_handler, s, GSI_NUM_PINS);
> }
> + *irqs = qemu_allocate_irqs(gsi_handler, s, GSI_NUM_PINS);
>
> return s;
> }
>
Queued, thanks.
Paolo
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] hw/i386: De-duplicate gsi_handler() to remove kvm_pc_gsi_handler()
@ 2019-12-13 12:02 ` Paolo Bonzini
0 siblings, 0 replies; 6+ messages in thread
From: Paolo Bonzini @ 2019-12-13 12:02 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-devel
Cc: Richard Henderson, Michael S. Tsirkin, kvm, Eduardo Habkost
On 13/12/19 12:07, Philippe Mathieu-Daudé wrote:
> Both gsi_handler() and kvm_pc_gsi_handler() have the same content,
> except one comment. Move the comment, and de-duplicate the code.
>
> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> ---
> include/sysemu/kvm.h | 1 -
> hw/i386/kvm/ioapic.c | 12 ------------
> hw/i386/pc.c | 5 ++---
> 3 files changed, 2 insertions(+), 16 deletions(-)
>
> diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h
> index 9fe233b9bf..f5d0d0d710 100644
> --- a/include/sysemu/kvm.h
> +++ b/include/sysemu/kvm.h
> @@ -515,7 +515,6 @@ int kvm_irqchip_add_irqfd_notifier(KVMState *s, EventNotifier *n,
> int kvm_irqchip_remove_irqfd_notifier(KVMState *s, EventNotifier *n,
> qemu_irq irq);
> void kvm_irqchip_set_qemuirq_gsi(KVMState *s, qemu_irq irq, int gsi);
> -void kvm_pc_gsi_handler(void *opaque, int n, int level);
> void kvm_pc_setup_irq_routing(bool pci_enabled);
> void kvm_init_irq_routing(KVMState *s);
>
> diff --git a/hw/i386/kvm/ioapic.c b/hw/i386/kvm/ioapic.c
> index f94729c565..bae7413a39 100644
> --- a/hw/i386/kvm/ioapic.c
> +++ b/hw/i386/kvm/ioapic.c
> @@ -48,18 +48,6 @@ void kvm_pc_setup_irq_routing(bool pci_enabled)
> }
> }
>
> -void kvm_pc_gsi_handler(void *opaque, int n, int level)
> -{
> - GSIState *s = opaque;
> -
> - if (n < ISA_NUM_IRQS) {
> - /* Kernel will forward to both PIC and IOAPIC */
> - qemu_set_irq(s->i8259_irq[n], level);
> - } else {
> - qemu_set_irq(s->ioapic_irq[n], level);
> - }
> -}
> -
> typedef struct KVMIOAPICState KVMIOAPICState;
>
> struct KVMIOAPICState {
> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
> index ac08e63604..97e9049b71 100644
> --- a/hw/i386/pc.c
> +++ b/hw/i386/pc.c
> @@ -350,6 +350,7 @@ void gsi_handler(void *opaque, int n, int level)
>
> DPRINTF("pc: %s GSI %d\n", level ? "raising" : "lowering", n);
> if (n < ISA_NUM_IRQS) {
> + /* Under KVM, Kernel will forward to both PIC and IOAPIC */
> qemu_set_irq(s->i8259_irq[n], level);
> }
> qemu_set_irq(s->ioapic_irq[n], level);
> @@ -362,10 +363,8 @@ GSIState *pc_gsi_create(qemu_irq **irqs, bool pci_enabled)
> s = g_new0(GSIState, 1);
> if (kvm_ioapic_in_kernel()) {
> kvm_pc_setup_irq_routing(pci_enabled);
> - *irqs = qemu_allocate_irqs(kvm_pc_gsi_handler, s, GSI_NUM_PINS);
> - } else {
> - *irqs = qemu_allocate_irqs(gsi_handler, s, GSI_NUM_PINS);
> }
> + *irqs = qemu_allocate_irqs(gsi_handler, s, GSI_NUM_PINS);
>
> return s;
> }
>
Queued, thanks.
Paolo
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2019-12-13 21:27 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-12-13 11:07 [PATCH] hw/i386: De-duplicate gsi_handler() to remove kvm_pc_gsi_handler() Philippe Mathieu-Daudé
2019-12-13 11:07 ` Philippe Mathieu-Daudé
2019-12-13 11:53 ` Paolo Bonzini
2019-12-13 11:53 ` Paolo Bonzini
2019-12-13 12:02 ` Paolo Bonzini
2019-12-13 12:02 ` Paolo Bonzini
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.