From owner-svn-src-user@FreeBSD.ORG Tue Nov 6 18:07:49 2012 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 57452902; Tue, 6 Nov 2012 18:07:49 +0000 (UTC) (envelope-from bright@mu.org) Received: from elvis.mu.org (elvis.mu.org [192.203.228.196]) by mx1.freebsd.org (Postfix) with ESMTP id 245198FC14; Tue, 6 Nov 2012 18:07:49 +0000 (UTC) Received: from Alfreds-MacBook-Pro-5.local (c-67-180-208-218.hsd1.ca.comcast.net [67.180.208.218]) by elvis.mu.org (Postfix) with ESMTPSA id AFFE21A3C22; Tue, 6 Nov 2012 10:07:43 -0800 (PST) Message-ID: <509951EF.1020602@mu.org> Date: Tue, 06 Nov 2012 10:07:43 -0800 From: Alfred Perlstein User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:16.0) Gecko/20121026 Thunderbird/16.0.2 MIME-Version: 1.0 To: Andrey Zonov Subject: Re: svn commit: r242637 - in user/alfred/so_discard/sys: kern sys References: <201211060008.qA6089AQ024990@svn.freebsd.org> <5098C2D2.5060002@FreeBSD.org> In-Reply-To: <5098C2D2.5060002@FreeBSD.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Cc: Alfred Perlstein , src-committers@freebsd.org, svn-src-user@freebsd.org X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 06 Nov 2012 18:07:49 -0000 Thank you. As this is a just a user project I am not too concerned about SMP safety for the stats, I will update the comment though. Changes/suggestions are welcome though! -Alfred On 11/5/12 11:57 PM, Andrey Zonov wrote: > On 11/6/12 4:08 AM, Alfred Perlstein wrote: >> Author: alfred >> Date: Tue Nov 6 00:08:09 2012 >> New Revision: 242637 >> URL: http://svnweb.freebsd.org/changeset/base/242637 >> >> Log: >> Implement a socket option SO_DISCARD_RECV, this will discard any >> data that arrives. I've found this very useful for testing streaming >> services and want to share it with community as a whole as well as >> stash it someplace I can pull up if needed for benching. >> >> Modified: >> user/alfred/so_discard/sys/kern/uipc_socket.c >> user/alfred/so_discard/sys/sys/socket.h >> >> Modified: user/alfred/so_discard/sys/kern/uipc_socket.c >> ============================================================================== >> --- user/alfred/so_discard/sys/kern/uipc_socket.c Tue Nov 6 00:03:53 2012 (r242636) >> +++ user/alfred/so_discard/sys/kern/uipc_socket.c Tue Nov 6 00:08:09 2012 (r242637) >> @@ -2479,6 +2479,26 @@ so_setsockopt(struct socket *so, int lev >> return (sosetopt(so, &sopt)); >> } >> >> +static int so_discard_rcv_calls; >> + >> +SYSCTL_INT(_kern_ipc, OID_AUTO, so_discard_rcv_calls, CTLFLAG_RD, >> + &so_discard_rcv_calls, 0, "Number of open sockets"); > ^^^^^^^^^^^^^^^^^^^^^^ > Is the comment correct? > >> + >> + >> + >> + >> +static int >> +so_discard_rcv(struct socket *so, void *arg, int waitflag) >> +{ >> + struct sockbuf *sb; >> + >> + so_discard_rcv_calls++; > It seems this incrementing is not safe in multi-threaded world. > >> + sb = &so->so_rcv; >> + SOCKBUF_LOCK_ASSERT(sb); >> + sbflush_locked(sb); >> + return (SU_OK); >> +} >> + >> int >> sosetopt(struct socket *so, struct sockopt *sopt) >> { >> @@ -2681,7 +2701,31 @@ sosetopt(struct socket *so, struct socko >> error = EOPNOTSUPP; >> #endif >> break; >> - >> + case SO_DISCARD_RECV: { >> + struct sockbuf *sb = &so->so_rcv; >> + error = sooptcopyin(sopt, &optval, sizeof optval, >> + sizeof optval); >> + if (error) >> + goto bad; >> + SOCKBUF_LOCK(&so->so_rcv); >> + if (optval == 1) { >> + if (sb->sb_upcall != NULL) { >> + error = EBUSY; >> + } else { >> + soupcall_set(so, SO_RCV, >> + &so_discard_rcv, NULL); >> + } >> + } else if (optval == 0) { >> + if (sb->sb_upcall == so_discard_rcv) >> + soupcall_clear(so, SO_RCV); >> + else >> + error = EINVAL; >> + } else { >> + error = ENOPROTOOPT; >> + } >> + SOCKBUF_UNLOCK(&so->so_rcv); >> + } >> + break; >> default: >> error = ENOPROTOOPT; >> break; >> @@ -2869,6 +2913,10 @@ integer: >> optval = so->so_incqlen; >> goto integer; >> >> + case SO_DISCARD_RECV: >> + optval = (so->so_rcv.sb_upcall == so_discard_rcv) ? 1 : 0; >> + goto integer; >> + >> default: >> error = ENOPROTOOPT; >> break; >> >> Modified: user/alfred/so_discard/sys/sys/socket.h >> ============================================================================== >> --- user/alfred/so_discard/sys/sys/socket.h Tue Nov 6 00:03:53 2012 (r242636) >> +++ user/alfred/so_discard/sys/sys/socket.h Tue Nov 6 00:08:09 2012 (r242637) >> @@ -140,6 +140,7 @@ typedef __uid_t uid_t; >> #define SO_USER_COOKIE 0x1015 /* user cookie (dummynet etc.) */ >> #define SO_PROTOCOL 0x1016 /* get socket protocol (Linux name) */ >> #define SO_PROTOTYPE SO_PROTOCOL /* alias for SO_PROTOCOL (SunOS name) */ >> +#define SO_DISCARD_RECV 0x1017 /* discard recieved data */ >> #endif >> >> /* >> >