-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1 iQEcBAABAgAGBQJU1MtgAAoJEJykq7OBq3PId6IH/2p7BZSEal1CqmxgmcAyRxrB IZ3RkDKyCF3ELBozvJ9RLHEakARVBNBSc4YSiQTFIcE6QYe8rRWXthbo6k6MiCnC 5w3Yh1EdocKLNOU0jCl0yN0cqJyWp6ax//66K4iFn7Q1+LCRVs74JO7z9U7tEXuW cz3fRzb2OsP2tjUDTsnaIQNs7zewn1w9DgSnhtt9KS6rF9V9qDHeX4pjIcdEM45w S+YMUaLtTmyTJ55ldq7YCMjBU+3KxFQi8LuEPjCwBMLyLaF35Uy2N99NIHGa0696 P8WAL67SV4YR9KpKIjL3w82Fjx22cpe1cUuxVTkEzCTFKHgq2yzHTdy0I02nhkc= =9OUs -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/stefanha/tags/net-pull-request' into staging # gpg: Signature made Fri 06 Feb 2015 14:10:40 GMT using RSA key ID 81AB73C8 # gpg: Good signature from "Stefan Hajnoczi <stefanha@redhat.com>" # gpg: aka "Stefan Hajnoczi <stefanha@gmail.com>" * remotes/stefanha/tags/net-pull-request: monitor: more accurate completion for host_net_remove() net: del hub port when peer is deleted net: remove the wrong comment in net_init_hubport() monitor: print hub port name during info network rtl8139: simplify timer logic MAINTAINERS: add Jason Wang as net subsystem maintainer Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
		
						commit
						cebbae86b4
					
				| @ -863,6 +863,7 @@ T: git git://repo.or.cz/qemu/qmp-unstable.git queue/qmp | ||||
| Network device layer | ||||
| M: Anthony Liguori <aliguori@amazon.com> | ||||
| M: Stefan Hajnoczi <stefanha@redhat.com> | ||||
| M: Jason Wang <jasowang@redhat.com> | ||||
| S: Maintained | ||||
| F: net/ | ||||
| T: git git://github.com/stefanha/qemu.git net | ||||
|  | ||||
| @ -508,7 +508,6 @@ typedef struct RTL8139State { | ||||
| 
 | ||||
|     /* PCI interrupt timer */ | ||||
|     QEMUTimer *timer; | ||||
|     int64_t TimerExpire; | ||||
| 
 | ||||
|     MemoryRegion bar_io; | ||||
|     MemoryRegion bar_mem; | ||||
| @ -520,7 +519,7 @@ typedef struct RTL8139State { | ||||
| /* Writes tally counters to memory via DMA */ | ||||
| static void RTL8139TallyCounters_dma_write(RTL8139State *s, dma_addr_t tc_addr); | ||||
| 
 | ||||
| static void rtl8139_set_next_tctr_time(RTL8139State *s, int64_t current_time); | ||||
| static void rtl8139_set_next_tctr_time(RTL8139State *s); | ||||
| 
 | ||||
| static void prom9346_decode_command(EEprom9346 *eeprom, uint8_t command) | ||||
| { | ||||
| @ -1282,6 +1281,7 @@ static void rtl8139_reset(DeviceState *d) | ||||
|     s->TCTR = 0; | ||||
|     s->TimerInt = 0; | ||||
|     s->TCTR_base = 0; | ||||
|     rtl8139_set_next_tctr_time(s); | ||||
| 
 | ||||
|     /* reset tally counters */ | ||||
|     RTL8139TallyCounters_clear(&s->tally_counters); | ||||
| @ -2652,7 +2652,6 @@ static void rtl8139_IntrMask_write(RTL8139State *s, uint32_t val) | ||||
| 
 | ||||
|     s->IntrMask = val; | ||||
| 
 | ||||
|     rtl8139_set_next_tctr_time(s, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL)); | ||||
|     rtl8139_update_irq(s); | ||||
| 
 | ||||
| } | ||||
| @ -2687,13 +2686,7 @@ static void rtl8139_IntrStatus_write(RTL8139State *s, uint32_t val) | ||||
|     rtl8139_update_irq(s); | ||||
| 
 | ||||
|     s->IntrStatus = newStatus; | ||||
|     /*
 | ||||
|      * Computing if we miss an interrupt here is not that correct but | ||||
|      * considered that we should have had already an interrupt | ||||
|      * and probably emulated is slower is better to assume this resetting was | ||||
|      * done before testing on previous rtl8139_update_irq lead to IRQ losing | ||||
|      */ | ||||
|     rtl8139_set_next_tctr_time(s, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL)); | ||||
|     rtl8139_set_next_tctr_time(s); | ||||
|     rtl8139_update_irq(s); | ||||
| 
 | ||||
| #endif | ||||
| @ -2701,8 +2694,6 @@ static void rtl8139_IntrStatus_write(RTL8139State *s, uint32_t val) | ||||
| 
 | ||||
| static uint32_t rtl8139_IntrStatus_read(RTL8139State *s) | ||||
| { | ||||
|     rtl8139_set_next_tctr_time(s, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL)); | ||||
| 
 | ||||
|     uint32_t ret = s->IntrStatus; | ||||
| 
 | ||||
|     DPRINTF("IntrStatus read(w) val=0x%04x\n", ret); | ||||
| @ -2885,43 +2876,32 @@ static void rtl8139_io_writew(void *opaque, uint8_t addr, uint32_t val) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| static void rtl8139_set_next_tctr_time(RTL8139State *s, int64_t current_time) | ||||
| static void rtl8139_set_next_tctr_time(RTL8139State *s) | ||||
| { | ||||
|     int64_t pci_time, next_time; | ||||
|     uint32_t low_pci; | ||||
|     const uint64_t ns_per_period = | ||||
|         muldiv64(0x100000000LL, get_ticks_per_sec(), PCI_FREQUENCY); | ||||
| 
 | ||||
|     DPRINTF("entered rtl8139_set_next_tctr_time\n"); | ||||
| 
 | ||||
|     if (s->TimerExpire && current_time >= s->TimerExpire) { | ||||
|         s->IntrStatus |= PCSTimeout; | ||||
|         rtl8139_update_irq(s); | ||||
|     } | ||||
| 
 | ||||
|     /* Set QEMU timer only if needed that is
 | ||||
|      * - TimerInt <> 0 (we have a timer) | ||||
|      * - mask = 1 (we want an interrupt timer) | ||||
|      * - irq = 0  (irq is not already active) | ||||
|      * If any of above change we need to compute timer again | ||||
|      * Also we must check if timer is passed without QEMU timer | ||||
|     /* This function is called at least once per period, so it is a good
 | ||||
|      * place to update the timer base. | ||||
|      * | ||||
|      * After one iteration of this loop the value in the Timer register does | ||||
|      * not change, but the device model is counting up by 2^32 ticks (approx. | ||||
|      * 130 seconds). | ||||
|      */ | ||||
|     s->TimerExpire = 0; | ||||
|     while (s->TCTR_base + ns_per_period <= qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL)) { | ||||
|         s->TCTR_base += ns_per_period; | ||||
|     } | ||||
| 
 | ||||
|     if (!s->TimerInt) { | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     pci_time = muldiv64(current_time - s->TCTR_base, PCI_FREQUENCY, | ||||
|                                 get_ticks_per_sec()); | ||||
|     low_pci = pci_time & 0xffffffff; | ||||
|     pci_time = pci_time - low_pci + s->TimerInt; | ||||
|     if (low_pci >= s->TimerInt) { | ||||
|         pci_time += 0x100000000LL; | ||||
|     } | ||||
|     next_time = s->TCTR_base + muldiv64(pci_time, get_ticks_per_sec(), | ||||
|                                                 PCI_FREQUENCY); | ||||
|     s->TimerExpire = next_time; | ||||
| 
 | ||||
|     if ((s->IntrMask & PCSTimeout) != 0 && (s->IntrStatus & PCSTimeout) == 0) { | ||||
|         timer_mod(s->timer, next_time); | ||||
|         timer_del(s->timer); | ||||
|     } else { | ||||
|         uint64_t delta = muldiv64(s->TimerInt, get_ticks_per_sec(), PCI_FREQUENCY); | ||||
|         if (s->TCTR_base + delta <= qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL)) { | ||||
|             delta += ns_per_period; | ||||
|         } | ||||
|         timer_mod(s->timer, s->TCTR_base + delta); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| @ -2969,14 +2949,14 @@ static void rtl8139_io_writel(void *opaque, uint8_t addr, uint32_t val) | ||||
|         case Timer: | ||||
|             DPRINTF("TCTR Timer reset on write\n"); | ||||
|             s->TCTR_base = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); | ||||
|             rtl8139_set_next_tctr_time(s, s->TCTR_base); | ||||
|             rtl8139_set_next_tctr_time(s); | ||||
|             break; | ||||
| 
 | ||||
|         case FlashReg: | ||||
|             DPRINTF("FlashReg TimerInt write val=0x%08x\n", val); | ||||
|             if (s->TimerInt != val) { | ||||
|                 s->TimerInt = val; | ||||
|                 rtl8139_set_next_tctr_time(s, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL)); | ||||
|                 rtl8139_set_next_tctr_time(s); | ||||
|             } | ||||
|             break; | ||||
| 
 | ||||
| @ -3253,7 +3233,7 @@ static uint32_t rtl8139_mmio_readl(void *opaque, hwaddr addr) | ||||
| static int rtl8139_post_load(void *opaque, int version_id) | ||||
| { | ||||
|     RTL8139State* s = opaque; | ||||
|     rtl8139_set_next_tctr_time(s, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL)); | ||||
|     rtl8139_set_next_tctr_time(s); | ||||
|     if (version_id < 4) { | ||||
|         s->cplus_enabled = s->CpCmd != 0; | ||||
|     } | ||||
| @ -3284,8 +3264,7 @@ static void rtl8139_pre_save(void *opaque) | ||||
|     RTL8139State* s = opaque; | ||||
|     int64_t current_time = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); | ||||
| 
 | ||||
|     /* set IntrStatus correctly */ | ||||
|     rtl8139_set_next_tctr_time(s, current_time); | ||||
|     /* for migration to older versions */ | ||||
|     s->TCTR = muldiv64(current_time - s->TCTR_base, PCI_FREQUENCY, | ||||
|                        get_ticks_per_sec()); | ||||
|     s->rtl8139_mmio_io_addr_dummy = 0; | ||||
| @ -3452,7 +3431,7 @@ static void rtl8139_timer(void *opaque) | ||||
| 
 | ||||
|     s->IntrStatus |= PCSTimeout; | ||||
|     rtl8139_update_irq(s); | ||||
|     rtl8139_set_next_tctr_time(s, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL)); | ||||
|     rtl8139_set_next_tctr_time(s); | ||||
| } | ||||
| 
 | ||||
| static void pci_rtl8139_uninit(PCIDevice *dev) | ||||
| @ -3530,9 +3509,7 @@ static int pci_rtl8139_init(PCIDevice *dev) | ||||
|     s->cplus_txbuffer_len = 0; | ||||
|     s->cplus_txbuffer_offset = 0; | ||||
| 
 | ||||
|     s->TimerExpire = 0; | ||||
|     s->timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, rtl8139_timer, s); | ||||
|     rtl8139_set_next_tctr_time(s, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL)); | ||||
| 
 | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| @ -4598,8 +4598,13 @@ void host_net_remove_completion(ReadLineState *rs, int nb_args, const char *str) | ||||
|         count = qemu_find_net_clients_except(NULL, ncs, | ||||
|                                              NET_CLIENT_OPTIONS_KIND_NIC, 255); | ||||
|         for (i = 0; i < count; i++) { | ||||
|             int id; | ||||
|             const char *name; | ||||
| 
 | ||||
|             if (ncs[i]->info->type == NET_CLIENT_OPTIONS_KIND_HUBPORT || | ||||
|                 net_hub_id_for_client(ncs[i], &id)) { | ||||
|                 continue; | ||||
|             } | ||||
|             name = ncs[i]->name; | ||||
|             if (!strncmp(str, name, len)) { | ||||
|                 readline_add_completion(rs, name); | ||||
|  | ||||
| @ -245,9 +245,12 @@ void net_hub_info(Monitor *mon) | ||||
|     QLIST_FOREACH(hub, &hubs, next) { | ||||
|         monitor_printf(mon, "hub %d\n", hub->id); | ||||
|         QLIST_FOREACH(port, &hub->ports, next) { | ||||
|             monitor_printf(mon, " \\ %s", port->nc.name); | ||||
|             if (port->nc.peer) { | ||||
|                 monitor_printf(mon, " \\ "); | ||||
|                 monitor_printf(mon, ": "); | ||||
|                 print_net_client(mon, port->nc.peer); | ||||
|             } else { | ||||
|                 monitor_printf(mon, "\n"); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| @ -285,7 +288,6 @@ int net_init_hubport(const NetClientOptions *opts, const char *name, | ||||
|     assert(opts->kind == NET_CLIENT_OPTIONS_KIND_HUBPORT); | ||||
|     hubport = opts->hubport; | ||||
| 
 | ||||
|     /* Treat hub port like a backend, NIC must be the one to peer */ | ||||
|     if (peer) { | ||||
|         return -EINVAL; | ||||
|     } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Peter Maydell
						Peter Maydell