-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1 iQEcBAABAgAGBQJbUS+LAAoJEO8Ells5jWIRaM0H+wZMfW4SDf+CaR3e4LZVRvyS 88km4y4EZFbAnVmI89fUzn9FhDizT659vgTxNwrFd1S/p/x51OzrEJtiGm/OfkRc y/fU2DQt8eIx2WDp7HzvHyMYXd08WQiItyJbpCLUukqXAzX2v4OATnz9ZoAxPHof z0fzejOokEo0fKqe+LgOB3upQDRsXGPOYiSo7wUHy1tk9P+ndym5kZcdU44EPtON Q/6COv3claUmEmDtQbpOhPZ2HPFL5nJoSL9rIKfUEweJj1+OHp7b1+lrw1W7sPRP INUdmX5+bnk6oieR2dsSFp8IealZH6BwZ4jkc8sME/HeCSBTy1mWyeFa+TDA2lI= =3U4O -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/jasowang/tags/net-pull-request' into staging # gpg: Signature made Fri 20 Jul 2018 01:40:43 BST # gpg: using RSA key EF04965B398D6211 # gpg: Good signature from "Jason Wang (Jason Wang on RedHat) <jasowang@redhat.com>" # gpg: WARNING: This key is not certified with sufficiently trusted signatures! # gpg: It is not certain that the signature belongs to the owner. # Primary key fingerprint: 215D 46F4 8246 689E C77F 3562 EF04 965B 398D 6211 * remotes/jasowang/tags/net-pull-request: tap: fix memory leak on success to create a tap device e1000e: Prevent MSI/MSI-X storms Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
9d5d247e32
@ -2023,6 +2023,7 @@ e1000e_msix_notify_one(E1000ECore *core, uint32_t cause, uint32_t int_cfg)
|
||||
effective_eiac = core->mac[EIAC] & cause;
|
||||
|
||||
core->mac[ICR] &= ~effective_eiac;
|
||||
core->msi_causes_pending &= ~effective_eiac;
|
||||
|
||||
if (!(core->mac[CTRL_EXT] & E1000_CTRL_EXT_IAME)) {
|
||||
core->mac[IMS] &= ~effective_eiac;
|
||||
@ -2119,6 +2120,13 @@ e1000e_send_msi(E1000ECore *core, bool msix)
|
||||
{
|
||||
uint32_t causes = core->mac[ICR] & core->mac[IMS] & ~E1000_ICR_ASSERTED;
|
||||
|
||||
core->msi_causes_pending &= causes;
|
||||
causes ^= core->msi_causes_pending;
|
||||
if (causes == 0) {
|
||||
return;
|
||||
}
|
||||
core->msi_causes_pending |= causes;
|
||||
|
||||
if (msix) {
|
||||
e1000e_msix_notify(core, causes);
|
||||
} else {
|
||||
@ -2156,6 +2164,9 @@ e1000e_update_interrupt_state(E1000ECore *core)
|
||||
core->mac[ICS] = core->mac[ICR];
|
||||
|
||||
interrupts_pending = (core->mac[IMS] & core->mac[ICR]) ? true : false;
|
||||
if (!interrupts_pending) {
|
||||
core->msi_causes_pending = 0;
|
||||
}
|
||||
|
||||
trace_e1000e_irq_pending_interrupts(core->mac[ICR] & core->mac[IMS],
|
||||
core->mac[ICR], core->mac[IMS]);
|
||||
|
@ -109,6 +109,8 @@ struct E1000Core {
|
||||
NICState *owner_nic;
|
||||
PCIDevice *owner;
|
||||
void (*owner_start_recv)(PCIDevice *d);
|
||||
|
||||
uint32_t msi_causes_pending;
|
||||
};
|
||||
|
||||
void
|
||||
|
16
net/tap.c
16
net/tap.c
@ -805,7 +805,8 @@ int net_init_tap(const Netdev *netdev, const char *name,
|
||||
} else if (tap->has_fds) {
|
||||
char **fds;
|
||||
char **vhost_fds;
|
||||
int nfds, nvhosts;
|
||||
int nfds = 0, nvhosts = 0;
|
||||
int ret = 0;
|
||||
|
||||
if (tap->has_ifname || tap->has_script || tap->has_downscript ||
|
||||
tap->has_vnet_hdr || tap->has_helper || tap->has_queues ||
|
||||
@ -825,6 +826,7 @@ int net_init_tap(const Netdev *netdev, const char *name,
|
||||
if (nfds != nvhosts) {
|
||||
error_setg(errp, "The number of fds passed does not match "
|
||||
"the number of vhostfds passed");
|
||||
ret = -1;
|
||||
goto free_fail;
|
||||
}
|
||||
}
|
||||
@ -833,6 +835,7 @@ int net_init_tap(const Netdev *netdev, const char *name,
|
||||
fd = monitor_fd_param(cur_mon, fds[i], &err);
|
||||
if (fd == -1) {
|
||||
error_propagate(errp, err);
|
||||
ret = -1;
|
||||
goto free_fail;
|
||||
}
|
||||
|
||||
@ -843,6 +846,7 @@ int net_init_tap(const Netdev *netdev, const char *name,
|
||||
} else if (vnet_hdr != tap_probe_vnet_hdr(fd)) {
|
||||
error_setg(errp,
|
||||
"vnet_hdr not consistent across given tap fds");
|
||||
ret = -1;
|
||||
goto free_fail;
|
||||
}
|
||||
|
||||
@ -852,21 +856,21 @@ int net_init_tap(const Netdev *netdev, const char *name,
|
||||
vnet_hdr, fd, &err);
|
||||
if (err) {
|
||||
error_propagate(errp, err);
|
||||
ret = -1;
|
||||
goto free_fail;
|
||||
}
|
||||
}
|
||||
g_free(fds);
|
||||
g_free(vhost_fds);
|
||||
return 0;
|
||||
|
||||
free_fail:
|
||||
for (i = 0; i < nvhosts; i++) {
|
||||
g_free(vhost_fds[i]);
|
||||
}
|
||||
for (i = 0; i < nfds; i++) {
|
||||
g_free(fds[i]);
|
||||
g_free(vhost_fds[i]);
|
||||
}
|
||||
g_free(fds);
|
||||
g_free(vhost_fds);
|
||||
return -1;
|
||||
return ret;
|
||||
} else if (tap->has_helper) {
|
||||
if (tap->has_ifname || tap->has_script || tap->has_downscript ||
|
||||
tap->has_vnet_hdr || tap->has_queues || tap->has_vhostfds) {
|
||||
|
Loading…
Reference in New Issue
Block a user