Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 06 Nov 2012 10:07:43 -0800
From:      Alfred Perlstein <bright@mu.org>
To:        Andrey Zonov <zont@FreeBSD.org>
Cc:        Alfred Perlstein <alfred@FreeBSD.org>, src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   Re: svn commit: r242637 - in user/alfred/so_discard/sys: kern sys
Message-ID:  <509951EF.1020602@mu.org>
In-Reply-To: <5098C2D2.5060002@FreeBSD.org>
References:  <201211060008.qA6089AQ024990@svn.freebsd.org> <5098C2D2.5060002@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
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
>>   
>>   /*
>>
>




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?509951EF.1020602>