-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1 iQEcBAABAgAGBQJcncmSAAoJEO8Ells5jWIRh8YH/2EXWKEBlN1TSWZQrL3ifq+4 OS1335yGK34uQrZEvhgpGlHDuvwUn+1ma8YHgkpGGohQaOb91FqDZLQi6aZ1/XBX 2aLt46XSgvp3y9EO2dVeFepW2dTyAPZMCkWEvJINXpRQQ6X2iu0iDjZoqB3aA8dU UP8I3FsoFOg4A2haiMxBgGhldf9VCAJtoKrMoxOOgDhCypwZPqSlmRn3QeqO0MmG aVDt5MBqKIXMmG2cUDy+KvsylGXtZ9VisvIU4UAIJaUGEopuYygEYQQhETN9uAXK ts6yWdfAU438NcNoFnChrNeHwQS8TuZlV1pcV7xQ2gaKB1cS3I+MGWOzTTWD/zs= =4PKd -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/jasowang/tags/net-pull-request' into staging # gpg: Signature made Fri 29 Mar 2019 07:30:26 GMT # gpg: using RSA key EF04965B398D6211 # gpg: Good signature from "Jason Wang (Jason Wang on RedHat) <jasowang@redhat.com>" [marginal] # 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: net: tap: use qemu_set_nonblock MAINTAINERS: Update the latest email address e1000: Delay flush queue when receive RCTL net/socket: learn to talk with a unix dgram socket Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
c503849bb5
|
@ -2179,7 +2179,7 @@ F: include/migration/failover.h
|
|||
F: docs/COLO-FT.txt
|
||||
|
||||
COLO Proxy
|
||||
M: Zhang Chen <zhangckid@gmail.com>
|
||||
M: Zhang Chen <chen.zhang@intel.com>
|
||||
M: Li Zhijian <lizhijian@cn.fujitsu.com>
|
||||
S: Supported
|
||||
F: docs/colo-proxy.txt
|
||||
|
|
|
@ -120,6 +120,8 @@ typedef struct E1000State_st {
|
|||
bool mit_irq_level; /* Tracks interrupt pin level. */
|
||||
uint32_t mit_ide; /* Tracks E1000_TXD_CMD_IDE bit. */
|
||||
|
||||
QEMUTimer *flush_queue_timer;
|
||||
|
||||
/* Compatibility flags for migration to/from qemu 1.3.0 and older */
|
||||
#define E1000_FLAG_AUTONEG_BIT 0
|
||||
#define E1000_FLAG_MIT_BIT 1
|
||||
|
@ -366,6 +368,7 @@ static void e1000_reset(void *opaque)
|
|||
|
||||
timer_del(d->autoneg_timer);
|
||||
timer_del(d->mit_timer);
|
||||
timer_del(d->flush_queue_timer);
|
||||
d->mit_timer_on = 0;
|
||||
d->mit_irq_level = 0;
|
||||
d->mit_ide = 0;
|
||||
|
@ -391,6 +394,14 @@ set_ctrl(E1000State *s, int index, uint32_t val)
|
|||
s->mac_reg[CTRL] = val & ~E1000_CTRL_RST;
|
||||
}
|
||||
|
||||
static void
|
||||
e1000_flush_queue_timer(void *opaque)
|
||||
{
|
||||
E1000State *s = opaque;
|
||||
|
||||
qemu_flush_queued_packets(qemu_get_queue(s->nic));
|
||||
}
|
||||
|
||||
static void
|
||||
set_rx_control(E1000State *s, int index, uint32_t val)
|
||||
{
|
||||
|
@ -399,7 +410,8 @@ set_rx_control(E1000State *s, int index, uint32_t val)
|
|||
s->rxbuf_min_shift = ((val / E1000_RCTL_RDMTS_QUAT) & 3) + 1;
|
||||
DBGOUT(RX, "RCTL: %d, mac_reg[RCTL] = 0x%x\n", s->mac_reg[RDT],
|
||||
s->mac_reg[RCTL]);
|
||||
qemu_flush_queued_packets(qemu_get_queue(s->nic));
|
||||
timer_mod(s->flush_queue_timer,
|
||||
qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + 1000);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -837,7 +849,7 @@ e1000_can_receive(NetClientState *nc)
|
|||
E1000State *s = qemu_get_nic_opaque(nc);
|
||||
|
||||
return e1000x_rx_ready(&s->parent_obj, s->mac_reg) &&
|
||||
e1000_has_rxbufs(s, 1);
|
||||
e1000_has_rxbufs(s, 1) && !timer_pending(s->flush_queue_timer);
|
||||
}
|
||||
|
||||
static uint64_t rx_desc_base(E1000State *s)
|
||||
|
@ -881,6 +893,10 @@ e1000_receive_iov(NetClientState *nc, const struct iovec *iov, int iovcnt)
|
|||
return -1;
|
||||
}
|
||||
|
||||
if (timer_pending(s->flush_queue_timer)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Pad to minimum Ethernet frame length */
|
||||
if (size < sizeof(min_buf)) {
|
||||
iov_to_buf(iov, iovcnt, 0, min_buf, size);
|
||||
|
@ -1637,6 +1653,8 @@ pci_e1000_uninit(PCIDevice *dev)
|
|||
timer_free(d->autoneg_timer);
|
||||
timer_del(d->mit_timer);
|
||||
timer_free(d->mit_timer);
|
||||
timer_del(d->flush_queue_timer);
|
||||
timer_free(d->flush_queue_timer);
|
||||
qemu_del_nic(d->nic);
|
||||
}
|
||||
|
||||
|
@ -1700,6 +1718,8 @@ static void pci_e1000_realize(PCIDevice *pci_dev, Error **errp)
|
|||
|
||||
d->autoneg_timer = timer_new_ms(QEMU_CLOCK_VIRTUAL, e1000_autoneg_timer, d);
|
||||
d->mit_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, e1000_mit_timer, d);
|
||||
d->flush_queue_timer = timer_new_ms(QEMU_CLOCK_VIRTUAL,
|
||||
e1000_flush_queue_timer, d);
|
||||
}
|
||||
|
||||
static void qdev_e1000_reset(DeviceState *dev)
|
||||
|
|
25
net/socket.c
25
net/socket.c
|
@ -119,9 +119,13 @@ static ssize_t net_socket_receive_dgram(NetClientState *nc, const uint8_t *buf,
|
|||
ssize_t ret;
|
||||
|
||||
do {
|
||||
ret = qemu_sendto(s->fd, buf, size, 0,
|
||||
(struct sockaddr *)&s->dgram_dst,
|
||||
sizeof(s->dgram_dst));
|
||||
if (s->dgram_dst.sin_family != AF_UNIX) {
|
||||
ret = qemu_sendto(s->fd, buf, size, 0,
|
||||
(struct sockaddr *)&s->dgram_dst,
|
||||
sizeof(s->dgram_dst));
|
||||
} else {
|
||||
ret = send(s->fd, buf, size, 0);
|
||||
}
|
||||
} while (ret == -1 && errno == EINTR);
|
||||
|
||||
if (ret == -1 && errno == EAGAIN) {
|
||||
|
@ -336,6 +340,15 @@ static NetSocketState *net_socket_fd_init_dgram(NetClientState *peer,
|
|||
int newfd;
|
||||
NetClientState *nc;
|
||||
NetSocketState *s;
|
||||
SocketAddress *sa;
|
||||
SocketAddressType sa_type;
|
||||
|
||||
sa = socket_local_address(fd, errp);
|
||||
if (!sa) {
|
||||
return NULL;
|
||||
}
|
||||
sa_type = sa->type;
|
||||
qapi_free_SocketAddress(sa);
|
||||
|
||||
/* fd passed: multicast: "learn" dgram_dst address from bound address and save it
|
||||
* Because this may be "shared" socket from a "master" process, datagrams would be recv()
|
||||
|
@ -379,8 +392,12 @@ static NetSocketState *net_socket_fd_init_dgram(NetClientState *peer,
|
|||
"socket: fd=%d (cloned mcast=%s:%d)",
|
||||
fd, inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
|
||||
} else {
|
||||
if (sa_type == SOCKET_ADDRESS_TYPE_UNIX) {
|
||||
s->dgram_dst.sin_family = AF_UNIX;
|
||||
}
|
||||
|
||||
snprintf(nc->info_str, sizeof(nc->info_str),
|
||||
"socket: fd=%d", fd);
|
||||
"socket: fd=%d %s", fd, SocketAddressType_str(sa_type));
|
||||
}
|
||||
|
||||
return s;
|
||||
|
|
10
net/tap.c
10
net/tap.c
|
@ -592,7 +592,7 @@ int net_init_bridge(const Netdev *netdev, const char *name,
|
|||
return -1;
|
||||
}
|
||||
|
||||
fcntl(fd, F_SETFL, O_NONBLOCK);
|
||||
qemu_set_nonblock(fd);
|
||||
vnet_hdr = tap_probe_vnet_hdr(fd);
|
||||
s = net_tap_fd_init(peer, "bridge", name, fd, vnet_hdr);
|
||||
|
||||
|
@ -707,7 +707,7 @@ static void net_init_tap_one(const NetdevTapOptions *tap, NetClientState *peer,
|
|||
}
|
||||
return;
|
||||
}
|
||||
fcntl(vhostfd, F_SETFL, O_NONBLOCK);
|
||||
qemu_set_nonblock(vhostfd);
|
||||
}
|
||||
options.opaque = (void *)(uintptr_t)vhostfd;
|
||||
|
||||
|
@ -791,7 +791,7 @@ int net_init_tap(const Netdev *netdev, const char *name,
|
|||
return -1;
|
||||
}
|
||||
|
||||
fcntl(fd, F_SETFL, O_NONBLOCK);
|
||||
qemu_set_nonblock(fd);
|
||||
|
||||
vnet_hdr = tap_probe_vnet_hdr(fd);
|
||||
|
||||
|
@ -839,7 +839,7 @@ int net_init_tap(const Netdev *netdev, const char *name,
|
|||
goto free_fail;
|
||||
}
|
||||
|
||||
fcntl(fd, F_SETFL, O_NONBLOCK);
|
||||
qemu_set_nonblock(fd);
|
||||
|
||||
if (i == 0) {
|
||||
vnet_hdr = tap_probe_vnet_hdr(fd);
|
||||
|
@ -887,7 +887,7 @@ free_fail:
|
|||
return -1;
|
||||
}
|
||||
|
||||
fcntl(fd, F_SETFL, O_NONBLOCK);
|
||||
qemu_set_nonblock(fd);
|
||||
vnet_hdr = tap_probe_vnet_hdr(fd);
|
||||
|
||||
net_init_tap_one(tap, peer, "bridge", name, ifname,
|
||||
|
|
Loading…
Reference in a new issue