>>>> Added a new eventdev API rte_event_queue_attr_set(), to set event queue
>>>> attributes at runtime from the values set during initialization using
>>>> rte_event_queue_setup(). PMD's supporting this feature should expose the
>>>> capability RTE_EVENT_DEV_CAP_RUNTIME_QUEUE_ATTR.
>>>>
>>>> Signed-off-by: Shijith Thotton <sthot...@marvell.com>
>>>> Acked-by: Jerin Jacob <jer...@marvell.com>
>>>> ---
>>>>    doc/guides/eventdevs/features/default.ini |  1 +
>>>>    doc/guides/rel_notes/release_22_07.rst    |  5 ++++
>>>>    lib/eventdev/eventdev_pmd.h               | 22 +++++++++++++++
>>>>    lib/eventdev/rte_eventdev.c               | 26 ++++++++++++++++++
>>>>    lib/eventdev/rte_eventdev.h               | 33 ++++++++++++++++++++++-
>>>>    lib/eventdev/version.map                  |  3 +++
>>>>    6 files changed, 89 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/doc/guides/eventdevs/features/default.ini
>>> b/doc/guides/eventdevs/features/default.ini
>>>> index 2ea233463a..00360f60c6 100644
>>>> --- a/doc/guides/eventdevs/features/default.ini
>>>> +++ b/doc/guides/eventdevs/features/default.ini
>>>> @@ -17,6 +17,7 @@ runtime_port_link          =
>>>>    multiple_queue_port        =
>>>>    carry_flow_id              =
>>>>    maintenance_free           =
>>>> +runtime_queue_attr         =
>>>>
>>>>    ;
>>>>    ; Features of a default Ethernet Rx adapter.
>>>> diff --git a/doc/guides/rel_notes/release_22_07.rst
>>> b/doc/guides/rel_notes/release_22_07.rst
>>>> index 88d6e96cc1..a7a912d665 100644
>>>> --- a/doc/guides/rel_notes/release_22_07.rst
>>>> +++ b/doc/guides/rel_notes/release_22_07.rst
>>>> @@ -65,6 +65,11 @@ New Features
>>>>      * Added support for promiscuous mode on Windows.
>>>>      * Added support for MTU on Windows.
>>>>
>>>> +* **Added support for setting queue attributes at runtime in eventdev.**
>>>> +
>>>> +  Added new API ``rte_event_queue_attr_set()``, to set event queue
>>> attributes
>>>> +  at runtime.
>>>> +
>>>>
>>>>    Removed Items
>>>>    -------------
>>>> diff --git a/lib/eventdev/eventdev_pmd.h b/lib/eventdev/eventdev_pmd.h
>>>> index ce469d47a6..3b85d9f7a5 100644
>>>> --- a/lib/eventdev/eventdev_pmd.h
>>>> +++ b/lib/eventdev/eventdev_pmd.h
>>>> @@ -341,6 +341,26 @@ typedef int (*eventdev_queue_setup_t)(struct
>>> rte_eventdev *dev,
>>>>    typedef void (*eventdev_queue_release_t)(struct rte_eventdev *dev,
>>>>                    uint8_t queue_id);
>>>>
>>>> +/**
>>>> + * Set an event queue attribute at runtime.
>>>> + *
>>>> + * @param dev
>>>> + *   Event device pointer
>>>> + * @param queue_id
>>>> + *   Event queue index
>>>> + * @param attr_id
>>>> + *   Event queue attribute id
>>>> + * @param attr_value
>>>> + *   Event queue attribute value
>>>> + *
>>>> + * @return
>>>> + *  - 0: Success.
>>>> + *  - <0: Error code on failure.
>>>> + */
>>>> +typedef int (*eventdev_queue_attr_set_t)(struct rte_eventdev *dev,
>>>> +                                   uint8_t queue_id, uint32_t attr_id,
>>>> +                                   uint64_t attr_value);
>>>> +
>>>>    /**
>>>>     * Retrieve the default event port configuration.
>>>>     *
>>>> @@ -1211,6 +1231,8 @@ struct eventdev_ops {
>>>>            /**< Set up an event queue. */
>>>>            eventdev_queue_release_t queue_release;
>>>>            /**< Release an event queue. */
>>>> +  eventdev_queue_attr_set_t queue_attr_set;
>>>> +  /**< Set an event queue attribute. */
>>>>
>>>>            eventdev_port_default_conf_get_t port_def_conf;
>>>>            /**< Get default port configuration. */
>>>> diff --git a/lib/eventdev/rte_eventdev.c b/lib/eventdev/rte_eventdev.c
>>>> index 532a253553..a31e99be02 100644
>>>> --- a/lib/eventdev/rte_eventdev.c
>>>> +++ b/lib/eventdev/rte_eventdev.c
>>>> @@ -844,6 +844,32 @@ rte_event_queue_attr_get(uint8_t dev_id, uint8_t
>>> queue_id, uint32_t attr_id,
>>>>            return 0;
>>>>    }
>>>>
>>>> +int
>>>> +rte_event_queue_attr_set(uint8_t dev_id, uint8_t queue_id, uint32_t
>attr_id,
>>>> +                   uint64_t attr_value)
>>>> +{
>>>> +  struct rte_eventdev *dev;
>>>> +
>>>> +  RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
>>>> +  dev = &rte_eventdevs[dev_id];
>>>> +  if (!is_valid_queue(dev, queue_id)) {
>>>> +          RTE_EDEV_LOG_ERR("Invalid queue_id=%" PRIu8, queue_id);
>>>> +          return -EINVAL;
>>>> +  }
>>>> +
>>>> +  if (!(dev->data->event_dev_cap &
>>>> +        RTE_EVENT_DEV_CAP_RUNTIME_QUEUE_ATTR)) {
>>>> +          RTE_EDEV_LOG_ERR(
>>>> +                  "Device %" PRIu8 "does not support changing queue
>>> attributes at runtime",
>>>> +                  dev_id);
>>>> +          return -ENOTSUP;
>>>> +  }
>>>> +
>>>> +  RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->queue_attr_set, -
>>> ENOTSUP);
>>>> +  return (*dev->dev_ops->queue_attr_set)(dev, queue_id, attr_id,
>>>> +                                         attr_value);
>>>> +}
>>>> +
>>>>    int
>>>>    rte_event_port_link(uint8_t dev_id, uint8_t port_id,
>>>>                        const uint8_t queues[], const uint8_t priorities[],
>>>> diff --git a/lib/eventdev/rte_eventdev.h b/lib/eventdev/rte_eventdev.h
>>>> index 42a5660169..c1163ee8ec 100644
>>>> --- a/lib/eventdev/rte_eventdev.h
>>>> +++ b/lib/eventdev/rte_eventdev.h
>>>> @@ -225,7 +225,7 @@ struct rte_event;
>>>>    /**< Event scheduling prioritization is based on the priority 
>>>> associated with
>>>>     *  each event queue.
>>>>     *
>>>> - *  @see rte_event_queue_setup()
>>>> + *  @see rte_event_queue_setup(), rte_event_queue_attr_set()
>>>>     */
>>>>    #define RTE_EVENT_DEV_CAP_EVENT_QOS           (1ULL << 1)
>>>>    /**< Event scheduling prioritization is based on the priority 
>>>> associated with
>>>> @@ -307,6 +307,13 @@ struct rte_event;
>>>>     * global pool, or process signaling related to load balancing.
>>>>     */
>>>>
>>>> +#define RTE_EVENT_DEV_CAP_RUNTIME_QUEUE_ATTR (1ULL << 11)
>>>> +/**< Event device is capable of changing the queue attributes at runtime 
>>>> i.e
>>>> + * after rte_event_queue_setup() or rte_event_start() call sequence. If 
>>>> this
>>>> + * flag is not set, eventdev queue attributes can only be configured 
>>>> during
>>>> + * rte_event_queue_setup().
>>>> + */
>>>> +
>>>>    /* Event device priority levels */
>>>>    #define RTE_EVENT_DEV_PRIORITY_HIGHEST   0
>>>>    /**< Highest priority expressed across eventdev subsystem
>>>> @@ -702,6 +709,30 @@ int
>>>>    rte_event_queue_attr_get(uint8_t dev_id, uint8_t queue_id, uint32_t
>attr_id,
>>>>                            uint32_t *attr_value);
>>>>
>>>> +/**
>>>> + * Set an event queue attribute.
>>>> + *
>>>> + * @param dev_id
>>>> + *   Eventdev id
>>>> + * @param queue_id
>>>> + *   Eventdev queue id
>>>> + * @param attr_id
>>>> + *   The attribute ID to set
>>>> + * @param attr_value
>>>> + *   The attribute value to set
>>>> + *
>>>> + * @return
>>>> + *   - 0: Successfully set attribute.
>>>> + *   - -EINVAL: invalid device, queue or attr_id.
>
>Can "invalid" here be something else than "non-existent"?
>

No. 

>>>> + *   - -ENOTSUP: device does not support setting event attribute.
>>>> + *   - -EBUSY: device is in running state
>>>
>>> I thought the point of this new interface was to allow setting queue
>>> attributes when the event device was running?
>>>
>>> It would be useful for the caller to be able to distinguish between
>>> "busy, but please try again later", and "busy, forever". Maybe the
>>> latter is what's meant here? In that case, what is the difference with
>>> EBUSY and ENOTSUP?
>>>
>>
>> As there are multiple queue attributes, not all attributes could be 
>> supported by
>> all PMDs. ENOTSUP can be returned for unsupported attributes.
>>
>
>So ENOTSUP means this particular attribute exists, but can't be change
>in runtime?

Yes. If the attribute doesn’t exist, EINVAL is returned.

> Is ENOTSUP returned also if no attributes can be modified
>(i.e., the event device does not have the appropriate capability)?
>

Yes. Application should also be checking the eventdev capability
RTE_EVENT_DEV_CAP_RUNTIME_QUEUE_ATTR before calling this API.

>How is the application supposed to behaved in case -EBUSY is returned?
>What does -EBUSY mean? The event device being in a running state doesn't
>sound like an error to me.
>
 
EBUSY was added to indicate the device was busy and was unable to set the
attribute at that time. I think, it can be removed as it is causing confusion.
Please let me know if it make sense, I will send v4.

>
>>>> + *   - <0: failed to set event queue attribute
>>>> + */
>>>> +__rte_experimental
>>>> +int
>>>> +rte_event_queue_attr_set(uint8_t dev_id, uint8_t queue_id, uint32_t
>attr_id,
>>>> +                   uint64_t attr_value);
>>>> +
>>>>    /* Event port specific APIs */
>>>>
>>>>    /* Event port configuration bitmap flags */
>>>> diff --git a/lib/eventdev/version.map b/lib/eventdev/version.map
>>>> index cd5dada07f..c581b75c18 100644
>>>> --- a/lib/eventdev/version.map
>>>> +++ b/lib/eventdev/version.map
>>>> @@ -108,6 +108,9 @@ EXPERIMENTAL {
>>>>
>>>>            # added in 22.03
>>>>            rte_event_eth_rx_adapter_event_port_get;
>>>> +
>>>> +  # added in 22.07
>>>> +  rte_event_queue_attr_set;
>>>>    };
>>>>
>>>>    INTERNAL {
>>

Reply via email to