From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934148AbcJQWEK (ORCPT ); Mon, 17 Oct 2016 18:04:10 -0400 Received: from Galois.linutronix.de ([146.0.238.70]:38629 "EHLO Galois.linutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933622AbcJQWDq (ORCPT ); Mon, 17 Oct 2016 18:03:46 -0400 Date: Tue, 18 Oct 2016 00:01:01 +0200 (CEST) From: Thomas Gleixner To: Fenghua Yu cc: "H. Peter Anvin" , Ingo Molnar , Tony Luck , Peter Zijlstra , Stephane Eranian , Borislav Petkov , Dave Hansen , Nilay Vaish , Shaohua Li , David Carrillo-Cisneros , Ravi V Shankar , Sai Prakhya , Vikas Shivappa , linux-kernel , x86 Subject: Re: [PATCH v4 15/18] x86/intel_rdt: Add tasks files In-Reply-To: <1476497548-11169-16-git-send-email-fenghua.yu@intel.com> Message-ID: References: <1476497548-11169-1-git-send-email-fenghua.yu@intel.com> <1476497548-11169-16-git-send-email-fenghua.yu@intel.com> User-Agent: Alpine 2.20 (DEB 67 2015-01-07) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, 14 Oct 2016, Fenghua Yu wrote: > +struct task_move_callback { > + struct callback_head work; > + struct rdtgroup *rdtgrp; Please align the struct members as you did everywhere else already. > +}; > + > +static void move_myself(struct callback_head *head) > +{ > + struct task_move_callback *callback; > + struct rdtgroup *rdtgrp; > + > + callback = container_of(head, struct task_move_callback, work); > + rdtgrp = callback->rdtgrp; > + > + /* Resource group might have been deleted before process runs */ /* * If resource group was deleted before this task work callback * was invoked, then assign the task to root group and free the * resource group, */ > + if (atomic_dec_and_test(&rdtgrp->waitcount) && > + (rdtgrp->flags & RDT_DELETED)) { > + current->closid = 0; > + kfree(rdtgrp); > + } > + > + kfree(callback); > +} > + > +static int __rdtgroup_move_task(struct task_struct *tsk, > + struct rdtgroup *rdtgrp) > +{ > + struct task_move_callback *callback; > + int ret; > + > + callback = kzalloc(sizeof(*callback), GFP_KERNEL); > + if (!callback) > + return -ENOMEM; > + callback->work.func = move_myself; > + callback->rdtgrp = rdtgrp; Lacks a comment: /* * Take a refcount, so rdtgrp cannot be freed before the * callback has been invoked */ > + atomic_inc(&rdtgrp->waitcount); > + ret = task_work_add(tsk, &callback->work, true); > + if (ret) { Lacks a comment as well: /* * Task is exiting. Drop the refcount and free the callback. * No need to check the refcount as the group cannot be * deleted before the write function unlocks rdtgroup_mutex. */ For you the comment might be obvious, but I had to lookup the world and some more. > + atomic_dec(&rdtgrp->waitcount); > + kfree(callback); > + } else { > + tsk->closid = rdtgrp->closid; > + } > + return ret; > +static int rdtgroup_task_write_permission(struct task_struct *task, > + struct kernfs_open_file *of) > +{ > + const struct cred *cred = current_cred(); > + const struct cred *tcred = get_task_cred(task); > + int ret = 0; > + > + /* > + * even if we're attaching all tasks in the thread group, we only Sentences start with an uppercase letter. > + * need to check permissions on one of them. > + */ > + if (!uid_eq(cred->euid, GLOBAL_ROOT_UID) && > + !uid_eq(cred->euid, tcred->uid) && > + !uid_eq(cred->euid, tcred->suid)) > + ret = -EPERM; > + > + put_cred(tcred); > + return ret; > +} > + > +static int rdtgroup_move_task(pid_t pid, struct rdtgroup *rdtgrp, > + struct kernfs_open_file *of) > +{ > + struct task_struct *tsk; > + int ret; > + > + rcu_read_lock(); > + if (pid) { > + tsk = find_task_by_vpid(pid); > + if (!tsk) { > + ret = -ESRCH; > + goto out_unlock_rcu; This goto is pointless as this is the only user, rcu_read_unlock()l return -ESRCH; > + } > + } else { > + tsk = current; > + } > @@ -559,6 +713,13 @@ static void rmdir_all_sub(void) > { > struct rdtgroup *rdtgrp; > struct list_head *l, *next; > + struct task_struct *p; > + > + /* move all tasks to default resource group */ > + read_lock(&tasklist_lock); > + for_each_process(p) > + p->closid = 0; > + read_unlock(&tasklist_lock); Ok. > + /* Don't allow if there are processes in this group */ > + read_lock(&tasklist_lock); > + for_each_process(p) { > + if (p->closid == rdtgrp->closid) { > + read_unlock(&tasklist_lock); > + rdtgroup_kn_unlock(kn); > + return -EBUSY; > + } > + } > + read_unlock(&tasklist_lock); I wonder, whether we should simply give those tasks back to the default group, same as we do with the cpus. Thanks, tglx