DPDK patches and discussions
 help / color / mirror / Atom feed
From: Mattias Rönnblom <mattias.ronnblom@ericsson.com>
To: Harry van Haaren <harry.van.haaren@intel.com>,
	"dev@dpdk.org" <dev@dpdk.org>
Cc: "david.marchand@dpdk.org" <david.marchand@dpdk.org>
Subject: Re: [dpdk-dev] [PATCH v2 1/2] service: add component useful work attribute
Date: Wed, 23 Sep 2020 11:39:51 +0000
Message-ID: <3213ba3a-e0b0-9a05-1cdb-4da5abc001b4@ericsson.com> (raw)
In-Reply-To: <20200914143732.87907-1-harry.van.haaren@intel.com>

On 2020-09-14 16:37, Harry van Haaren wrote:
> This commit adds a new attribute which allows the service to indicate
> if the previous iteration of work was "useful". Useful work here implies
> forward progress was made.

> Exposing this information via an attribute to the application allows
> tracking of CPU cycles as being useful or not-useful, and a CPU load
> estimate can be deduced from that information.


How would that tracking be implemented? rte_service.c already keeps 
track of the amount of busy cycles per service. Would it be possible to 
reuse that mechanism to achieve the same goal?


We did some prototyping on dynamic load balancing for the service core 
framework, and then we extended the API is such a way that the service 
callback would return a bool indicating if forward progress was made, if 
I recall correctly. Sampling these counters allowed for tracking load on 
both a per-lcore and per-service basis.


> Signed-off-by: Harry van Haaren <harry.van.haaren@intel.com>
>
> ---
>
> v2:
> - Add experimental tag to new function.
>
> ---
>   lib/librte_eal/common/rte_service.c           | 19 +++++++++++++++++++
>   lib/librte_eal/include/rte_service.h          |  5 +++++
>   .../include/rte_service_component.h           | 13 +++++++++++++
>   lib/librte_eal/rte_eal_version.map            |  3 +++
>   4 files changed, 40 insertions(+)
>
> diff --git a/lib/librte_eal/common/rte_service.c b/lib/librte_eal/common/rte_service.c
> index 6a0e0ff65d..f9792a138b 100644
> --- a/lib/librte_eal/common/rte_service.c
> +++ b/lib/librte_eal/common/rte_service.c
> @@ -58,6 +58,7 @@ struct rte_service_spec_impl {
>   	uint32_t num_mapped_cores;
>   	uint64_t calls;
>   	uint64_t cycles_spent;
> +	uint8_t useful_work_last_iter;
>   } __rte_cache_aligned;
>   
>   /* the internal values of a service core */
> @@ -293,6 +294,21 @@ rte_service_component_unregister(uint32_t id)
>   	return 0;
>   }
>   
> +int32_t
> +rte_service_component_attr_set(uint32_t id, uint32_t attr, uint64_t value)
> +{
> +	struct rte_service_spec_impl *s;
> +	SERVICE_VALID_GET_OR_ERR_RET(id, s, -EINVAL);
> +
> +	switch (attr) {
> +	case RTE_SERVICE_ATTR_USEFUL_WORK_LAST_ITER:
> +		s->useful_work_last_iter = value;
> +		return 0;
> +	default:
> +		return -EINVAL;
> +	};
> +}
> +
>   int32_t
>   rte_service_component_runstate_set(uint32_t id, uint32_t runstate)
>   {
> @@ -778,6 +794,9 @@ rte_service_attr_get(uint32_t id, uint32_t attr_id, uint64_t *attr_value)
>   		return -EINVAL;
>   
>   	switch (attr_id) {
> +	case RTE_SERVICE_ATTR_USEFUL_WORK_LAST_ITER:
> +		*attr_value = s->useful_work_last_iter;
> +		return 0;
>   	case RTE_SERVICE_ATTR_CYCLES:
>   		*attr_value = s->cycles_spent;
>   		return 0;
> diff --git a/lib/librte_eal/include/rte_service.h b/lib/librte_eal/include/rte_service.h
> index e2d0a6dd32..e9836a1a68 100644
> --- a/lib/librte_eal/include/rte_service.h
> +++ b/lib/librte_eal/include/rte_service.h
> @@ -370,6 +370,11 @@ int32_t rte_service_dump(FILE *f, uint32_t id);
>    */
>   #define RTE_SERVICE_ATTR_CALL_COUNT 1
>   
> +/**
> + * Returns if the last iteration of the service resulted in useful work done.
> + */
> +#define RTE_SERVICE_ATTR_USEFUL_WORK_LAST_ITER 2
> +
>   /**
>    * Get an attribute from a service.
>    *
> diff --git a/lib/librte_eal/include/rte_service_component.h b/lib/librte_eal/include/rte_service_component.h
> index 9e66ee7e29..534f41f531 100644
> --- a/lib/librte_eal/include/rte_service_component.h
> +++ b/lib/librte_eal/include/rte_service_component.h
> @@ -87,6 +87,19 @@ int32_t rte_service_component_register(const struct rte_service_spec *spec,
>    */
>   int32_t rte_service_component_unregister(uint32_t id);
>   
> +/**
> + * Set an attribute for this service.
> + *
> + * Note this API is to be called by the service implementation, to make the
> + * statistic available via the usual attr_get() service APIs.
> + *
> + * @retval 0 Success
> + * @retval -EINVAL Invalid service id or attribute provided
> + */
> +__rte_experimental
> +int32_t rte_service_component_attr_set(uint32_t id, uint32_t attr,
> +		uint64_t value);
> +
>   /**
>    * Private function to allow EAL to initialized default mappings.
>    *
> diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map
> index 0b18e2ef85..bb5e19ae9e 100644
> --- a/lib/librte_eal/rte_eal_version.map
> +++ b/lib/librte_eal/rte_eal_version.map
> @@ -397,6 +397,9 @@ EXPERIMENTAL {
>   	rte_mp_disable;
>   	rte_thread_register;
>   	rte_thread_unregister;
> +
> +	# added in 20.11
> +	rte_service_component_attr_set;
>   };
>   
>   INTERNAL {



  parent reply	other threads:[~2020-09-23 11:39 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-07 16:21 [dpdk-dev] [PATCH " Harry van Haaren
2020-09-07 16:21 ` [dpdk-dev] [PATCH 2/2] event/sw: add useful work done attribute Harry van Haaren
2020-09-14  8:37 ` [dpdk-dev] [PATCH 1/2] service: add component useful work attribute David Marchand
2020-09-14 14:37   ` Van Haaren, Harry
2020-09-14 14:37 ` [dpdk-dev] [PATCH v2 " Harry van Haaren
2020-09-14 14:37   ` [dpdk-dev] [PATCH v2 2/2] event/sw: add useful work done attribute Harry van Haaren
2020-09-21 14:49   ` [dpdk-dev] [PATCH v2 1/2] service: add component useful work attribute David Marchand
2020-09-21 15:17     ` Van Haaren, Harry
2020-09-21 23:47     ` Honnappa Nagarahalli
2020-09-23 11:39   ` Mattias Rönnblom [this message]
2020-09-23 14:16     ` Van Haaren, Harry
2020-10-05 16:45       ` Van Haaren, Harry
2020-10-16 12:20         ` David Marchand
2020-10-16 12:57           ` Van Haaren, Harry
2021-01-13 14:42             ` David Marchand
2021-01-14 12:15               ` Van Haaren, Harry

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=3213ba3a-e0b0-9a05-1cdb-4da5abc001b4@ericsson.com \
    --to=mattias.ronnblom@ericsson.com \
    --cc=david.marchand@dpdk.org \
    --cc=dev@dpdk.org \
    --cc=harry.van.haaren@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

DPDK patches and discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://inbox.dpdk.org/dev/0 dev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 dev dev/ http://inbox.dpdk.org/dev \
		dev@dpdk.org
	public-inbox-index dev

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://inbox.dpdk.org/inbox.dpdk.dev


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git