qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Vlad Yasevich <vyasevic@redhat.com>
To: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH] e1000/rtl8139: update HMP NIC when every bit is written
Date: Thu, 07 Nov 2013 10:43:33 -0500	[thread overview]
Message-ID: <527BB525.4050900@redhat.com> (raw)
In-Reply-To: <20131107152728.GA3739@redhat.com>

On 11/07/2013 10:27 AM, Michael S. Tsirkin wrote:
> On Thu, Nov 07, 2013 at 07:33:57AM -0700, Alex Williamson wrote:
>> On Thu, 2013-11-07 at 12:26 +0200, Michael S. Tsirkin wrote:
>>> On Thu, Nov 07, 2013 at 03:32:29PM +0800, Amos Kong wrote:
>>>> On Thu, Nov 07, 2013 at 08:59:22AM +0200, Michael S. Tsirkin wrote:
>>>>> On Tue, Nov 05, 2013 at 07:17:18PM +0800, Amos Kong wrote:
>>>>>> We currently just update the HMP NIC info when the last bit of macaddr
>>>>>> is written. This assumes that guest driver will write all the macaddr
>>>>>> from bit 0 to bit 5 when it changes the macaddr, this is the current
>>>>>> behavior of linux driver (e1000/rtl8139cp), but we can't do this
>>>>>> assumption.
>>>>>>
>>>>>> The macaddr that is used for rx-filter will be updated when every bit
>>>>>> is changed. This patch updates the e1000/rtl8139 nic to update HMP NIC
>>>>>> info when every bit is changed. It will be same as virtio-net.
>>>>>>
>>>>>> Signed-off-by: Amos Kong <akong@redhat.com>
>>>>>
>>>>> I'm not sure I buy this.
>>>>>
>>>>> If we actually implement e.g. mac change notifications,
>>>>> sending them on writes of random bytes will confuse
>>>>> the host.
>>>>
>>>> This patch just effects the monitor display of macaddr.
>>>> During each writing, the macaddr is used for rx-filter is really
>>>> changed.
>>>>
>>>> In the real hardware, it supports to just write part of bits,
>>>> the rx-filtering is effected by every bit writing.
>>>
>>> Yes but again, the window can just be too small to matter
>>> on real hardware.
>>>
>>> Our emulation is not perfect, fixing this to be just like real
>>> hardware just might expose other bugs we can't fix
>>> that easily.
>>
>> If we were to implement mac change notification, then every partial
>> update would send a notify and the host.  Is that a problem?  It seems
>> no different than if the device had an atomic mac update procedure and
>> the guest admin changed the mac several times.
>
> I think modern nics make address updates atomic.
> Problem is, we are emulating an ancient one,
> so to make host configuration of a modern one
> reasonable we need to resort to tricks.
>
>> The problem with assuming that a given byte is always written last is
>> that unless the hardware spec identifies an order, we're just basing our
>> code on examples where we know what the guest driver does, either by
>> code inspection or access tracing.  If there are examples of guests that
>> write the last byte first, then the host will never know the correct mac
>> address.  Maybe there are no guests that use the wrong order, but that's
>> a pretty exhaustive search.
>
> I agree what we have is a hack. Maybe we need some better hacks.
> For example, maybe we should update mac at link state change
> (I think  link is always down when mac is updated?).
> Needs some thought.

I thought this too, but checking recent linux kernel, e1000 and rtl8139 
seem to allow live mac change so link is up.

So here is a stupid, untested patch for e1000 to notify only once:
diff --git a/hw/net/e1000.c b/hw/net/e1000.c
index 8387443..b99eba4 100644
--- a/hw/net/e1000.c
+++ b/hw/net/e1000.c
@@ -149,6 +149,10 @@ typedef struct E1000State_st {
  #define E1000_FLAG_AUTONEG (1 << E1000_FLAG_AUTONEG_BIT)
  #define E1000_FLAG_MIT (1 << E1000_FLAG_MIT_BIT)
      uint32_t compat_flags;
+    uint32_t mac_change_flags;
+#define E1000_RA0_CHANGED 0
+#define E1000_RA1_CHANGED 1
+#define E1000_RA_ALL_CHANGED (E1000_RA0_CHANGED|E1000_RA1_CHANGED)
  } E1000State;

  #define TYPE_E1000 "e1000"
@@ -402,6 +406,7 @@ static void e1000_reset(void *opaque)
          d->mac_reg[RA + 1] |= (i < 2) ? macaddr[i + 4] << (8 * i) : 0;
      }
      qemu_format_nic_info_str(qemu_get_queue(d->nic), macaddr);
+    d->mac_change_flags = 0;
  }

  static void
@@ -1106,10 +1111,20 @@ mac_writereg(E1000State *s, int index, uint32_t val)

      s->mac_reg[index] = val;

-    if (index == RA + 1) {
+    switch (index) {
+           case RA:
+                   s->mac_change_flags |= E1000_RA0_CHANGED;
+                   break;
+           case (RA + 1):
+                   s->mac_change_flags |= E1000_RA1_CHANGED;
+                   break;
+    }
+
+    if (!(s->mac_change_flags ^ E1000_RA_ALL_CHANGED)) {
          macaddr[0] = cpu_to_le32(s->mac_reg[RA]);
          macaddr[1] = cpu_to_le32(s->mac_reg[RA + 1]);
          qemu_format_nic_info_str(qemu_get_queue(s->nic), (uint8_t 
*)macaddr);
+        s->mac_change_flags = 0;
      }
  }

Any thoughts?

-vlad

  reply	other threads:[~2013-11-07 15:43 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-11-05 11:17 [Qemu-devel] [PATCH] e1000/rtl8139: update HMP NIC when every bit is written Amos Kong
2013-11-07  2:59 ` Alex Williamson
2013-11-07  6:59 ` Michael S. Tsirkin
2013-11-07  7:32   ` Amos Kong
2013-11-07 10:26     ` Michael S. Tsirkin
2013-11-07 14:33       ` Alex Williamson
2013-11-07 15:27         ` Michael S. Tsirkin
2013-11-07 15:43           ` Vlad Yasevich [this message]
2013-11-07 15:49         ` Vlad Yasevich
2013-11-08 19:42 ` Vlad Yasevich
2013-11-09  3:43   ` Amos Kong
2013-11-12 19:57     ` Vlad Yasevich
2013-11-10 12:11   ` Michael S. Tsirkin
2013-11-12 15:49     ` Vlad Yasevich
2013-11-13 16:21     ` Vlad Yasevich
2013-11-13 20:00       ` Michael S. Tsirkin
2013-11-13 20:26         ` Vlad Yasevich
2013-11-13 21:55           ` Michael S. Tsirkin
2013-11-18 15:02 ` Michael S. Tsirkin
2013-11-18 17:33   ` Vlad Yasevich
2013-11-18 19:42     ` Michael S. Tsirkin
2013-11-18 19:42       ` Vlad Yasevich

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=527BB525.4050900@redhat.com \
    --to=vyasevic@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).