From owner-svn-src-all@FreeBSD.ORG Tue Nov 4 11:40:46 2014 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id BDB061AF; Tue, 4 Nov 2014 11:40:46 +0000 (UTC) Received: from mail-wg0-x22e.google.com (mail-wg0-x22e.google.com [IPv6:2a00:1450:400c:c00::22e]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority G2" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id DE7D07C; Tue, 4 Nov 2014 11:40:45 +0000 (UTC) Received: by mail-wg0-f46.google.com with SMTP id x13so13265127wgg.19 for ; Tue, 04 Nov 2014 03:40:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=date:from:to:cc:subject:message-id:references:mime-version :content-type:content-disposition:in-reply-to:user-agent; bh=i0oCl0wya2LMO+2iQPVV84Un+GRoLHI+56pXJQlZBuI=; b=Cll9ubGJvvinqS9DzIXw6yWIfIXdKoBrbnH2i6wDqyV1KZ+atxnIgUR4RQo4Jz0J1S g35OnHwNWr6WbXTmDPRee+j6CXDauhpLDHDZ8ZHv4vPMF7fE8I9USQqHVY3ZY3GdNlz2 OAxHAlvF51mfo6gVx+HvGjoueL52i6hsODMuYKEHTqcZ6gdGV3uHD4fJ+YNUIsgkbeaZ v87CgYIQ8zDNVDt/QDhYT386sWsYruiDOC+Gdo6afPbxmvWve/Weg2nXBWAMHCl9YwCE 9klNEDGxtr8c+IHbY2D8YnGbR35pmMTEST2FprWTDOxA+ynvQriB70Dr90TOfLdt/ZOo 4vHA== X-Received: by 10.180.23.98 with SMTP id l2mr23124747wif.51.1415101244192; Tue, 04 Nov 2014 03:40:44 -0800 (PST) Received: from dft-labs.eu (n1x0n-1-pt.tunnel.tserv5.lon1.ipv6.he.net. [2001:470:1f08:1f7::2]) by mx.google.com with ESMTPSA id k10sm231962wjb.28.2014.11.04.03.40.43 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Tue, 04 Nov 2014 03:40:43 -0800 (PST) Date: Tue, 4 Nov 2014 12:40:41 +0100 From: Mateusz Guzik To: Hans Petter Selasky Subject: Re: svn commit: r274088 - head/sys/kern Message-ID: <20141104114041.GA21297@dft-labs.eu> References: <201411041129.sA4BTnwX030600@svn.freebsd.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <201411041129.sA4BTnwX030600@svn.freebsd.org> User-Agent: Mutt/1.5.21 (2010-09-15) Cc: svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 04 Nov 2014 11:40:47 -0000 On Tue, Nov 04, 2014 at 11:29:49AM +0000, Hans Petter Selasky wrote: > Author: hselasky > Date: Tue Nov 4 11:29:49 2014 > New Revision: 274088 > URL: https://svnweb.freebsd.org/changeset/base/274088 > > Log: > Simplify logic a bit. Ensure data buffer is properly aligned, > especially for platforms where unaligned access is not allowed. Make > it possible to override the small buffer size. > > A simple continuous read string test using libusb showed a reduction > in CPU usage from roughly 10% to less than 1% using a dual-core GHz > CPU, when the malloc() operation was skipped for small buffers. > > MFC after: 2 weeks > > Modified: > head/sys/kern/sys_generic.c > > Modified: head/sys/kern/sys_generic.c > ============================================================================== > --- head/sys/kern/sys_generic.c Tue Nov 4 10:25:52 2014 (r274087) > +++ head/sys/kern/sys_generic.c Tue Nov 4 11:29:49 2014 (r274088) > @@ -646,10 +646,13 @@ struct ioctl_args { > int > sys_ioctl(struct thread *td, struct ioctl_args *uap) > { > +#ifndef SYS_IOCTL_SMALL_SIZE > +#define SYS_IOCTL_SMALL_SIZE 128 > +#endif > + u_char smalldata[SYS_IOCTL_SMALL_SIZE] __aligned(8); Should not you align to word size instead? Also maybe it would be beneficial to derive the limit from KSTACK_PAGES (something silly like KSTACK_PAGES * 32 or something), which I believe would address earlier complaints. > u_long com; > int arg, error; > u_int size; > - u_char smalldata[128]; > caddr_t data; > > if (uap->com > 0xffffffff) { > @@ -682,10 +685,10 @@ sys_ioctl(struct thread *td, struct ioct > data = (void *)&arg; > size = 0; > } else { > - if (size <= sizeof(smalldata)) > - data = smalldata; > - else > + if (size > SYS_IOCTL_SMALL_SIZE) > data = malloc((u_long)size, M_IOCTLOPS, M_WAITOK); > + else > + data = smalldata; > } > } else > data = (void *)&uap->data; > @@ -707,7 +710,7 @@ sys_ioctl(struct thread *td, struct ioct > error = copyout(data, uap->data, (u_int)size); > > out: > - if (size > 0 && data != (caddr_t)&smalldata) > + if (size > SYS_IOCTL_SMALL_SIZE) > free(data, M_IOCTLOPS); > return (error); > } > -- Mateusz Guzik