DPDK patches and discussions
 help / color / mirror / Atom feed
From: Ferruh Yigit <ferruh.yigit@intel.com>
To: "Wiles, Keith" <keith.wiles@intel.com>
Cc: "dev@dpdk.org" <dev@dpdk.org>
Subject: Re: [dpdk-dev] [PATCH] net/tap: driver closing tx interface on queue setup
Date: Mon, 30 Jan 2017 19:31:27 +0000	[thread overview]
Message-ID: <b76f7316-4ae2-ac7b-8684-5b4222e847ca@intel.com> (raw)
In-Reply-To: <62618BAE-2D3C-41AC-979B-85C67BEF5144@intel.com>

On 1/30/2017 6:20 PM, Wiles, Keith wrote:
> 
>> On Jan 30, 2017, at 11:42 AM, Yigit, Ferruh <ferruh.yigit@intel.com> wrote:
>>
>> On 1/30/2017 2:34 PM, Wiles, Keith wrote:
>>>
>>>> On Jan 30, 2017, at 5:00 AM, Yigit, Ferruh <ferruh.yigit@intel.com> wrote:
>>>>
>>>> On 1/29/2017 2:12 AM, Keith Wiles wrote:
>>>>> The tap driver setup both rx and tx file descriptors when the
>>>>> rte_eth_rx_queue_setup() causing the tx to be closed when tx setup
>>>>> was called.
>>>>
>>>> Can you please describe the problem more.
>>>> Without this patch rx->fd == tx->fd, with this patch rx and tx has
>>>> different file descriptors.
>>>
>>> Let me look at this more, I am getting the same FD for both. Must be something else going on.
>>
>> After patch, tun_alloc() called twice, one for Rx_q and other for Tx_q.
>> And tun_alloc does open() to "/dev/net/tun", I expect they get different
>> file descriptors.
> 
> It is not called twice, it is only called once in the eth_dev_tap_create() routine and the fd is placed in the rxq/txq using the same fd. Then look in the rx/tx_setup_queue routines only update the fd and call tun_alloc if the fd is -1. Now looking at this code it seems a bit silly, but it was trying to deal with the setting up the new queue. It seems to be this logic not going to work with multiple queues in the same device and needs to be reworked.

I see, right, it is not called twice for first queue of device.

But will be called twice for multiple queues.

Also if application does multiple rx/tx_queue_setup() calls, again,
tun_alloc() will be called twice.

This means two tap interface will be created, one for rx and one for tx,
which is wrong I guess.

The tun_alloc() logic is correct in current code, just setting both
rx_queues and tx_queues in rx_queue_setup() breaks logic, so I propose
to update just that part.

What do you think about following update [1], it will fix current code,
also will keep correct tun_alloc() call logic. But this will be still
broken for application does multiple rx/tx_queue_setup() calls case.


[1]
--- a/drivers/net/tap/rte_eth_tap.c
+++ b/drivers/net/tap/rte_eth_tap.c
@@ -428,8 +428,6 @@ tap_setup_queue(struct rte_eth_dev *dev,
                        }
                }
        }
-       dev->data->rx_queues[qid] = rx;
-       dev->data->tx_queues[qid] = tx;

        rx->fd = fd;
        tx->fd = fd;
@@ -438,6 +436,26 @@ tap_setup_queue(struct rte_eth_dev *dev,
 }

 static int
+rx_setup_queue(struct rte_eth_dev *dev,
+               struct pmd_internals *internals,
+               uint16_t qid)
+{
+       dev->data->rx_queues[qid] = &internals->rxq[qid];
+
+       return tap_setup_queue(dev, internals, qid);
+}
+
+static int
+tx_setup_queue(struct rte_eth_dev *dev,
+               struct pmd_internals *internals,
+               uint16_t qid)
+{
+       dev->data->tx_queues[qid] = &internals->txq[qid];
+
+       return tap_setup_queue(dev, internals, qid);
+}
+
+static int
 tap_rx_queue_setup(struct rte_eth_dev *dev,
                   uint16_t rx_queue_id,
                   uint16_t nb_rx_desc __rte_unused,
@@ -469,7 +487,7 @@ tap_rx_queue_setup(struct rte_eth_dev *dev,
                return -ENOMEM;
        }

-       fd = tap_setup_queue(dev, internals, rx_queue_id);
+       fd = rx_setup_queue(dev, internals, rx_queue_id);
        if (fd == -1)
                return -1;

@@ -493,7 +511,7 @@ tap_tx_queue_setup(struct rte_eth_dev *dev,
        if (tx_queue_id >= internals->nb_queues)
                return -1;

-       ret = tap_setup_queue(dev, internals, tx_queue_id);
+       ret = tx_setup_queue(dev, internals, tx_queue_id);
        if (ret == -1)
                return -1;




> 
> I need to rework the code and do some cleanup. The current patch should work for a single queue per device.
> 
> Thanks
> 
>>
>> And if they have same FD, won't this cause same problem,
>> rx_queue_setup() will close the FD, if Tx_q has same FD it will have
>> invalid descriptor.
>>
>>>
>>>>
>>>> What was the wrong with rx and tx having same fd?
>>>>
>>>> As far as I can see, rte_eth_rx_queue_setup() won't close tx->fd, that
>>>> function will do nothing if rx or tx has valid fd.
>>>
>>> The rte_eth_rx_queue_setup() look at line 1146 if rxq has a value then release it, which happens on both Rx/Tx code
>>>
>>> 	rxq = dev->data->rx_queues;
>>> 	if (rxq[rx_queue_id]) {
>>> 		RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_queue_release,
>>> 					-ENOTSUP);
>>> 		(*dev->dev_ops->rx_queue_release)(rxq[rx_queue_id]);
>>> 		rxq[rx_queue_id] = NULL;
>>> 	}
>>
>> Got it thanks, I missed (relatively new) above code piece.
>>
>>>
>>> 	if (rx_conf == NULL)
>>> 		rx_conf = &dev_info.default_rxconf;
>>>
>>> 	ret = (*dev->dev_ops->rx_queue_setup)(dev, rx_queue_id, nb_rx_desc,
>>> 					      socket_id, rx_conf, mp);
>>>
>>>>
>>>>>
>>>>> Signed-off-by: Keith Wiles <keith.wiles@intel.com>
>>>>
>>>> <...>
>>>
>>> Regards,
>>> Keith
> 
> Regards,
> Keith
> 

  reply	other threads:[~2017-01-30 19:31 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-01-29  2:12 Keith Wiles
2017-01-30 11:00 ` Ferruh Yigit
2017-01-30 14:34   ` Wiles, Keith
2017-01-30 17:42     ` Ferruh Yigit
2017-01-30 18:20       ` Wiles, Keith
2017-01-30 19:31         ` Ferruh Yigit [this message]
2017-01-30 14:38   ` Pascal Mazon
2017-01-30 15:04     ` Wiles, Keith
2017-01-30 17:19     ` Ferruh Yigit
2017-01-30 20:54 ` [dpdk-dev] [PATCH v2] net/tap: fix invalid queue file descriptor Ferruh Yigit
2017-01-30 20:57   ` Wiles, Keith
2017-01-30 21:23     ` Ferruh Yigit

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=b76f7316-4ae2-ac7b-8684-5b4222e847ca@intel.com \
    --to=ferruh.yigit@intel.com \
    --cc=dev@dpdk.org \
    --cc=keith.wiles@intel.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).