On Fri, Mar 21, 2014 at 4:13 PM, Thomas Graf <tg...@redhat.com> wrote:
> On 03/21/2014 07:03 PM, Pravin wrote:
>
> Some comments below. I'll start experimenting with this as well.
>
>
>> +
>> +#define MTU_TO_MAX_LEN(mtu)  ((mtu) + ETHER_HDR_LEN + ETHER_CRC_LEN)
>> +#define MBUF_SIZE(mtu)       (MTU_TO_MAX_LEN(mtu) + (512) + \
>> +                             sizeof(struct rte_mbuf) +
>> RTE_PKTMBUF_HEADROOM)
>> +
>> +/* TODO: mempool size should be based on system resources. */
>> +#define NB_MBUF              (4096 * 64)
>> +#define MP_CACHE_SZ          (256 * 2)
>
>
> Would be great to move this into ovsdb.
>
Over time I want to move most of configuration to ovsdb or ovs-appctl.

>
>> +#define SOCKET0              0
>> +
>> +#define NON_PMD_THREAD_TX_QUEUE 0
>> +
>> +/* TODO: Needs per NIC value for these constants. */
>> +#define RX_PTHRESH 32 /* Default values of RX prefetch threshold reg. */
>> +#define RX_HTHRESH 32 /* Default values of RX host threshold reg. */
>> +#define RX_WTHRESH 16 /* Default values of RX write-back threshold reg.
>> */
>> +
>> +#define TX_PTHRESH 36 /* Default values of TX prefetch threshold reg. */
>> +#define TX_HTHRESH 0  /* Default values of TX host threshold reg. */
>> +#define TX_WTHRESH 0  /* Default values of TX write-back threshold reg.
>> */
>> +
>> +static const struct rte_eth_conf port_conf = {
>> +        .rxmode = {
>> +                .mq_mode = ETH_MQ_RX_RSS,
>> +                .split_hdr_size = 0,
>> +                .header_split   = 0, /* Header Split disabled */
>> +                .hw_ip_checksum = 0, /* IP checksum offload enabled */
>
>
> Comment does not seem to match reality ;-)
>
I will update comment.

>
>> +                .hw_vlan_filter = 0, /* VLAN filtering disabled */
>> +                .jumbo_frame    = 0, /* Jumbo Frame Support disabled */
>> +                .hw_strip_crc   = 0, /* CRC stripped by hardware */
>
>
> I understand the reason to disable jumbo frames. can you elaborate
> on the reason to disable IP checksum and HW VLAN strip?
>
For now I have not enabled offload for any NIC, I need to investigate it first.

>
>> +        },
>> +        .rx_adv_conf = {
>> +                .rss_conf = {
>> +                        .rss_key = NULL,
>> +                        .rss_hf = ETH_RSS_IPV4_TCP | ETH_RSS_IPV4 |
>> ETH_RSS_IPV6,
>
>
> This should be configurable at some point too to allow enabling
> UDPv4 RSS to scale UDP encap across queues.
>
OK.

>
>> +                },
>> +        },
>> +        .txmode = {
>> +                .mq_mode = ETH_MQ_TX_NONE,
>> +        },
>> +};
>> +
>
>
>> +/* TODO: use dpdk malloc for entire OVS. infact huge page shld be used
>> + * for all other sengments data, bss and text. */
>
>
> The assimilation has begun ;-)
>
Nice.

>
>
>> +static int
>> +netdev_dpdk_get_config(const struct netdev *netdev_, struct smap *args)
>> +{
>> +    struct netdev_dpdk *dev = netdev_dpdk_cast(netdev_);
>> +
>> +    ovs_mutex_lock(&dev->mutex);
>> +
>> +    /* TODO: Allow to configure number of queues. */
>
>
> Same for socket id and maybe burst len
>
right.

>> +    smap_add_format(args, "configured_rx_queues", "%u", netdev_->n_rxq);
>> +    smap_add_format(args, "configured_tx_queues", "%u", netdev_->n_rxq);
>> +    ovs_mutex_unlock(&dev->mutex);
>> +
>> +    return 0;
>> +}
>> +
>> +
>>>
>>> +
>>
>> +inline static void
>> +dpdk_queue_pkt(struct netdev_dpdk *dev, int qid,
>> +               struct rte_mbuf *pkt)
>> +{
>> +    struct dpdk_tx_queue *txq = &dev->tx_q[qid];
>> +    uint64_t diff_tsc;
>> +    uint64_t cur_tsc;
>> +    uint32_t nb_tx;
>> +
>> +    rte_spinlock_lock(&txq->tx_lock);
>> +    txq->burst_pkts[txq->count++] = pkt;
>
>
> I think burst_pkts should be converted to rte_ring in a follow
> up series to allow for lockless enqueue and dequeue. Taking
> a spinlock for every packet enqueue is painful.
>
I am planning on changing so that we do not need any locking. I will
send patches once this is in.

>
>> +    if (txq->count == MAX_TX_QUEUE_LEN) {
>> +        goto flush;
>> +    }
>> +    cur_tsc = rte_get_timer_cycles();
>> +    if (txq->count == 1) {
>> +        txq->tsc = cur_tsc;
>> +    }
>> +    diff_tsc = cur_tsc - txq->tsc;
>> +    if (diff_tsc >= DRAIN_TSC) {
>> +        goto flush;
>> +    }
>> +    rte_spinlock_unlock(&txq->tx_lock);
>> +    return;
>> +
>> +flush:
>> +    nb_tx = rte_eth_tx_burst(dev->port_id, qid, txq->burst_pkts,
>> txq->count);
>> +    if (nb_tx != txq->count) {
>> +        /* free buffers if we couldn't transmit packets */
>> +        rte_mempool_put_bulk(dev->dpdk_mp->mp,
>> +                             (void **) &txq->burst_pkts[nb_tx],
>> +                             (txq->count - nb_tx));
>> +    }
>> +    txq->count = 0;
>> +    rte_spinlock_unlock(&txq->tx_lock);
>> +}
>> +
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to