Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1161145AbVLXAOV (ORCPT ); Fri, 23 Dec 2005 19:14:21 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1161148AbVLXAOV (ORCPT ); Fri, 23 Dec 2005 19:14:21 -0500 Received: from omx1-ext.sgi.com ([192.48.179.11]:44178 "EHLO omx1.americas.sgi.com") by vger.kernel.org with ESMTP id S1161145AbVLXAOU (ORCPT ); Fri, 23 Dec 2005 19:14:20 -0500 Date: Fri, 23 Dec 2005 16:13:47 -0800 (PST) From: Christoph Lameter To: Ravikiran G Thirumalai cc: Andrew Morton , linux-kernel@vger.kernel.org, "Shai Fultheim (Shai@scalex86.org)" , nippung@calsoftinc.com Subject: Re: [rfc][patch] Avoid taking global tasklist_lock for single threaded process at getrusage() In-Reply-To: <20051223231549.GA3848@localhost.localdomain> Message-ID: References: <20051221182320.GA4514@localhost.localdomain> <20051221211135.GB4514@localhost.localdomain> <20051223231549.GA3848@localhost.localdomain> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1487 Lines: 51 Please put the copy_to_user() invocation into sys_getrusage. That is the only function that needs to deal with user space issues includding the transfer of the contents of struct rusage. Define a local rusage in sys_getrusage. Pass that address to the other functions and only copy on success to user space. copy_to_user occurs repeatedly: On Fri, 23 Dec 2005, Ravikiran G Thirumalai wrote: > if (unlikely(!p->signal)) > - return; > + return copy_to_user(ru, &r, sizeof(r)) ? -EFAULT : 0; > > + cputime_to_timeval(utime, &r.ru_utime); > + cputime_to_timeval(stime, &r.ru_stime); > + > + return copy_to_user(ru, &r, sizeof(r)) ? -EFAULT : 0; > +} > + > + > + return copy_to_user(ru, &r, sizeof(r)) ? -EFAULT : 0; > } > > + if (unlikely(!p->signal)) > + return copy_to_user(ru, &r, sizeof(r)) ? -EFAULT : 0; > + But its only needed here: > asmlinkage long sys_getrusage(int who, struct rusage __user *ru) > { > - if (who != RUSAGE_SELF && who != RUSAGE_CHILDREN) > - return -EINVAL; > - return getrusage(current, who, ru); > + switch (who) { > + case RUSAGE_SELF: > + return getrusage_self(ru); > + case RUSAGE_CHILDREN: > + return getrusage_children(ru); > + default: > + break; > + } > + return -EINVAL; > } - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/