IOHUB object is added to manage PCI IRQs. It uses KVM_IRQFD ioctl to create irqfd to injecting PCI interrupts to the guest. IOHUB object forwards the irqfd to the remote process. Remote process uses this fd to directly send interrupts to the guest, bypassing QEMU. Signed-off-by: John G Johnson <john.g.johnson@oracle.com> Signed-off-by: Jagannathan Raman <jag.raman@oracle.com> Signed-off-by: Elena Ufimtseva <elena.ufimtseva@oracle.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Message-id: 51d5c3d54e28a68b002e3875c59599c9f5a424a1.1611938319.git.jag.raman@oracle.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
43 lines
1.1 KiB
C
43 lines
1.1 KiB
C
/*
|
|
* IO Hub for remote device
|
|
*
|
|
* Copyright © 2018, 2021 Oracle and/or its affiliates.
|
|
*
|
|
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
|
* See the COPYING file in the top-level directory.
|
|
*
|
|
*/
|
|
|
|
#ifndef REMOTE_IOHUB_H
|
|
#define REMOTE_IOHUB_H
|
|
|
|
#include "hw/pci/pci.h"
|
|
#include "qemu/event_notifier.h"
|
|
#include "qemu/thread-posix.h"
|
|
#include "hw/remote/mpqemu-link.h"
|
|
|
|
#define REMOTE_IOHUB_NB_PIRQS PCI_DEVFN_MAX
|
|
|
|
typedef struct ResampleToken {
|
|
void *iohub;
|
|
int pirq;
|
|
} ResampleToken;
|
|
|
|
typedef struct RemoteIOHubState {
|
|
PCIDevice d;
|
|
EventNotifier irqfds[REMOTE_IOHUB_NB_PIRQS];
|
|
EventNotifier resamplefds[REMOTE_IOHUB_NB_PIRQS];
|
|
unsigned int irq_level[REMOTE_IOHUB_NB_PIRQS];
|
|
ResampleToken token[REMOTE_IOHUB_NB_PIRQS];
|
|
QemuMutex irq_level_lock[REMOTE_IOHUB_NB_PIRQS];
|
|
} RemoteIOHubState;
|
|
|
|
int remote_iohub_map_irq(PCIDevice *pci_dev, int intx);
|
|
void remote_iohub_set_irq(void *opaque, int pirq, int level);
|
|
void process_set_irqfd_msg(PCIDevice *pci_dev, MPQemuMsg *msg);
|
|
|
|
void remote_iohub_init(RemoteIOHubState *iohub);
|
|
void remote_iohub_finalize(RemoteIOHubState *iohub);
|
|
|
|
#endif
|