From patchwork Thu Jun 13 14:49:58 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eliezer Tamir X-Patchwork-Id: 251090 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 833F62C0095 for ; Fri, 14 Jun 2013 00:50:31 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756394Ab3FMOuI (ORCPT ); Thu, 13 Jun 2013 10:50:08 -0400 Received: from mga03.intel.com ([143.182.124.21]:62325 "EHLO mga03.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751515Ab3FMOuG (ORCPT ); Thu, 13 Jun 2013 10:50:06 -0400 Received: from azsmga002.ch.intel.com ([10.2.17.35]) by azsmga101.ch.intel.com with ESMTP; 13 Jun 2013 07:50:05 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.87,859,1363158000"; d="scan'208";a="254548252" Received: from etamir-mobl.ger.corp.intel.com (HELO [10.255.202.53]) ([10.255.202.53]) by AZSMGA002.ch.intel.com with ESMTP; 13 Jun 2013 07:49:58 -0700 Message-ID: <51B9DC16.9020102@linux.intel.com> Date: Thu, 13 Jun 2013 17:49:58 +0300 From: Eliezer Tamir User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20130509 Thunderbird/17.0.6 MIME-Version: 1.0 To: David Miller CC: linux-kernel@vger.kernel.org, netdev@vger.kernel.org, Jesse Brandeburg , Don Skidmore , e1000-devel@lists.sourceforge.net, Willem de Bruijn , Eric Dumazet , Ben Hutchings , Andi Kleen , HPA , Eilon Greenstien , Or Gerlitz , Amir Vadai , Alex Rosenbaum , Avner Ben Hanoch , Or Kehati , sockperf-dev@googlegroups.com, Eliezer Tamir Subject: [PATCH] sockperf: add SO_LL socketop support References: <20130613144613.4875.46858.stgit@ladj378.jer.intel.com> In-Reply-To: <20130613144613.4875.46858.stgit@ladj378.jer.intel.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Add lls socket option support to sockperf. Right now we always get the option before set to show the option is working properly. We should probably remove that in an official release. use --lls (value in usecs) to override global setting. --- src/Defs.h | 3 +++ src/SockPerf.cpp | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 56 insertions(+), 1 deletions(-) defined by default)." }, @@ -292,7 +296,7 @@ static int proc_mode_help( int id, int argc, const char **argv ) int i = 0; printf(MODULE_NAME " is a tool for testing network latency and throughput.\n"); - printf("version %s\n", STR(VERSION)); + printf("version %s-lls\n", STR(VERSION)); printf("\n"); printf("Usage: " MODULE_NAME " [options] [args]\n"); printf("Type: \'" MODULE_NAME " --help\' for help on a specific subcommand.\n"); @@ -1789,6 +1793,26 @@ static int parse_common_opt( const AOPT_OBJECT *common_obj ) s_user_params.is_nonblocked_send = true; } + if ( !rc && aopt_check(common_obj, OPT_LLS) ) { + const char* optarg = aopt_value(common_obj, OPT_LLS); + if (optarg) { + errno = 0; + int value = strtoul(optarg, NULL, 0); + if (errno != 0 || value < 0) { + log_msg("'-%d' Invalid LLS value: %s", OPT_LLS, optarg); + rc = SOCKPERF_ERR_BAD_ARGUMENT; + } + else { + s_user_params.lls_usecs = value; + s_user_params.lls_is_set = true; + } + } + else { + log_msg("'-%d' Invalid value", OPT_LLS); + rc = SOCKPERF_ERR_BAD_ARGUMENT; + } + } + if ( !rc && aopt_check(common_obj, OPT_RECV_LOOPING) ) { const char* optarg = aopt_value(common_obj, OPT_RECV_LOOPING); @@ -2296,6 +2320,29 @@ int sock_set_reuseaddr(int fd) return rc; } +#ifndef SO_LL +#define SO_LL 46 +#endif +int sock_set_lls(int fd) +{ + int rc = SOCKPERF_ERR_NONE; + unsigned long lls; + int size = sizeof(lls); + + if(getsockopt(fd, SOL_SOCKET, SO_LL, &lls, (socklen_t *)&size) < 0){ + log_err("getsockopt(SO_LL) failed"); + return SOCKPERF_ERR_SOCKET; + } else + log_msg("socket option SO_LL default was %lu, changing to %lu", lls, s_user_params.lls_usecs); + + if (setsockopt(fd, SOL_SOCKET, SO_LL, &(s_user_params.lls_usecs), sizeof(s_user_params.lls_usecs)) < 0) { + log_err("setsockopt(SO_LL) failed"); + rc = SOCKPERF_ERR_SOCKET; + } + return rc; +} + + int sock_set_snd_rcv_bufs(int fd) { /* @@ -2460,6 +2507,11 @@ int prepare_socket(int fd, struct fds_data *p_data) } if (!rc && + (s_user_params.lls_is_set == true)) + { + rc = sock_set_lls(fd); + } + if (!rc && (s_user_params.sock_buff_size > 0)) { rc = sock_set_snd_rcv_bufs(fd); -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/src/Defs.h b/src/Defs.h index e38e3a4..87b45a0 100644 --- a/src/Defs.h +++ b/src/Defs.h @@ -161,6 +161,7 @@ enum { OPT_OUTPUT_PRECISION, //35 OPT_CLIENTPORT, //36 OPT_CLIENTIP, //37 + OPT_LLS, //38 }; #define MODULE_NAME "sockperf" @@ -527,6 +528,8 @@ struct user_params_t { // bool stream_mode; - use b_stream instead int mthread_server; struct timeval* select_timeout; + unsigned long lls_usecs; + bool lls_is_set; int sock_buff_size; int threads_num; char threads_affinity[MAX_ARGV_SIZE]; diff --git a/src/SockPerf.cpp b/src/SockPerf.cpp index 41daf95..d76320f 100644 --- a/src/SockPerf.cpp +++ b/src/SockPerf.cpp @@ -207,6 +207,10 @@ static const AOPT_DESC common_opt_desc[] = "Limit the lifetime of the message (default 2)." }, { + OPT_LLS, AOPT_ARG, aopt_set_literal( 0 ), aopt_set_string( "lls" ), + "Turn on LLS via socket option (value = us to poll)." + }, + { OPT_BUFFER_SIZE, AOPT_ARG, aopt_set_literal( 0 ), aopt_set_string( "buffer-size" ), "Set total socket receive/send buffer in bytes (system