qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Mark Wu <wudxw@vnet.linux.ibm.com>
To: Jason Wang <jasowang@redhat.com>
Cc: blauwirbel@gmail.com, aliguori@us.ibm.com, mst@redhat.com,
	qemu-devel@nongnu.org, stefanha@linux.vnet.ibm.com
Subject: Re: [Qemu-devel] [V2 PATCH] rtl8139: check the buffer availiability
Date: Tue, 18 Oct 2011 18:09:42 +0800	[thread overview]
Message-ID: <4E9D5066.7070305@vnet.linux.ibm.com> (raw)
In-Reply-To: <20111017025557.4572.2621.stgit@dhcp-8-146.nay.redhat.com>

Hi Jason,
Could you please elaborate what problem you try to resolve by this 
patch?  And do you think we need notify I/O thread re-polling tap fd 
when receive descriptor becomes available? Otherwise, tap read polling 
will be disabled until the I/O handlers are updated by other reasons. Am 
I right?


On 10/17/2011 10:55 AM, Jason Wang wrote:
> Reduce spurious packet drops on RX ring empty when in c+ mode by verifying that
> we have at least 1 buffer ahead of the time.
>
> Change from v1:
> Fix style comments from Stefan.
>
> Signed-off-by: Jason Wang<jasowang@redhat.com>
> ---
>   hw/rtl8139.c |   44 ++++++++++++++++++++++++++++++--------------
>   1 files changed, 30 insertions(+), 14 deletions(-)
>
> diff --git a/hw/rtl8139.c b/hw/rtl8139.c
> index 3753950..bcbc5e3 100644
> --- a/hw/rtl8139.c
> +++ b/hw/rtl8139.c
> @@ -84,6 +84,19 @@
>   #define VLAN_TCI_LEN 2
>   #define VLAN_HLEN (ETHER_TYPE_LEN + VLAN_TCI_LEN)
>
> +/* w0 ownership flag */
> +#define CP_RX_OWN (1<<31)
> +/* w0 end of ring flag */
> +#define CP_RX_EOR (1<<30)
> +/* w0 bits 0...12 : buffer size */
> +#define CP_RX_BUFFER_SIZE_MASK ((1<<13) - 1)
> +/* w1 tag available flag */
> +#define CP_RX_TAVA (1<<16)
> +/* w1 bits 0...15 : VLAN tag */
> +#define CP_RX_VLAN_TAG_MASK ((1<<16) - 1)
> +/* w2 low  32bit of Rx buffer ptr */
> +/* w3 high 32bit of Rx buffer ptr */
> +
>   #if defined (DEBUG_RTL8139)
>   #  define DPRINTF(fmt, ...) \
>       do { fprintf(stderr, "RTL8139: " fmt, ## __VA_ARGS__); } while (0)
> @@ -805,6 +818,22 @@ static inline target_phys_addr_t rtl8139_addr64(uint32_t low, uint32_t high)
>   #endif
>   }
>
> +/* Verify that we have at least one available rx buffer */
> +static int rtl8139_cp_has_rxbuf(RTL8139State *s)
> +{
> +    uint32_t val, rxdw0;
> +    target_phys_addr_t cplus_rx_ring_desc = rtl8139_addr64(s->RxRingAddrLO,
> +                                                           s->RxRingAddrHI);
> +    cplus_rx_ring_desc += 16 * s->currCPlusRxDesc;
> +    cpu_physical_memory_read(cplus_rx_ring_desc,&val, 4);
> +    rxdw0 = le32_to_cpu(val);
> +    if (rxdw0&  CP_RX_OWN) {
> +        return 1;
> +    } else {
> +        return 0;
> +    }
> +}
> +
>   static int rtl8139_can_receive(VLANClientState *nc)
>   {
>       RTL8139State *s = DO_UPCAST(NICState, nc, nc)->opaque;
> @@ -819,7 +848,7 @@ static int rtl8139_can_receive(VLANClientState *nc)
>       if (rtl8139_cp_receiver_enabled(s)) {
>           /* ??? Flow control not implemented in c+ mode.
>              This is a hack to work around slirp deficiencies anyway.  */
> -        return 1;
> +        return rtl8139_cp_has_rxbuf(s);
>       } else {
>           avail = MOD2(s->RxBufferSize + s->RxBufPtr - s->RxBufAddr,
>                        s->RxBufferSize);
> @@ -965,19 +994,6 @@ static ssize_t rtl8139_do_receive(VLANClientState *nc, const uint8_t *buf, size_
>
>           /* begin C+ receiver mode */
>
> -/* w0 ownership flag */
> -#define CP_RX_OWN (1<<31)
> -/* w0 end of ring flag */
> -#define CP_RX_EOR (1<<30)
> -/* w0 bits 0...12 : buffer size */
> -#define CP_RX_BUFFER_SIZE_MASK ((1<<13) - 1)
> -/* w1 tag available flag */
> -#define CP_RX_TAVA (1<<16)
> -/* w1 bits 0...15 : VLAN tag */
> -#define CP_RX_VLAN_TAG_MASK ((1<<16) - 1)
> -/* w2 low  32bit of Rx buffer ptr */
> -/* w3 high 32bit of Rx buffer ptr */
> -
>           int descriptor = s->currCPlusRxDesc;
>           target_phys_addr_t cplus_rx_ring_desc;
>
>
>

  reply	other threads:[~2011-10-18 10:12 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-10-17  2:55 [Qemu-devel] [V2 PATCH] rtl8139: check the buffer availiability Jason Wang
2011-10-18 10:09 ` Mark Wu [this message]
2011-10-22  4:18   ` Jason Wang
2011-10-19  1:28 ` Michael S. Tsirkin
2011-10-22  4:30   ` Jason Wang

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=4E9D5066.7070305@vnet.linux.ibm.com \
    --to=wudxw@vnet.linux.ibm.com \
    --cc=aliguori@us.ibm.com \
    --cc=blauwirbel@gmail.com \
    --cc=jasowang@redhat.com \
    --cc=mst@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@linux.vnet.ibm.com \
    /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).