All of lore.kernel.org
 help / color / mirror / Atom feed
From: Philippe Gerum <rpm@xenomai.org>
To: hongzha1 <hongzhan.chen@intel.com>
Cc: xenomai@xenomai.org
Subject: Re: [PATCH 1/2] cobalt/rtdm: introduce new interfaces to init task
Date: Thu, 11 Mar 2021 09:32:32 +0100	[thread overview]
Message-ID: <87sg52gkf3.fsf@xenomai.org> (raw)
In-Reply-To: <20210311064859.10971-1-hongzhan.chen@intel.com>


hongzha1 via Xenomai <xenomai@xenomai.org> writes:

> Initialise and start a real-time task on specified cpu.
>
> Introduce rtdm_task_init_with_affinity as base called by other init
> task services to avoid code duplication.
>
> Signed-off-by: hongzha1 <hongzhan.chen@intel.com>
>
> diff --git a/include/cobalt/kernel/rtdm/driver.h b/include/cobalt/kernel/rtdm/driver.h
> index 733c49df8..5406e54a5 100644
> --- a/include/cobalt/kernel/rtdm/driver.h
> +++ b/include/cobalt/kernel/rtdm/driver.h
> @@ -1024,6 +1024,11 @@ typedef void (*rtdm_task_proc_t)(void *arg);
>  int rtdm_task_init(rtdm_task_t *task, const char *name,
>  		   rtdm_task_proc_t task_proc, void *arg,
>  		   int priority, nanosecs_rel_t period);
> +
> +int rtdm_task_init_on_cpu(rtdm_task_t *task, int cpu, const char *name,
> +		rtdm_task_proc_t task_proc, void *arg,
> +		int priority, nanosecs_rel_t period);
> +
>  int __rtdm_task_sleep(xnticks_t timeout, xntmode_t mode);
>  void rtdm_task_busy_sleep(nanosecs_rel_t delay);
>  
> diff --git a/kernel/cobalt/rtdm/drvlib.c b/kernel/cobalt/rtdm/drvlib.c
> index b914fa312..069a442e5 100644
> --- a/kernel/cobalt/rtdm/drvlib.c
> +++ b/kernel/cobalt/rtdm/drvlib.c
> @@ -86,13 +86,14 @@ nanosecs_abs_t rtdm_clock_read_monotonic(void);
>   */
>  
>  /**
> - * @brief Initialise and start a real-time task
> + * @brief Initialise and start a real-time task with cpu affinity
>   *
>   * After initialising a task, the task handle remains valid and can be
>   * passed to RTDM services until either rtdm_task_destroy() or
>   * rtdm_task_join() was invoked.
>   *
>   * @param[in,out] task Task handle
> + * @param[in] cpu affinity that task want to run with
>   * @param[in] name Optional task name
>   * @param[in] task_proc Procedure to be executed by the task
>   * @param[in] arg Custom argument passed to @c task_proc() on entry
> @@ -106,9 +107,10 @@ nanosecs_abs_t rtdm_clock_read_monotonic(void);
>   *
>   * @coretags{secondary-only, might-switch}
>   */
> -int rtdm_task_init(rtdm_task_t *task, const char *name,
> -		   rtdm_task_proc_t task_proc, void *arg,
> -		   int priority, nanosecs_rel_t period)
> +static inline int rtdm_task_init_with_affinity(rtdm_task_t *task,
> +		cpumask_t affinity, const char *name,
> +		rtdm_task_proc_t task_proc, void *arg,
> +		int priority, nanosecs_rel_t period)


In general, I would refrain from passing CPU masks by value; these may
represent pretty large data on x86 platforms, although the optimizer
might find its way using a reference internally in this specific
case. Receiving struct cpumask * would be better nevertheless.
xnintr_affinity() is another candidate for such a change.

>  {
>  	union xnsched_policy_param param;
>  	struct xnthread_start_attr sattr;
> @@ -121,7 +123,7 @@ int rtdm_task_init(rtdm_task_t *task, const char *name,
>  	iattr.name = name;
>  	iattr.flags = 0;
>  	iattr.personality = &xenomai_personality;
> -	iattr.affinity = CPU_MASK_ALL;
> +	iattr.affinity = affinity;
>  	param.rt.prio = priority;
>  
>  	err = xnthread_init(task, &iattr, &xnsched_class_rt, &param);
> @@ -155,8 +157,71 @@ int rtdm_task_init(rtdm_task_t *task, const char *name,
>  	return err;
>  }
>  
> +/**
> + * @brief Initialise and start a real-time task
> + *
> + * After initialising a task, the task handle remains valid and can be
> + * passed to RTDM services until either rtdm_task_destroy() or
> + * rtdm_task_join() was invoked.
> + *
> + * @param[in,out] task Task handle
> + * @param[in] name Optional task name
> + * @param[in] task_proc Procedure to be executed by the task
> + * @param[in] arg Custom argument passed to @c task_proc() on entry
> + * @param[in] priority Priority of the task, see also
> + * @ref rtdmtaskprio "Task Priority Range"
> + * @param[in] period Period in nanoseconds of a cyclic task, 0 for non-cyclic
> + * mode. Waiting for the first and subsequent periodic events is
> + * done using rtdm_task_wait_period().
> + *
> + * @return 0 on success, otherwise negative error code
> + *
> + * @coretags{secondary-only, might-switch}
> + */
> +int rtdm_task_init(rtdm_task_t *task, const char *name,
> +		   rtdm_task_proc_t task_proc, void *arg,
> +		   int priority, nanosecs_rel_t period)
> +{
> +	return rtdm_task_init_with_affinity(task, CPU_MASK_ALL,
> +			name, task_proc, arg, priority, period);
> +}
>  EXPORT_SYMBOL_GPL(rtdm_task_init);
>  
> +/**
> + * @brief Initialise and start a real-time task on specified cpu
> + *
> + * After initialising a task, the task handle remains valid and can be
> + * passed to RTDM services until either rtdm_task_destroy() or
> + * rtdm_task_join() was invoked.
> + *
> + * @param[in,out] task Task handle
> + * @param[in] cpu that task want to run on
> + * @param[in] name Optional task name
> + * @param[in] task_proc Procedure to be executed by the task
> + * @param[in] arg Custom argument passed to @c task_proc() on entry
> + * @param[in] priority Priority of the task, see also
> + * @ref rtdmtaskprio "Task Priority Range"
> + * @param[in] period Period in nanoseconds of a cyclic task, 0 for non-cyclic
> + * mode. Waiting for the first and subsequent periodic events is
> + * done using rtdm_task_wait_period().
> + *
> + * @return 0 on success, otherwise negative error code
> + *
> + * @coretags{secondary-only, might-switch}
> + */
> +int rtdm_task_init_on_cpu(rtdm_task_t *task, int cpu,
> +		const char *name, rtdm_task_proc_t task_proc, void *arg,
> +		int priority, nanosecs_rel_t period)
> +{
> +	if (!cpu_online(cpu))
> +		return -EINVAL;
> +
> +	return rtdm_task_init_with_affinity(task, *cpumask_of(cpu),
> +			name, task_proc, arg, priority, period);
> +
> +}
> +EXPORT_SYMBOL_GPL(rtdm_task_init_on_cpu);
> +
>  #ifdef DOXYGEN_CPP /* Only used for doxygen doc generation */
>  /**
>   * @brief Destroy a real-time task


-- 
Philippe.


  parent reply	other threads:[~2021-03-11  8:32 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-11  6:48 [PATCH 1/2] cobalt/rtdm: introduce new interfaces to init task hongzha1
2021-03-11  6:48 ` [PATCH 2/2] cobalt/rtdm: introduce new interface to init timer hongzha1
2021-03-11  8:13   ` Philippe Gerum
2021-03-11  8:21     ` Chen, Hongzhan
2021-03-11  8:48       ` Philippe Gerum
2021-03-11  9:05   ` Philippe Gerum
2021-03-11  8:32 ` Philippe Gerum [this message]
2021-03-12  2:42 [PATCH 1/2] cobalt/rtdm: introduce new interfaces to init task hongzha1
2021-03-14 16:22 ` Philippe Gerum

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=87sg52gkf3.fsf@xenomai.org \
    --to=rpm@xenomai.org \
    --cc=hongzhan.chen@intel.com \
    --cc=xenomai@xenomai.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.