security: tlk_driver: Run kthreads on CPU0
Arto Merilainen [Mon, 12 May 2014 08:06:01 +0000 (11:06 +0300)]
Currently, the driver assumes that smc requests come either
from workqueue or from a thread that has possibility to set
cpu affinity. However, kernel threads by default do not have
this possibility and in principle the flag can be set in middle
of operation.

Turning on devices is sometimes done in kernel threads and in GPU
case we may need to change i.e. the VPR parameters. Therefore,
ensure that the communication is done on CPU0.

Bug 1506585

Change-Id: I0cbd8b841a07c8400310167fa8800eaae9de21f2
Signed-off-by: Arto Merilainen <amerilainen@nvidia.com>
Reviewed-on: http://git-master/r/408075
Reviewed-by: Riham Haidar <rhaidar@nvidia.com>
Tested-by: Riham Haidar <rhaidar@nvidia.com>

security/tlk_driver/ote_comms.c

index cf5f87e..a1af050 100644 (file)
@@ -374,7 +374,8 @@ int te_set_vpr_params(void *vpr_base, size_t vpr_size)
        /* Share the same lock used when request is send from user side */
        mutex_lock(&smc_lock);
 
-       if (current->flags & PF_WQ_WORKER) {
+       if (current->flags &
+           (PF_WQ_WORKER | PF_NO_SETAFFINITY | PF_KTHREAD)) {
                struct tlk_smc_work_args work_args;
                int cpu = cpu_logical_map(smp_processor_id());
 
@@ -382,8 +383,9 @@ int te_set_vpr_params(void *vpr_base, size_t vpr_size)
                work_args.arg1 = (uint32_t)vpr_base;
                work_args.arg2 = vpr_size;
 
-               /* depending on the CPU, execute directly or sched work */
-               if (cpu == 0)
+               /* workers don't change CPU. depending on the CPU, execute
+                * directly or sched work */
+               if (cpu == 0 && (current->flags & PF_WQ_WORKER))
                        retval = tlk_generic_smc_on_cpu0(&work_args);
                else
                        retval = work_on_cpu(0,