svn commit: r242637 - in user/alfred/so_discard/sys: kern sys
Alfred Perlstein
bright at mu.org
Tue Nov 6 18:07:49 UTC 2012
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
>>
>> /*
>>
>
More information about the svn-src-user
mailing list