All of lore.kernel.org
 help / color / mirror / Atom feed
From: Frederic Barrat <fbarrat@linux.vnet.ibm.com>
To: linuxppc-dev@lists.ozlabs.org
Subject: Re: [PATCH v2 13/18] powerpc: Add support for setting SPRN_TIDR
Date: Fri, 20 Oct 2017 13:03:28 +0200	[thread overview]
Message-ID: <a444854c-c140-f60d-f63a-912c939f938d@linux.vnet.ibm.com> (raw)
In-Reply-To: <1507343298-27496-14-git-send-email-sukadev@linux.vnet.ibm.com>



Le 07/10/2017 à 04:28, Sukadev Bhattiprolu a écrit :
> We need the SPRN_TIDR to be set for use with fast thread-wakeup (core-
> to-core wakeup) and also with CAPI.
> 
> Each thread in a process needs to have a unique id within the process.
> But as explained below, for now, we assign globally unique thread ids
> to all threads in the system.
> 
> Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
> Signed-off-by: Philippe Bergheaud <felix@linux.vnet.ibm.com>
> Signed-off-by: Christophe Lombard <clombard@linux.vnet.ibm.com>
> ---

FWIW
Reviewed-by: Frederic Barrat <fbarrat@linux.vnet.ibm.com>


> Changelog[v3]
> 	- Merge changes with and address comments to Christophe's patch.
> 	  (i.e drop CONFIG_PPC_VAS; use CONFIG_PPC64; check CPU_ARCH_300
> 	  before setting TIDR). Defer following to separate patches:
> 	  	- emulation parts of Christophe's patch,
> 		- setting TIDR for tasks other than 'current'
> 		- setting feature bit in AT_HWCAP2
> 
> Changelog[v2]
> 	- Michael Ellerman: Use an interface to assign TIDR so it is
> 	    assigned to only threads that need it; move assignment to
> 	    restore_sprs(). Drop lint from rebase;
> ---
>   arch/powerpc/include/asm/processor.h |   1 +
>   arch/powerpc/include/asm/switch_to.h |   3 +
>   arch/powerpc/kernel/process.c        | 122 +++++++++++++++++++++++++++++++++++
>   3 files changed, 126 insertions(+)
> 
> diff --git a/arch/powerpc/include/asm/processor.h b/arch/powerpc/include/asm/processor.h
> index fab7ff8..58cc212 100644
> --- a/arch/powerpc/include/asm/processor.h
> +++ b/arch/powerpc/include/asm/processor.h
> @@ -329,6 +329,7 @@ struct thread_struct {
>   	 */
>   	int		dscr_inherit;
>   	unsigned long	ppr;	/* used to save/restore SMT priority */
> +	unsigned long	tidr;
>   #endif
>   #ifdef CONFIG_PPC_BOOK3S_64
>   	unsigned long	tar;
> diff --git a/arch/powerpc/include/asm/switch_to.h b/arch/powerpc/include/asm/switch_to.h
> index 17c8380..f5da32f 100644
> --- a/arch/powerpc/include/asm/switch_to.h
> +++ b/arch/powerpc/include/asm/switch_to.h
> @@ -91,4 +91,7 @@ static inline void clear_task_ebb(struct task_struct *t)
>   #endif
>   }
> 
> +extern int set_thread_tidr(struct task_struct *t);
> +extern void clear_thread_tidr(struct task_struct *t);
> +
>   #endif /* _ASM_POWERPC_SWITCH_TO_H */
> diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
> index 37ed60b..d861fcd 100644
> --- a/arch/powerpc/kernel/process.c
> +++ b/arch/powerpc/kernel/process.c
> @@ -1120,6 +1120,13 @@ static inline void restore_sprs(struct thread_struct *old_thread,
>   			mtspr(SPRN_TAR, new_thread->tar);
>   	}
>   #endif
> +#ifdef CONFIG_PPC64
> +	if (old_thread->tidr != new_thread->tidr) {
> +		/* TIDR should be non-zero only with ISA3.0. */
> +		WARN_ON_ONCE(!cpu_has_feature(CPU_FTR_ARCH_300));
> +		mtspr(SPRN_TIDR, new_thread->tidr);
> +	}
> +#endif
>   }
> 
>   #ifdef CONFIG_PPC_BOOK3S_64
> @@ -1438,9 +1445,117 @@ void flush_thread(void)
>   #endif /* CONFIG_HAVE_HW_BREAKPOINT */
>   }
> 
> +#ifdef CONFIG_PPC64
> +static DEFINE_SPINLOCK(vas_thread_id_lock);
> +static DEFINE_IDA(vas_thread_ida);
> +
> +/*
> + * We need to assign a unique thread id to each thread in a process.
> + *
> + * This thread id, referred to as TIDR, and separate from the Linux's tgid,
> + * is intended to be used to direct an ASB_Notify from the hardware to the
> + * thread, when a suitable event occurs in the system.
> + *
> + * One such event is a "paste" instruction in the context of Fast Thread
> + * Wakeup (aka Core-to-core wake up in the Virtual Accelerator Switchboard
> + * (VAS) in POWER9.
> + *
> + * To get a unique TIDR per process we could simply reuse task_pid_nr() but
> + * the problem is that task_pid_nr() is not yet available copy_thread() is
> + * called. Fixing that would require changing more intrusive arch-neutral
> + * code in code path in copy_process()?.
> + *
> + * Further, to assign unique TIDRs within each process, we need an atomic
> + * field (or an IDR) in task_struct, which again intrudes into the arch-
> + * neutral code. So try to assign globally unique TIDRs for now.
> + *
> + * NOTE: TIDR 0 indicates that the thread does not need a TIDR value.
> + *	 For now, only threads that expect to be notified by the VAS
> + *	 hardware need a TIDR value and we assign values > 0 for those.
> + */
> +#define MAX_THREAD_CONTEXT	((1 << 16) - 1)
> +static int assign_thread_tidr(void)
> +{
> +	int index;
> +	int err;
> +
> +again:
> +	if (!ida_pre_get(&vas_thread_ida, GFP_KERNEL))
> +		return -ENOMEM;
> +
> +	spin_lock(&vas_thread_id_lock);
> +	err = ida_get_new_above(&vas_thread_ida, 1, &index);
> +	spin_unlock(&vas_thread_id_lock);
> +
> +	if (err == -EAGAIN)
> +		goto again;
> +	else if (err)
> +		return err;
> +
> +	if (index > MAX_THREAD_CONTEXT) {
> +		spin_lock(&vas_thread_id_lock);
> +		ida_remove(&vas_thread_ida, index);
> +		spin_unlock(&vas_thread_id_lock);
> +		return -ENOMEM;
> +	}
> +
> +	return index;
> +}
> +
> +static void free_thread_tidr(int id)
> +{
> +	spin_lock(&vas_thread_id_lock);
> +	ida_remove(&vas_thread_ida, id);
> +	spin_unlock(&vas_thread_id_lock);
> +}
> +
> +/*
> + * Clear any TIDR value assigned to this thread.
> + */
> +void clear_thread_tidr(struct task_struct *t)
> +{
> +	if (!t->thread.tidr)
> +		return;
> +
> +	if (!cpu_has_feature(CPU_FTR_ARCH_300)) {
> +		WARN_ON_ONCE(1);
> +		return;
> +	}
> +
> +	mtspr(SPRN_TIDR, 0);
> +	free_thread_tidr(t->thread.tidr);
> +	t->thread.tidr = 0;
> +}
> +
> +/*
> + * Assign a unique TIDR (thread id) for task @t and set it in the thread
> + * structure. For now, we only support setting TIDR for 'current' task.
> + */
> +int set_thread_tidr(struct task_struct *t)
> +{
> +	if (!cpu_has_feature(CPU_FTR_ARCH_300))
> +		return -EINVAL;
> +
> +	if (t != current)
> +		return -EINVAL;
> +
> +	t->thread.tidr = assign_thread_tidr();
> +	if (t->thread.tidr < 0)
> +		return t->thread.tidr;
> +
> +	mtspr(SPRN_TIDR, t->thread.tidr);
> +
> +	return 0;
> +}
> +
> +#endif /* CONFIG_PPC64 */
> +
>   void
>   release_thread(struct task_struct *t)
>   {
> +#ifdef CONFIG_PPC64
> +	clear_thread_tidr(t);
> +#endif
>   }
> 
>   /*
> @@ -1466,6 +1581,10 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)
> 
>   	clear_task_ebb(dst);
> 
> +#ifdef CONFIG_PPC64
> +	dst->thread.tidr = 0;
> +#endif
> +
>   	return 0;
>   }
> 
> @@ -1576,6 +1695,9 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
>   #endif
> 
>   	setup_ksp_vsid(p, sp);
> +#ifdef CONFIG_PPC64
> +	p->thread.tidr = 0;
> +#endif
> 
>   #ifdef CONFIG_PPC64
>   	if (cpu_has_feature(CPU_FTR_DSCR)) {
> 

  reply	other threads:[~2017-10-20 11:03 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-10-07  2:28 [PATCH v2 00/18] powerpc/vas: Add support for FTW Sukadev Bhattiprolu
2017-10-07  2:28 ` [PATCH v2 01/18] powerpc/vas: init missing fields from [rt]xattr Sukadev Bhattiprolu
2017-10-07  2:28 ` [PATCH v2 02/18] powerpc/vas: Validate window credits Sukadev Bhattiprolu
2017-10-07  2:28 ` [PATCH v2 03/18] powerpc/vas: Cleanup some debug code Sukadev Bhattiprolu
2017-10-07  2:28 ` [PATCH v2 04/18] powerpc/vas: Drop poll_window_cast_out() Sukadev Bhattiprolu
2017-10-07  2:28 ` [PATCH v2 05/18] powerpc/vas: Use helper to unpin/close window Sukadev Bhattiprolu
2017-10-07  2:28 ` [PATCH v2 06/18] powerpc/vas: Reduce polling interval for busy state Sukadev Bhattiprolu
2017-10-07  2:28 ` [PATCH v2 07/18] powerpc/vas: Save configured window credits Sukadev Bhattiprolu
2017-10-07  2:28 ` [PATCH v2 08/18] powerpc/vas: poll for return of " Sukadev Bhattiprolu
2017-10-07  2:28 ` [PATCH v2 09/18] powerpc/vas: Create cpu to vas id mapping Sukadev Bhattiprolu
2017-10-07  2:28 ` [PATCH v2 10/18] powerpc/vas, nx-842: Define and use chip_to_vas_id() Sukadev Bhattiprolu
2017-10-07  2:28 ` [PATCH v2 11/18] powerpc/vas: Export HVWC to debugfs Sukadev Bhattiprolu
2017-11-07 12:19   ` Michael Ellerman
2017-10-07  2:28 ` [PATCH v2 12/18] powerpc: have copy depend on CONFIG_BOOK3S_64 Sukadev Bhattiprolu
2017-10-07  2:28 ` [PATCH v2 13/18] powerpc: Add support for setting SPRN_TIDR Sukadev Bhattiprolu
2017-10-20 11:03   ` Frederic Barrat [this message]
2017-10-07  2:28 ` [PATCH v2 14/18] powerpc: Define set_thread_used_vas() Sukadev Bhattiprolu
2017-11-07  0:49   ` Nicholas Piggin
2017-11-09 11:01   ` Michael Ellerman
2017-10-07  2:28 ` [PATCH v2 15/18] powerpc: Emulate paste instruction Sukadev Bhattiprolu
2017-10-09 10:00   ` Michael Neuling
2017-10-09 10:00     ` Michael Neuling
2017-10-10  5:54     ` Michael Ellerman
2017-10-10  5:54       ` Michael Ellerman
2017-10-07  2:28 ` [PATCH v2 16/18] powerpc/vas: Define vas_win_paste_addr() Sukadev Bhattiprolu
2017-10-07  2:28 ` [PATCH v2 17/18] powerpc/vas: Define vas_win_id() Sukadev Bhattiprolu
2017-10-07  2:28 ` [PATCH v2 18/18] powerpc/vas: Add support for user receive window Sukadev Bhattiprolu

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=a444854c-c140-f60d-f63a-912c939f938d@linux.vnet.ibm.com \
    --to=fbarrat@linux.vnet.ibm.com \
    --cc=linuxppc-dev@lists.ozlabs.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.