[dpdk-dev,1/3] fm10k: add multi-queue checking
Commit Message
Add multi-queue checking in device configure process.
Currently, VMDQ and RSS are supported.
Signed-off-by: Shaopeng He <shaopeng.he@intel.com>
---
drivers/net/fm10k/fm10k_ethdev.c | 44 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 44 insertions(+)
Comments
On 2015/9/30 15:29, Shaopeng He wrote:
> Add multi-queue checking in device configure process.
> Currently, VMDQ and RSS are supported.
>
> Signed-off-by: Shaopeng He <shaopeng.he@intel.com>
> ---
> drivers/net/fm10k/fm10k_ethdev.c | 44 ++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 44 insertions(+)
>
> diff --git a/drivers/net/fm10k/fm10k_ethdev.c b/drivers/net/fm10k/fm10k_ethdev.c
> index a69c990..082937d 100644
> --- a/drivers/net/fm10k/fm10k_ethdev.c
> +++ b/drivers/net/fm10k/fm10k_ethdev.c
> @@ -283,12 +283,56 @@ tx_queue_disable(struct fm10k_hw *hw, uint16_t qnum)
> }
>
> static int
> +fm10k_check_mq_mode(struct rte_eth_dev *dev)
> +{
> + enum rte_eth_rx_mq_mode rx_mq_mode = dev->data->dev_conf.rxmode.mq_mode;
> + struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
> + struct rte_eth_vmdq_rx_conf *vmdq_conf;
> + uint16_t nb_rx_q = dev->data->nb_rx_queues;
> +
> + vmdq_conf = &dev->data->dev_conf.rx_adv_conf.vmdq_rx_conf;
> +
> + if (rx_mq_mode & ETH_MQ_RX_DCB_FLAG) {
> + PMD_INIT_LOG(ERR, "DCB mode is not supported.");
> + return -EINVAL;
> + }
> +
> + if (!(rx_mq_mode & ETH_MQ_RX_VMDQ_FLAG))
> + return 0;
> +
> + if (hw->mac.type == fm10k_mac_vf) {
> + PMD_INIT_LOG(ERR, "VMDQ mode is not supported in VF.");
> + return -EINVAL;
> + }
I think vf check should be the first one, then we do not need check dcb
and VMDq flag.
Thanks,
Michael
> +
> + /* Check VMDQ queue pool number */
> + if (vmdq_conf->nb_queue_pools >
> + sizeof(vmdq_conf->pool_map[0].pools) * CHAR_BIT ||
> + vmdq_conf->nb_queue_pools > nb_rx_q) {
> + PMD_INIT_LOG(ERR, "Too many of queue pools: %d",
> + vmdq_conf->nb_queue_pools);
> + return -EINVAL;
> + }
> +
> + return 0;
> +}
> +
> +static int
> fm10k_dev_configure(struct rte_eth_dev *dev)
> {
> + int ret;
> +
> PMD_INIT_FUNC_TRACE();
>
> if (dev->data->dev_conf.rxmode.hw_strip_crc == 0)
> PMD_INIT_LOG(WARNING, "fm10k always strip CRC");
> + /* multipe queue mode checking */
> + ret = fm10k_check_mq_mode(dev);
> + if (ret != 0) {
> + PMD_DRV_LOG(ERR, "fm10k_check_mq_mode fails with %d.",
> + ret);
> + return ret;
> + }
>
> return 0;
> }
Hi, Michael
> -----Original Message-----
> From: Qiu, Michael
> Sent: Thursday, October 15, 2015 2:28 PM
> To: He, Shaopeng; dev@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH 1/3] fm10k: add multi-queue checking
>
> On 2015/9/30 15:29, Shaopeng He wrote:
> > Add multi-queue checking in device configure process.
> > Currently, VMDQ and RSS are supported.
> >
> > Signed-off-by: Shaopeng He <shaopeng.he@intel.com>
> > ---
> > drivers/net/fm10k/fm10k_ethdev.c | 44
> > ++++++++++++++++++++++++++++++++++++++++
> > 1 file changed, 44 insertions(+)
> >
> > diff --git a/drivers/net/fm10k/fm10k_ethdev.c
> > b/drivers/net/fm10k/fm10k_ethdev.c
> > index a69c990..082937d 100644
> > --- a/drivers/net/fm10k/fm10k_ethdev.c
> > +++ b/drivers/net/fm10k/fm10k_ethdev.c
> > @@ -283,12 +283,56 @@ tx_queue_disable(struct fm10k_hw *hw,
> uint16_t
> > qnum) }
> >
> > static int
> > +fm10k_check_mq_mode(struct rte_eth_dev *dev) {
> > + enum rte_eth_rx_mq_mode rx_mq_mode = dev->data-
> >dev_conf.rxmode.mq_mode;
> > + struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data-
> >dev_private);
> > + struct rte_eth_vmdq_rx_conf *vmdq_conf;
> > + uint16_t nb_rx_q = dev->data->nb_rx_queues;
> > +
> > + vmdq_conf = &dev->data->dev_conf.rx_adv_conf.vmdq_rx_conf;
> > +
> > + if (rx_mq_mode & ETH_MQ_RX_DCB_FLAG) {
> > + PMD_INIT_LOG(ERR, "DCB mode is not supported.");
> > + return -EINVAL;
> > + }
> > +
> > + if (!(rx_mq_mode & ETH_MQ_RX_VMDQ_FLAG))
> > + return 0;
> > +
> > + if (hw->mac.type == fm10k_mac_vf) {
> > + PMD_INIT_LOG(ERR, "VMDQ mode is not supported in VF.");
> > + return -EINVAL;
> > + }
>
> I think vf check should be the first one, then we do not need check dcb and
> VMDq flag.
>
> Thanks,
> Michael
Thanks for the comments. There is a case of RSS support on VF, if vf check be
the first one, it will return fail, which is not correct.
Thanks,
--Shaopeng
> > +
> > + /* Check VMDQ queue pool number */
> > + if (vmdq_conf->nb_queue_pools >
> > + sizeof(vmdq_conf->pool_map[0].pools) * CHAR_BIT
> ||
> > + vmdq_conf->nb_queue_pools > nb_rx_q) {
> > + PMD_INIT_LOG(ERR, "Too many of queue pools: %d",
> > + vmdq_conf->nb_queue_pools);
> > + return -EINVAL;
> > + }
> > +
> > + return 0;
> > +}
> > +
> > +static int
> > fm10k_dev_configure(struct rte_eth_dev *dev) {
> > + int ret;
> > +
> > PMD_INIT_FUNC_TRACE();
> >
> > if (dev->data->dev_conf.rxmode.hw_strip_crc == 0)
> > PMD_INIT_LOG(WARNING, "fm10k always strip CRC");
> > + /* multipe queue mode checking */
> > + ret = fm10k_check_mq_mode(dev);
> > + if (ret != 0) {
> > + PMD_DRV_LOG(ERR, "fm10k_check_mq_mode fails
> with %d.",
> > + ret);
> > + return ret;
> > + }
> >
> > return 0;
> > }
On 2015/10/15 19:07, He, Shaopeng wrote:
> Hi, Michael
>
>> -----Original Message-----
>> From: Qiu, Michael
>> Sent: Thursday, October 15, 2015 2:28 PM
>> To: He, Shaopeng; dev@dpdk.org
>> Subject: Re: [dpdk-dev] [PATCH 1/3] fm10k: add multi-queue checking
>>
>> On 2015/9/30 15:29, Shaopeng He wrote:
>>> Add multi-queue checking in device configure process.
>>> Currently, VMDQ and RSS are supported.
>>>
>>> Signed-off-by: Shaopeng He <shaopeng.he@intel.com>
>>> ---
>>> drivers/net/fm10k/fm10k_ethdev.c | 44
>>> ++++++++++++++++++++++++++++++++++++++++
>>> 1 file changed, 44 insertions(+)
>>>
>>> diff --git a/drivers/net/fm10k/fm10k_ethdev.c
>>> b/drivers/net/fm10k/fm10k_ethdev.c
>>> index a69c990..082937d 100644
>>> --- a/drivers/net/fm10k/fm10k_ethdev.c
>>> +++ b/drivers/net/fm10k/fm10k_ethdev.c
>>> @@ -283,12 +283,56 @@ tx_queue_disable(struct fm10k_hw *hw,
>> uint16_t
>>> qnum) }
>>>
>>> static int
>>> +fm10k_check_mq_mode(struct rte_eth_dev *dev) {
>>> + enum rte_eth_rx_mq_mode rx_mq_mode = dev->data-
>>> dev_conf.rxmode.mq_mode;
>>> + struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data-
>>> dev_private);
>>> + struct rte_eth_vmdq_rx_conf *vmdq_conf;
>>> + uint16_t nb_rx_q = dev->data->nb_rx_queues;
>>> +
>>> + vmdq_conf = &dev->data->dev_conf.rx_adv_conf.vmdq_rx_conf;
>>> +
>>> + if (rx_mq_mode & ETH_MQ_RX_DCB_FLAG) {
>>> + PMD_INIT_LOG(ERR, "DCB mode is not supported.");
>>> + return -EINVAL;
>>> + }
>>> +
>>> + if (!(rx_mq_mode & ETH_MQ_RX_VMDQ_FLAG))
>>> + return 0;
>>> +
>>> + if (hw->mac.type == fm10k_mac_vf) {
>>> + PMD_INIT_LOG(ERR, "VMDQ mode is not supported in VF.");
>>> + return -EINVAL;
>>> + }
>> I think vf check should be the first one, then we do not need check dcb and
>> VMDq flag.
>>
>> Thanks,
>> Michael
> Thanks for the comments. There is a case of RSS support on VF, if vf check be
> the first one, it will return fail, which is not correct.
OK, you are right.
Thanks,
Michael
> Thanks,
> --Shaopeng
>>> +
>>> + /* Check VMDQ queue pool number */
>>> + if (vmdq_conf->nb_queue_pools >
>>> + sizeof(vmdq_conf->pool_map[0].pools) * CHAR_BIT
>> ||
>>> + vmdq_conf->nb_queue_pools > nb_rx_q) {
>>> + PMD_INIT_LOG(ERR, "Too many of queue pools: %d",
>>> + vmdq_conf->nb_queue_pools);
>>> + return -EINVAL;
>>> + }
>>> +
>>> + return 0;
>>> +}
>>> +
>>> +static int
>>> fm10k_dev_configure(struct rte_eth_dev *dev) {
>>> + int ret;
>>> +
>>> PMD_INIT_FUNC_TRACE();
>>>
>>> if (dev->data->dev_conf.rxmode.hw_strip_crc == 0)
>>> PMD_INIT_LOG(WARNING, "fm10k always strip CRC");
>>> + /* multipe queue mode checking */
>>> + ret = fm10k_check_mq_mode(dev);
>>> + if (ret != 0) {
>>> + PMD_DRV_LOG(ERR, "fm10k_check_mq_mode fails
>> with %d.",
>>> + ret);
>>> + return ret;
>>> + }
>>>
>>> return 0;
>>> }
>
@@ -283,12 +283,56 @@ tx_queue_disable(struct fm10k_hw *hw, uint16_t qnum)
}
static int
+fm10k_check_mq_mode(struct rte_eth_dev *dev)
+{
+ enum rte_eth_rx_mq_mode rx_mq_mode = dev->data->dev_conf.rxmode.mq_mode;
+ struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+ struct rte_eth_vmdq_rx_conf *vmdq_conf;
+ uint16_t nb_rx_q = dev->data->nb_rx_queues;
+
+ vmdq_conf = &dev->data->dev_conf.rx_adv_conf.vmdq_rx_conf;
+
+ if (rx_mq_mode & ETH_MQ_RX_DCB_FLAG) {
+ PMD_INIT_LOG(ERR, "DCB mode is not supported.");
+ return -EINVAL;
+ }
+
+ if (!(rx_mq_mode & ETH_MQ_RX_VMDQ_FLAG))
+ return 0;
+
+ if (hw->mac.type == fm10k_mac_vf) {
+ PMD_INIT_LOG(ERR, "VMDQ mode is not supported in VF.");
+ return -EINVAL;
+ }
+
+ /* Check VMDQ queue pool number */
+ if (vmdq_conf->nb_queue_pools >
+ sizeof(vmdq_conf->pool_map[0].pools) * CHAR_BIT ||
+ vmdq_conf->nb_queue_pools > nb_rx_q) {
+ PMD_INIT_LOG(ERR, "Too many of queue pools: %d",
+ vmdq_conf->nb_queue_pools);
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int
fm10k_dev_configure(struct rte_eth_dev *dev)
{
+ int ret;
+
PMD_INIT_FUNC_TRACE();
if (dev->data->dev_conf.rxmode.hw_strip_crc == 0)
PMD_INIT_LOG(WARNING, "fm10k always strip CRC");
+ /* multipe queue mode checking */
+ ret = fm10k_check_mq_mode(dev);
+ if (ret != 0) {
+ PMD_DRV_LOG(ERR, "fm10k_check_mq_mode fails with %d.",
+ ret);
+ return ret;
+ }
return 0;
}