tipc: make use of kernel threads to simplify things
Subsystems (4)
v2 cover tipc: make use of kernel threads to simplify things
This is a rework of the content sent earlier[1], with the following changes:
-drop the Kconfig --> modparam conversion patch; this was
requested to be replaced[2] with a dynamic port quantity resizing. Ying and Erik were discussing how best to achieve this, and then vacation schedules got in the way, so implementing that will come (hopefully) in the next round.
-rework the sk_rcvbuf patch to allow memory resizing via sysctl
as per what Ying and Neil discussed[3]
-add 4 more seemingly straigtforward and relatively small changes
from Ying (the last 4 in the series).
-add cosmetic UAPI comment update patch from Ying.
That said, the largest change is still the one where we make use of the fact that linux supports kernel threads and do the server like operations within kernel threads. As Jon says:
We remove the last remnants of the TIPC native API, to make it possible to simplify locking policy and solve a problem with lost topology events.
First, we introduce a socket-based alternative to the native API.
Second, we convert the two remaining users of the native API, the TIPC internal topology server and the configuarion server, to use the new API.
Third, we remove the remaining code pertaining to the native API.
I have re-tested this collection of commits between 32 and 64 bit x86 machines using the standard tipc test suite, and build tested for ppc.
[1] http://patchwork.ozlabs.org/patch/247687/
[2] http://patchwork.ozlabs.org/patch/247680/
[3] http://patchwork.ozlabs.org/patch/247688/
Thanks,
Paul.
---
Cc: Neil Horman <[email protected]>
The following changes since commit 2e0c9e7911465b29daf85f7de97949004bf7b31c:
net: sctp: sctp_association_init: put refs in reverse order (2013-06-14 15:38:36 -0700)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/paulg/linux.git tipc_net-next
for you to fetch changes up to d4e1208e0e85255c644160be879e6f2d0b6bdcf9:
tipc: remove dev_base_lock use from enable_bearer (2013-06-17 10:13:30 -0400)
----------------------------------------------------------------
Erik Hugne (1):
tipc: allow implicit connect for stream sockets
Paul Gortmaker (1):
tipc: cosmetic realignment of function arguments
Ying Xue (14):
tipc: update code comments to reflect new uapi header path
tipc: change socket buffer overflow control to respect sk_rcvbuf
tipc: introduce new TIPC server infrastructure
tipc: convert topology server to use new server facility
tipc: convert configuration server to use new server facility
tipc: delete code orphaned by new server infrastructure
tipc: remove user_port instance from tipc_port structure
tipc: rename tipc_createport_raw to tipc_createport
tipc: convert config_lock from spinlock to mutex
tipc: save sock structure pointer instead of void pointer to tipc_port
tipc: enhance priority of link protocol packet
tipc: make tipc_link_send_sections_fast exit earlier
tipc: fix wrong return value for link_send_sections_long routine
tipc: remove dev_base_lock use from enable_bearer
Documentation/sysctl/net.txt | 17 +- include/uapi/linux/tipc.h | 2 +- include/uapi/linux/tipc_config.h | 2 +- net/tipc/Makefile | 3 +- net/tipc/bcast.c | 3 +- net/tipc/bcast.h | 3 +- net/tipc/config.c | 119 ++++---- net/tipc/core.c | 22 +- net/tipc/core.h | 17 +- net/tipc/discover.c | 7 +- net/tipc/eth_media.c | 15 +- net/tipc/ib_media.c | 13 +- net/tipc/link.c | 88 ++---- net/tipc/msg.c | 19 +- net/tipc/msg.h | 8 +- net/tipc/name_table.c | 10 +- net/tipc/name_table.h | 11 +- net/tipc/node_subscr.c | 2 +- net/tipc/port.c | 320 +-------------------- net/tipc/port.h | 85 +----- net/tipc/server.c | 596 +++++++++++++++++++++++++++++++++++++++ net/tipc/server.h | 94 ++++++ net/tipc/socket.c | 146 ++++++++-- net/tipc/subscr.c | 348 +++++++---------------- net/tipc/subscr.h | 21 +- net/tipc/sysctl.c | 64 +++++ 26 files changed, 1158 insertions(+), 877 deletions(-) create mode 100644 net/tipc/server.c create mode 100644 net/tipc/server.h create mode 100644 net/tipc/sysctl.c
PATCH v2 1/16 tipc: update code comments to reflect new uapi header path
From: Ying Xue <[email protected]>
Files tipc.h and tipc_config.h were moved to uapi directory, but the corresponding comments were not updated at the same time.
--- include/uapi/linux/tipc.h | 2 +- include/uapi/linux/tipc_config.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
include/uapi/linux/tipc.h +1 -1
@@ -1,5 +1,5 @@/* -* include/linux/tipc.h: Include file for TIPC socket interface +* include/uapi/linux/tipc.h: Header for TIPC socket interface * * Copyright (c) 2003-2006, Ericsson AB * Copyright (c) 2005, 2010-2011, Wind River Systems
include/uapi/linux/tipc_config.h +1 -1
@@ -1,5 +1,5 @@/* -* include/linux/tipc_config.h: Include file for TIPC configuration interface +* include/uapi/linux/tipc_config.h: Header for TIPC configuration interface * * Copyright (c) 2003-2006, Ericsson AB * Copyright (c) 2005-2007, 2010-2011, Wind River Systems
Signature · 1 line
1.8.1.2
Re: [PATCH net-next 01/16] tipc: update code comments to reflect new uapi header path
Hello.
Quoted 28 lines · Paul Gortmaker
From: Ying Xue <[email protected]>
Files
tipc.handtipc_config.hwere moved to uapi directory, but the corresponding comments were not updated at the same time.Signed-off-by Ying Xue <[email protected]>Signed-off-by Paul Gortmaker <[email protected]>--- include/uapi/linux/tipc.h | 2 +- include/uapi/linux/tipc_config.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)include/uapi/linux/tipc.h +1
-1@@ -1,5 +1,5 @@/* -* include/linux/tipc.h: Include file for TIPC socket interface +* include/uapi/linux/tipc.h: Header for TIPC socket interface * * Copyright (c) 2003-2006, Ericsson AB * Copyright (c) 2005, 2010-2011, Wind River Systems include/uapi/linux/tipc_config.h +0
-0
include/uapi/linux/tipc_config.h line 2
Quoted 3 lines
include/uapi/linux/tipc_config.h +1
-1@@ -1,5 +1,5 @@/* -* include/linux/tipc_config.h: Include file for TIPC configuration interface +* include/uapi/linux/tipc_config.h: Header for TIPC configuration interface
File names in the heading comments are generally frowned upon. Maybe
it's worth just removing them?
WBR, Sergei
PATCH v2 2/16 tipc: change socket buffer overflow control to respect sk_rcvbuf
In reply to Paul GortmakerFrom: Ying Xue <[email protected]>
As per feedback from the netdev community, we change the buffer overflow protection algorithm in receiving sockets so that it always respects the nominal upper limit set in sk_rcvbuf.
Instead of scaling up from a small sk_rcvbuf value, which leads to violation of the configured sk_rcvbuf limit, we now calculate the weighted per-message limit by scaling down from a much bigger value, still in the same field, according to the importance priority of the received message.
To allow for administrative tunability of the socket receive buffer size, we create a tipc_rmem sysctl variable to allow the user to configure an even bigger value via sysctl command. It is a size of three (min/default/max) to be consistent with things like tcp_rmem.
By default, the value initialized in tipc_rmem[1] is equal to the receive socket size needed by a TIPC_CRITICAL_IMPORTANCE message. This value is also set as the default value of sk_rcvbuf.
--- Documentation/sysctl/net.txt | 17 +++++++++++- net/tipc/Makefile | 1 + net/tipc/core.c | 12 +++++++-- net/tipc/core.h | 9 +++++++ net/tipc/port.h | 2 ++ net/tipc/socket.c | 19 ++++++------- net/tipc/sysctl.c | 64 ++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 112 insertions(+), 12 deletions(-) create mode 100644 net/tipc/sysctl.c
Documentation/sysctl/net.txt +16 -1
@@ -26,7 +26,7 @@ Table : Subdirectories in /proc/sys/net ipv4 IP version 4 x25 X.25 protocol ipx IPX token-ring IBM token ring bridge Bridging decnet DEC net - ipv6 IP version 6 + ipv6 IP version 6 tipc TIPC .............................................................................. 1. /proc/sys/net/core - Network core options
@@ -207,3 +207,18 @@ IPX. The /proc/net/ipx_route table holds a list of IPX routes. For each route it gives the destination network, the router node (or Directly) and the network address of the router (or Connected) for internal networks. + +6. TIPC +------------------------------------------------------- + +The TIPC protocol now has a tunable for the receive memory, similar to the +tcp_rmem - i.e. a vector of 3 INTEGERs: (min, default, max) + + # cat /proc/sys/net/tipc/tipc_rmem + 4252725 34021800 68043600 + # + +The max value is set to CONN_OVERLOAD_LIMIT, and the default and min values +are scaled (shifted) versions of that same value. Note that the min value +is not at this point in time used in any meaningful way, but the triplet is +preserved in order to be consistent with things like tcp_rmem.
net/tipc/Makefile +1 -0
@@ -11,3 +11,4 @@ tipc-y += addr.o bcast.o bearer.o config.o \ socket.o log.o eth_media.o tipc-$(CONFIG_TIPC_MEDIA_IB) += ib_media.o +tipc-$(CONFIG_SYSCTL) += sysctl.o
net/tipc/core.c +10 -2
@@ -39,6 +39,7 @@#include "name_table.h" #include "subscr.h" #include "config.h" +#include "port.h" #include <linux/module.h>
@@ -50,7 +51,7 @@ u32 tipc_own_addr __read_mostly;int tipc_max_ports__read_mostly ;int tipc_net_id__read_mostly ;int tipc_remote_management__read_mostly ; - +int sysctl_tipc_rmem[3 ]__read_mostly ;/* min/default/max */ /** * tipc_buf_acquire - creates a TIPC message buffer
@@ -118,6 +119,7 @@ static void tipc_core_stop(void)tipc_nametbl_stop ();tipc_ref_table_stop ();tipc_socket_stop (); +tipc_unregister_sysctl (); }/**
@@ -142,13 +144,14 @@ static int tipc_core_start(void) res =tipc_netlink_start ();if (!res) res =tipc_socket_init (); +if (!res) + res =tipc_register_sysctl ();if (res)tipc_core_stop ();return res; } -static int __init tipc_init (void ) {int res;
@@ -160,6 +163,11 @@ static int __init tipc_init(void) tipc_max_ports =CONFIG_TIPC_PORTS ; tipc_net_id =4711 ; + sysctl_tipc_rmem[0 ] =CONN_OVERLOAD_LIMIT >>4 <<TIPC_LOW_IMPORTANCE ; + sysctl_tipc_rmem[1 ] =CONN_OVERLOAD_LIMIT >>4 << +TIPC_CRITICAL_IMPORTANCE ; + sysctl_tipc_rmem[2 ] =CONN_OVERLOAD_LIMIT ; + res =tipc_core_start ();if (res)pr_err ("Unable to start in single node mode\n" );
net/tipc/core.h +9 -0
@@ -80,6 +80,7 @@ extern u32 tipc_own_addr __read_mostly;extern int tipc_max_ports__read_mostly ;extern int tipc_net_id__read_mostly ;extern int tipc_remote_management__read_mostly ; +extern int sysctl_tipc_rmem[3 ]__read_mostly ;/* * Other global variables
@@ -97,6 +98,14 @@ extern void tipc_netlink_stop(void);extern int tipc_socket_init (void );extern void tipc_socket_stop (void ); +#ifdef CONFIG_SYSCTL +extern int tipc_register_sysctl (void ); +extern void tipc_unregister_sysctl (void ); +#else +#define tipc_register_sysctl () 0 +#define tipc_unregister_sysctl () +#endif +/* * TIPC timer and signal code */
net/tipc/port.h +2 -0
@@ -43,6 +43,8 @@#include "node_subscr.h" #define TIPC_FLOW_CONTROL_WIN 512 +#define CONN_OVERLOAD_LIMIT ((TIPC_FLOW_CONTROL_WIN * 2 + 1) * \ + SKB_TRUESIZE(TIPC_MAX_USER_MSG_SIZE)) typedef void (*tipc_msg_err_event) (void *usr_handle, u32 portref, struct sk_buff **buf, unsigned char const *data,
net/tipc/socket.c +10 -9
@@ -43,8 +43,6 @@#define SS_LISTENING -1/* socket is listening */ #define SS_READY -2/* socket is connectionless */ -#define CONN_OVERLOAD_LIMIT ((TIPC_FLOW_CONTROL_WIN * 2 + 1) * \ - SKB_TRUESIZE(TIPC_MAX_USER_MSG_SIZE))#define CONN_TIMEOUT_DEFAULT 8000/* default connect timeout = 8s */ struct tipc_sock {
@@ -203,6 +201,7 @@ static int tipc_create(struct net *net, struct socket *sock, int protocol,sock_init_data (sock, sk); sk->sk_backlog_rcv = backlog_rcv; + sk->sk_rcvbuf = sysctl_tipc_rmem[1 ]; sk->sk_data_ready = tipc_data_ready; sk->sk_write_space = tipc_write_space;tipc_sk (sk)->p = tp_ptr;
@@ -1233,10 +1232,10 @@ static u32 filter_connect(struct tipc_sock *tsock, struct sk_buff **buf)* For all connectionless messages, by default new queue limits are * as belows: * -* TIPC_LOW_IMPORTANCE (5MB) -* TIPC_MEDIUM_IMPORTANCE (10MB) -* TIPC_HIGH_IMPORTANCE (20MB) -* TIPC_CRITICAL_IMPORTANCE (40MB) +* TIPC_LOW_IMPORTANCE (4 MB) +* TIPC_MEDIUM_IMPORTANCE (8 MB) +* TIPC_HIGH_IMPORTANCE (16 MB) +* TIPC_CRITICAL_IMPORTANCE (32 MB) * * Returns overload limit according to corresponding message importance */
@@ -1246,9 +1245,10 @@ static unsigned int rcvbuf_limit(struct sock *sk, struct sk_buff *buf)unsigned int limit;if (msg_connected (msg)) - limit =CONN_OVERLOAD_LIMIT ; + limit = sysctl_tipc_rmem[2 ];else - limit = sk->sk_rcvbuf << (msg_importance (msg) +5 ); + limit = sk->sk_rcvbuf >>TIPC_CRITICAL_IMPORTANCE << +msg_importance (msg);return limit; }
@@ -1847,7 +1847,8 @@ static const struct net_proto_family tipc_family_ops = {static struct proto tipc_proto = { .name ="TIPC" , .owner =THIS_MODULE , - .obj_size =sizeof (struct tipc_sock ) + .obj_size =sizeof (struct tipc_sock ), + .sysctl_rmem = sysctl_tipc_rmem };/**
net/tipc/sysctl.c new file +64 -0
64 lines not on this page · raw message
Signature · 1 line
1.8.1.2
Re: [PATCH net-next 02/16] tipc: change socket buffer overflow control to respect sk_rcvbuf
Quoted 21 lines · Paul Gortmaker
From: Ying Xue <[email protected]>
As per feedback from the netdev community, we change the buffer overflow protection algorithm in receiving sockets so that it always respects the nominal upper limit set in
sk_rcvbuf.Instead of scaling up from a small
sk_rcvbufvalue, which leads to violation of the configuredsk_rcvbuflimit, we now calculate the weighted per-message limit by scaling down from a much bigger value, still in the same field, according to the importance priority of the received message.To allow for administrative tunability of the socket receive buffer size, we create a
tipc_rmemsysctl variable to allow the user to configure an even bigger value via sysctl command. It is a size of three (min/default/max) to be consistent with things liketcp_rmem.By default, the value initialized in tipc_rmem[1] is equal to the receive socket size needed by a
TIPC_CRITICAL_IMPORTANCEmessage. This value is also set as the default value ofsk_rcvbuf.
Quoted 8 lines
Originally-by Jon Maloy <[email protected]>Cc Neil Horman <[email protected]>Cc Jon Maloy <[email protected]>[Ying: added sysctl variation to Jon's original patch]Signed-off-by Ying Xue <[email protected]>[PG: don't compile sysctl.c if not config'd; add Documentation]Signed-off-by Paul Gortmaker <[email protected]>---
I know dave has already applied it, but FWIW
Thanks Paul, I think this makes sense as a method to properly manage our rx socket buffer size.
Neil
Quoted 281 lines
Documentation/sysctl/net.txt | 17 +++++++++++- net/tipc/Makefile | 1 + net/tipc/core.c | 12 +++++++-- net/tipc/core.h | 9 +++++++ net/tipc/port.h | 2 ++ net/tipc/socket.c | 19 ++++++------- net/tipc/sysctl.c | 64 ++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 112 insertions(+), 12 deletions(-) create mode 100644 net/tipc/sysctl.cDocumentation/sysctl/net.txt +16
-1@@ -26,7 +26,7 @@ Table : Subdirectories in /proc/sys/net ipv4 IP version 4 x25 X.25 protocol ipx IPX token-ring IBM token ring bridge Bridging decnet DEC net - ipv6 IP version 6 + ipv6 IP version 6 tipc TIPC 1. /proc/sys/net/core - Network core options@@ -207,3 +207,18 @@ IPX. The /proc/net/ipx_route table holds a list of IPX routes. For each route it gives the destination network, the router node (or Directly) and the network address of the router (or Connected) for internal networks. + +6. TIPC +------------------------------------------------------- + +The TIPC protocol now has a tunable for the receive memory, similar to the +tcp_rmem - i.e. a vector of 3 INTEGERs: (min, default, max) + + # cat /proc/sys/net/tipc/tipc_rmem + 4252725 34021800 68043600 + # + +The max value is set to CONN_OVERLOAD_LIMIT, and the default and min values +are scaled (shifted) versions of that same value. Note that the min value +is not at this point in time used in any meaningful way, but the triplet is +preserved in order to be consistent with things like tcp_rmem.net/tipc/Makefile +1
-0@@ -11,3 +11,4 @@ tipc-y += addr.o bcast.o bearer.o config.o \ socket.o log.o eth_media.o tipc-$(CONFIG_TIPC_MEDIA_IB) += ib_media.o +tipc-$(CONFIG_SYSCTL) += sysctl.onet/tipc/core.c +10
-2@@ -39,6 +39,7 @@#include "name_table.h" #include "subscr.h" #include "config.h" +#include "port.h" #include <linux/module.h> @@ -50,7 +51,7 @@ u32 tipc_own_addr __read_mostly;int tipc_max_ports__read_mostly ;int tipc_net_id__read_mostly ;int tipc_remote_management__read_mostly ; - +int sysctl_tipc_rmem[3 ]__read_mostly ;/* min/default/max */ /** * tipc_buf_acquire - creates a TIPC message buffer @@ -118,6 +119,7 @@ static void tipc_core_stop(void)tipc_nametbl_stop ();tipc_ref_table_stop ();tipc_socket_stop (); +tipc_unregister_sysctl (); }/** @@ -142,13 +144,14 @@ static int tipc_core_start(void) res =tipc_netlink_start ();if (!res) res =tipc_socket_init (); +if (!res) + res =tipc_register_sysctl ();if (res)tipc_core_stop ();return res; } -static int __init tipc_init (void ) {int res;@@ -160,6 +163,11 @@ static int __init tipc_init(void) tipc_max_ports =CONFIG_TIPC_PORTS ; tipc_net_id =4711 ; + sysctl_tipc_rmem[0 ] =CONN_OVERLOAD_LIMIT >>4 <<TIPC_LOW_IMPORTANCE ; + sysctl_tipc_rmem[1 ] =CONN_OVERLOAD_LIMIT >>4 << +TIPC_CRITICAL_IMPORTANCE ; + sysctl_tipc_rmem[2 ] =CONN_OVERLOAD_LIMIT ; + res =tipc_core_start ();if (res)pr_err ("Unable to start in single node mode\n" );net/tipc/core.h +9
-0@@ -80,6 +80,7 @@ extern u32 tipc_own_addr __read_mostly;extern int tipc_max_ports__read_mostly ;extern int tipc_net_id__read_mostly ;extern int tipc_remote_management__read_mostly ; +extern int sysctl_tipc_rmem[3 ]__read_mostly ;/* * Other global variables @@ -97,6 +98,14 @@ extern void tipc_netlink_stop(void);extern int tipc_socket_init (void );extern void tipc_socket_stop (void ); +#ifdef CONFIG_SYSCTL +extern int tipc_register_sysctl (void ); +extern void tipc_unregister_sysctl (void ); +#else +#define tipc_register_sysctl () 0 +#define tipc_unregister_sysctl () +#endif +/* * TIPC timer and signal code */ net/tipc/port.h +2
-0@@ -43,6 +43,8 @@#include "node_subscr.h" #define TIPC_FLOW_CONTROL_WIN 512 +#define CONN_OVERLOAD_LIMIT ((TIPC_FLOW_CONTROL_WIN * 2 + 1) * \ + SKB_TRUESIZE(TIPC_MAX_USER_MSG_SIZE)) typedef void (*tipc_msg_err_event) (void *usr_handle, u32 portref, struct sk_buff **buf, unsigned char const *data,net/tipc/socket.c +10
-9@@ -43,8 +43,6 @@#define SS_LISTENING -1/* socket is listening */ #define SS_READY -2/* socket is connectionless */ -#define CONN_OVERLOAD_LIMIT ((TIPC_FLOW_CONTROL_WIN * 2 + 1) * \ - SKB_TRUESIZE(TIPC_MAX_USER_MSG_SIZE))#define CONN_TIMEOUT_DEFAULT 8000/* default connect timeout = 8s */ struct tipc_sock {@@ -203,6 +201,7 @@ static int tipc_create(struct net *net, struct socket *sock, int protocol,sock_init_data (sock, sk); sk->sk_backlog_rcv = backlog_rcv; + sk->sk_rcvbuf = sysctl_tipc_rmem[1 ]; sk->sk_data_ready = tipc_data_ready; sk->sk_write_space = tipc_write_space;tipc_sk (sk)->p = tp_ptr;@@ -1233,10 +1232,10 @@ static u32 filter_connect(struct tipc_sock *tsock, struct sk_buff **buf)* For all connectionless messages, by default new queue limits are * as belows: * -* TIPC_LOW_IMPORTANCE (5MB) -* TIPC_MEDIUM_IMPORTANCE (10MB) -* TIPC_HIGH_IMPORTANCE (20MB) -* TIPC_CRITICAL_IMPORTANCE (40MB) +* TIPC_LOW_IMPORTANCE (4 MB) +* TIPC_MEDIUM_IMPORTANCE (8 MB) +* TIPC_HIGH_IMPORTANCE (16 MB) +* TIPC_CRITICAL_IMPORTANCE (32 MB) * * Returns overload limit according to corresponding message importance */ @@ -1246,9 +1245,10 @@ static unsigned int rcvbuf_limit(struct sock *sk, struct sk_buff *buf)unsigned int limit;if (msg_connected (msg)) - limit =CONN_OVERLOAD_LIMIT ; + limit = sysctl_tipc_rmem[2 ];else - limit = sk->sk_rcvbuf << (msg_importance (msg) +5 ); + limit = sk->sk_rcvbuf >>TIPC_CRITICAL_IMPORTANCE << +msg_importance (msg);return limit; }@@ -1847,7 +1847,8 @@ static const struct net_proto_family tipc_family_ops = {static struct proto tipc_proto = { .name ="TIPC" , .owner =THIS_MODULE , - .obj_size =sizeof (struct tipc_sock ) + .obj_size =sizeof (struct tipc_sock ), + .sysctl_rmem = sysctl_tipc_rmem };/** net/tipc/sysctl.c new file +64
-0@@ -0,0 +1,64 @@ +/* +* net/tipc/sysctl.c: sysctl interface to TIPC subsystem +* +* Copyright (c) 2013, Wind River Systems +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* 1. Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* 2. Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* 3. Neither the names of the copyright holders nor the names of its +* contributors may be used to endorse or promote products derived from +* this software without specific prior written permission. +* +* Alternatively, this software may be distributed under the terms of the +* GNU General Public License ("GPL") version 2 as published by the Free +* Software Foundation. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "core.h" + +#include <linux/sysctl.h> + +static struct ctl_table_header *tipc_ctl_hdr; + +static struct ctl_table tipc_table[] = { + { + .procname ="tipc_rmem" , + .data = &sysctl_tipc_rmem, + .maxlen =sizeof (sysctl_tipc_rmem), + .mode =0644 , + .proc_handler = proc_dointvec, + }, + {} +}; + +int tipc_register_sysctl (void ) +{ + tipc_ctl_hdr =register_net_sysctl (&init_net,"net/tipc" , tipc_table); +if (tipc_ctl_hdr ==NULL ) +return -ENOMEM ; +return 0 ; +} + +void tipc_unregister_sysctl (void ) +{ +unregister_net_sysctl_table (tipc_ctl_hdr); +}Signature · 1 line
1.8.1.2
PATCH v2 3/16 tipc: allow implicit connect for stream sockets
In reply to Paul GortmakerFrom: Erik Hugne <[email protected]>
TIPC's implied connect feature, aka piggyback connect, allows applications to save one syscall and all SYN/SYN-ACK signalling overhead when setting up a connection. Until now, this has only been supported for SEQPACKET sockets. Here, we make it possible to use this feature even with stream sockets.
At the connecting side, the connection is completed when the first data message arrives from the accepting peer. This means that we must allow the connecting user to call blocking recv() before the socket has reached state SS_CONNECTED. So we must must relax the state machine check at recv_stream(), and allow the recv() call even if socket is in state SS_CONNECTING.
--- net/tipc/socket.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
net/tipc/socket.c +2 -4
@@ -518,8 +518,7 @@ static int send_msg(struct kiocb *iocb, struct socket *sock, res = -EISCONN ; goto exit; } -if ((tport->published) || - ((sock->type ==SOCK_STREAM ) && (total_len !=0 ))) { +if (tport->published) { res = -EOPNOTSUPP ; goto exit; }
@@ -1010,8 +1009,7 @@ static int recv_stream(struct kiocb *iocb, struct socket *sock,lock_sock (sk); -if (unlikely ((sock->state ==SS_UNCONNECTED ) || - (sock->state ==SS_CONNECTING ))) { +if (unlikely ((sock->state ==SS_UNCONNECTED ))) { res = -ENOTCONN ; goto exit; }
Signature · 1 line
1.8.1.2
PATCH v2 4/16 tipc: introduce new TIPC server infrastructure
In reply to Paul GortmakerFrom: Ying Xue <[email protected]>
TIPC has two internal servers, one providing a subscription service for topology events, and another providing the configuration interface. These servers have previously been running in BH context, accessing the TIPC-port (aka native) API directly. Apart from these servers, even the TIPC socket implementation is partially built on this API.
As this API may simultaneously be called via different paths and in different contexts, a complex and costly lock policiy is required in order to protect TIPC internal resources.
To eliminate the need for this complex lock policiy, we introduce a new, generic service API that uses kernel sockets for message passing instead of the native API. Once the toplogy and configuration servers are converted to use this new service, all code pertaining to the native API can be removed. This entails a significant reduction in code amount and complexity, and opens up for a complete rework of the locking policy in TIPC.
The new service also solves another problem:
As the current topology server works in BH context, it cannot easily be blocked when sending of events fails due to congestion. In such cases events may have to be silently dropped, something that is unacceptable. Therefore, the new service keeps a dedicated outbound queue receiving messages from BH context. Once messages are inserted into this queue, we will immediately schedule a work from a special workqueue. This way, messages/events from the topology server are in reality sent in process context, and the server can block if necessary.
Analogously, there is a new workqueue for receiving messages. Once a notification about an arriving message is received in BH context, we schedule a work from the receive workqueue to do the job of receiving the message in process context.
As both sending and receive messages are now finished in processes, subscribed events cannot be dropped any more.
As of this commit, this new server infrastructure is built, but not actually yet called by the existing TIPC code, but since the conversion changes required in order to use it are significant, the addition is kept here as a separate commit.
--- net/tipc/Makefile | 2 +- net/tipc/core.h | 8 +- net/tipc/server.c | 596 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ net/tipc/server.h | 94 +++++++++ net/tipc/socket.c | 99 ++++++++- 5 files changed, 789 insertions(+), 10 deletions(-) create mode 100644 net/tipc/server.c create mode 100644 net/tipc/server.h
net/tipc/Makefile +1 -1
@@ -8,7 +8,7 @@ tipc-y += addr.o bcast.o bearer.o config.o \ core.o handler.o link.o discover.o msg.o \ name_distr.o subscr.o name_table.o net.o \ netlink.o node.o node_subscr.o port.o ref.o \ - socket.o log.o eth_media.o + socket.o log.o eth_media.o server.o tipc-$(CONFIG_TIPC_MEDIA_IB) += ib_media.o tipc-$(CONFIG_SYSCTL) += sysctl.o
net/tipc/core.h +6 -2
@@ -1,8 +1,8 @@/* * net/tipc/core.h: Include file for TIPC global declarations * -* Copyright (c) 2005-2006, Ericsson AB -* Copyright (c) 2005-2007, 2010-2011, Wind River Systems +* Copyright (c) 2005-2006, 2013 Ericsson AB +* Copyright (c) 2005-2007, 2010-2013, Wind River Systems * All rights reserved. * * Redistribution and use in source and binary forms, with or without
@@ -97,6 +97,10 @@ extern int tipc_netlink_start(void);extern void tipc_netlink_stop (void );extern int tipc_socket_init (void );extern void tipc_socket_stop (void ); +extern int tipc_sock_create_local (int type,struct socket **res); +extern void tipc_sock_release_local (struct socket *sock); +extern int tipc_sock_accept_local (struct socket *sock, +struct socket **newsock,int flags);#ifdef CONFIG_SYSCTL extern int tipc_register_sysctl (void );
net/tipc/server.c new file +596 -0
596 lines not on this page · raw message
net/tipc/server.h new file +94 -0
94 lines not on this page · raw message
net/tipc/socket.c +92 -7
159 lines not on this page · raw message
Signature · 1 line
1.8.1.2
PATCH v2 5/16 tipc: convert topology server to use new server facility
In reply to Paul GortmakerFrom: Ying Xue <[email protected]>
As the new TIPC server infrastructure has been introduced, we can now convert the TIPC topology server to it. We get two benefits from doing this:
1) It simplifies the topology server locking policy. In the original locking policy, we placed one spin lock pointer in the tipc_subscriber structure to reuse the lock of the subscriber's server port, controlling access to members of tipc_subscriber instance. That is, we only used one lock to ensure both tipc_port and tipc_subscriber members were safely accessed.
Now we introduce another spin lock for tipc_subscriber structure only protecting themselves, to get a finer granularity locking policy. Moreover, the change will allow us to make the topology server code more readable and maintainable.
2) It fixes a bug where sent subscription events may be lost when the topology port is congested. Using the new service, the topology server now queues sent events into an outgoing buffer, and then wakes up a sender process which has been blocked in workqueue context. The process will keep picking events from the buffer and send them to their respective subscribers, using the kernel socket interface, until the buffer is empty. Even if the socket is congested during transmission there is no risk that events may be dropped, since the sender process may block when needed.
Some minor reordering of initialization is done, since we now have a scenario where the topology server must be started after socket initialization has taken place, as the former depends on the latter. And overall, we see a simplification of the TIPC subscriber code in making this changeover.
--- net/tipc/core.c | 6 +- net/tipc/socket.c | 3 +- net/tipc/subscr.c | 334 +++++++++++++++--------------------------------------- net/tipc/subscr.h | 8 +- 4 files changed, 104 insertions(+), 247 deletions(-)
net/tipc/core.c +3 -3
@@ -2,7 +2,7 @@* net/tipc/core.c: TIPC module code * * Copyright (c) 2003-2006, Ericsson AB -* Copyright (c) 2005-2006, 2010-2011, Wind River Systems +* Copyright (c) 2005-2006, 2010-2013, Wind River Systems * All rights reserved. * * Redistribution and use in source and binary forms, with or without
@@ -137,8 +137,6 @@ static int tipc_core_start(void)if (!res) res =tipc_nametbl_init ();if (!res) - res =tipc_subscr_start (); -if (!res) res =tipc_cfg_init ();if (!res) res =tipc_netlink_start ();
@@ -146,6 +144,8 @@ static int tipc_core_start(void) res =tipc_socket_init ();if (!res) res =tipc_register_sysctl (); +if (!res) + res =tipc_subscr_start ();if (res)tipc_core_stop ();
net/tipc/socket.c +2 -1
@@ -402,7 +402,8 @@ static int bind(struct socket *sock, struct sockaddr *uaddr, int uaddr_len)else if (addr->addrtype !=TIPC_ADDR_NAMESEQ )return -EAFNOSUPPORT ; -if (addr->addr.nameseq.type <TIPC_RESERVED_TYPES ) +if ((addr->addr.nameseq.type <TIPC_RESERVED_TYPES ) && + (addr->addr.nameseq.type !=TIPC_TOP_SRV ))return -EACCES ; return (addr->scope > 0) ?
net/tipc/subscr.c +93 -241
490 lines not on this page · raw message
net/tipc/subscr.h +6 -2
@@ -2,7 +2,7 @@* net/tipc/subscr.h: Include file for TIPC network topology service * * Copyright (c) 2003-2006, Ericsson AB -* Copyright (c) 2005-2007, Wind River Systems +* Copyright (c) 2005-2007, 2012-2013, Wind River Systems * All rights reserved. * * Redistribution and use in source and binary forms, with or without
@@ -37,10 +37,14 @@#ifndef _TIPC_SUBSCR_H#define _TIPC_SUBSCR_H +#include "server.h" +struct tipc_subscription ; +struct tipc_subscriber ;/** * struct tipc_subscription - TIPC network topology subscription object +* @subscriber: pointer to its subscriber * @seq: name sequence associated with subscription * @timeout: duration of subscription (in ms) * @filter: event filtering to be done for subscription
@@ -52,13 +56,13 @@ struct tipc_subscription;* @evt: template for events generated by subscription */ struct tipc_subscription { +struct tipc_subscriber *subscriber;struct tipc_name_seq seq;u32 timeout;u32 filter;struct timer_list timer;struct list_head nameseq_list;struct list_head subscription_list; -u32 server_ref;int swap;struct tipc_event evt; };
Signature · 1 line
1.8.1.2
PATCH v2 6/16 tipc: convert configuration server to use new server facility
In reply to Paul GortmakerFrom: Ying Xue <[email protected]>
As the new socket-based TIPC server infrastructure has been introduced, we can now convert the configuration server to use it. Then we can take future steps to simplify the configuration server locking policy.
Some minor reordering of initialization is done, due to the dependency on having tipc_socket_init completed.
--- net/tipc/config.c | 102 ++++++++++++++++++++++++------------------------------ net/tipc/core.c | 4 +-- net/tipc/socket.c | 3 +- 3 files changed, 49 insertions(+), 60 deletions(-)
net/tipc/config.c +45 -57
@@ -2,7 +2,7 @@* net/tipc/config.c: TIPC configuration management code * * Copyright (c) 2002-2006, Ericsson AB -* Copyright (c) 2004-2007, 2010-2012, Wind River Systems +* Copyright (c) 2004-2007, 2010-2013, Wind River Systems * All rights reserved. * * Redistribution and use in source and binary forms, with or without
@@ -38,12 +38,12 @@#include "port.h" #include "name_table.h" #include "config.h" +#include "server.h" #define REPLY_TRUNCATED "<truncated>\n" -static u32 config_port_ref; -static DEFINE_SPINLOCK (config_lock); +static struct tipc_server cfgsrv;static const void *req_tlv_area;/* request message TLV area */ static int req_tlv_space;/* request message TLV area size */
@@ -381,33 +381,27 @@ exit:return rep_tlv_buf; } -static void cfg_named_msg_event (void *userdata, -u32 port_ref, -struct sk_buff **buf, -const unchar *msg, -u32 size, -u32 importance, -struct tipc_portid const *orig, -struct tipc_name_seq const *dest) +static void cfg_conn_msg_event (int conid,struct sockaddr_tipc *addr, +void *usr_data,void *buf,size_t len) {struct tipc_cfg_msg_hdr *req_hdr;struct tipc_cfg_msg_hdr *rep_hdr;struct sk_buff *rep_buf; +int ret;/* Validate configuration message header (ignore invalid message) */ - req_hdr = (struct tipc_cfg_msg_hdr *)msg; -if ((size <sizeof (*req_hdr)) || - (size !=TCM_ALIGN (ntohl (req_hdr->tcm_len))) || + req_hdr = (struct tipc_cfg_msg_hdr *)buf; +if ((len <sizeof (*req_hdr)) || + (len !=TCM_ALIGN (ntohl (req_hdr->tcm_len))) || (ntohs (req_hdr->tcm_flags) !=TCM_F_REQUEST )) {pr_warn ("Invalid configuration message discarded\n" );return ; }/* Generate reply for request (if can't, return request) */ - rep_buf =tipc_cfg_do_cmd (orig->node, -ntohs (req_hdr->tcm_type), - msg +sizeof (*req_hdr), - size -sizeof (*req_hdr), + rep_buf =tipc_cfg_do_cmd (addr->addr.id.node,ntohs (req_hdr->tcm_type), + buf +sizeof (*req_hdr), + len -sizeof (*req_hdr),BUF_HEADROOM +MAX_H_SIZE +sizeof (*rep_hdr));if (rep_buf) {skb_push (rep_buf,sizeof (*rep_hdr));
@@ -415,57 +409,51 @@ static void cfg_named_msg_event(void *userdata,memcpy (rep_hdr, req_hdr,sizeof (*rep_hdr)); rep_hdr->tcm_len =htonl (rep_buf->len); rep_hdr->tcm_flags &=htons (~TCM_F_REQUEST ); - }else { - rep_buf = *buf; - *buf =NULL ; - } -/* NEED TO ADD CODE TO HANDLE FAILED SEND (SUCH AS CONGESTION) */ -tipc_send_buf2port (port_ref, orig, rep_buf, rep_buf->len); + ret =tipc_conn_sendmsg (&cfgsrv, conid, addr, rep_buf->data, + rep_buf->len); +if (ret <0 ) +pr_err ("Sending cfg reply message failed, no memory\n" ); + +kfree_skb (rep_buf); + } } +static struct sockaddr_tipc cfgsrv_addr__read_mostly = { + .family =AF_TIPC , + .addrtype =TIPC_ADDR_NAMESEQ , + .addr.nameseq.type =TIPC_CFG_SRV , + .addr.nameseq.lower =0 , + .addr.nameseq.upper =0 , + .scope =TIPC_ZONE_SCOPE +}; + +static struct tipc_server cfgsrv__read_mostly = { + .saddr = &cfgsrv_addr, + .imp =TIPC_CRITICAL_IMPORTANCE , + .type =SOCK_RDM , + .max_rcvbuf_size =64 *1024 , + .name ="cfg_server" , + .tipc_conn_recvmsg = cfg_conn_msg_event, + .tipc_conn_new =NULL , + .tipc_conn_shutdown =NULL +}; +int tipc_cfg_init (void ) { -struct tipc_name_seq seq; -int res; - - res =tipc_createport (NULL ,TIPC_CRITICAL_IMPORTANCE , -NULL ,NULL ,NULL , -NULL , cfg_named_msg_event,NULL , -NULL , &config_port_ref); -if (res) - goto failed; - - seq.type =TIPC_CFG_SRV ; - seq.lower = seq.upper = tipc_own_addr; - res =tipc_publish (config_port_ref,TIPC_ZONE_SCOPE , &seq); -if (res) - goto failed; - -return 0 ; - -failed: -pr_err ("Unable to create configuration service\n" ); -return res; +return tipc_server_start (&cfgsrv); }void tipc_cfg_reinit (void ) { -struct tipc_name_seq seq; -int res; - - seq.type =TIPC_CFG_SRV ; - seq.lower = seq.upper =0 ; -tipc_withdraw (config_port_ref,TIPC_ZONE_SCOPE , &seq); +tipc_server_stop (&cfgsrv); - seq.lower = seq.upper = tipc_own_addr; - res =tipc_publish (config_port_ref,TIPC_ZONE_SCOPE , &seq); -if (res) -pr_err ("Unable to reinitialize configuration service\n" ); + cfgsrv_addr.addr.nameseq.lower = tipc_own_addr; + cfgsrv_addr.addr.nameseq.upper = tipc_own_addr; +tipc_server_start (&cfgsrv); }void tipc_cfg_stop (void ) { -tipc_deleteport (config_port_ref); - config_port_ref =0 ; +tipc_server_stop (&cfgsrv); }
net/tipc/core.c +2 -2
@@ -137,8 +137,6 @@ static int tipc_core_start(void)if (!res) res =tipc_nametbl_init ();if (!res) - res =tipc_cfg_init (); -if (!res) res =tipc_netlink_start ();if (!res) res =tipc_socket_init ();
@@ -146,6 +144,8 @@ static int tipc_core_start(void) res =tipc_register_sysctl ();if (!res) res =tipc_subscr_start (); +if (!res) + res =tipc_cfg_init ();if (res)tipc_core_stop ();
net/tipc/socket.c +2 -1
@@ -403,7 +403,8 @@ static int bind(struct socket *sock, struct sockaddr *uaddr, int uaddr_len)return -EAFNOSUPPORT ;if ((addr->addr.nameseq.type <TIPC_RESERVED_TYPES ) && - (addr->addr.nameseq.type !=TIPC_TOP_SRV )) + (addr->addr.nameseq.type !=TIPC_TOP_SRV ) && + (addr->addr.nameseq.type !=TIPC_CFG_SRV ))return -EACCES ; return (addr->scope > 0) ?
Signature · 1 line
1.8.1.2
PATCH v2 7/16 tipc: delete code orphaned by new server infrastructure
In reply to Paul GortmakerFrom: Ying Xue <[email protected]>
Having completed the conversion of the topology server and configuration server to use the new server infrastructure, the following functions become unused, and can be deleted:
- tipc_createport()
- port_wakeup_sh()
- port_dispatcher()
- port_dispatcher_sigh()
- tipc_send_buf_fast()
- tipc_send_buf2port
Additionally, the following variables become orphaned, and can be deleted:
- tipc_msg_err_event
- tipc_named_msg_err_event
- tipc_conn_shutdown_event
- tipc_msg_event
- tipc_named_msg_event
- tipc_conn_msg_event
- tipc_continue_event
- msg_queue_head
- msg_queue_tail
- queue_lock
Deletion is done here in a separate commit in order to allow the actual conversion changes to be more easily viewed.
--- net/tipc/link.c | 36 +------ net/tipc/port.c | 299 +------------------------------------------------------- net/tipc/port.h | 53 +--------- 3 files changed, 3 insertions(+), 385 deletions(-)
net/tipc/link.c +1 -35
@@ -2,7 +2,7 @@* net/tipc/link.c: TIPC link code * * Copyright (c) 1996-2007, 2012, Ericsson AB -* Copyright (c) 2004-2007, 2010-2011, Wind River Systems +* Copyright (c) 2004-2007, 2010-2013, Wind River Systems * All rights reserved. * * Redistribution and use in source and binary forms, with or without
@@ -1057,40 +1057,6 @@ static int link_send_buf_fast(struct tipc_link *l_ptr, struct sk_buff *buf, }/* -* tipc_send_buf_fast: Entry for data messages where the -* destination node is known and the header is complete, -* inclusive total message length. -* Returns user data length. -*/ -int tipc_send_buf_fast (struct sk_buff *buf,u32 destnode) -{ -struct tipc_link *l_ptr; -struct tipc_node *n_ptr; -int res; -u32 selector =msg_origport (buf_msg (buf)) &1 ; -u32 dummy; - -read_lock_bh (&tipc_net_lock); - n_ptr =tipc_node_find (destnode); -if (likely (n_ptr)) { -tipc_node_lock (n_ptr); - l_ptr = n_ptr->active_links[selector]; -if (likely (l_ptr)) { - res =link_send_buf_fast (l_ptr, buf, &dummy); -tipc_node_unlock (n_ptr); -read_unlock_bh (&tipc_net_lock); -return res; - } -tipc_node_unlock (n_ptr); - } -read_unlock_bh (&tipc_net_lock); - res =msg_data_sz (buf_msg (buf)); -tipc_reject_msg (buf,TIPC_ERR_NO_NODE ); -return res; -} - - -/* * tipc_link_send_sections_fast: Entry for messages where the * destination processor is known and the header is complete, * except for total message length.
net/tipc/port.c +1 -298
327 lines not on this page · raw message
net/tipc/port.h +1 -52
85 lines not on this page · raw message
Signature · 1 line
1.8.1.2
PATCH v2 8/16 tipc: remove user_port instance from tipc_port structure
In reply to Paul GortmakerFrom: Ying Xue <[email protected]>
After the native API has been completely removed, the 'user_port' field in struct tipc_port becomes unused, and can be removed. As a consequence, the "usrmem" argument in tipc_msg_build() is no longer needed, and so we remove that one too.
--- net/tipc/link.c | 18 +++++++----------- net/tipc/msg.c | 15 +++++---------- net/tipc/msg.h | 4 ++-- net/tipc/port.c | 8 +++----- net/tipc/port.h | 14 -------------- 5 files changed, 17 insertions(+), 42 deletions(-)
net/tipc/link.c +7 -11
@@ -1081,7 +1081,7 @@ again:* (Must not hold any locks while building message.) */ res =tipc_msg_build (hdr, msg_sect, num_sect, total_len, - sender->max_pkt, !sender->user_port, &buf); + sender->max_pkt, &buf);read_lock_bh (&tipc_net_lock); node =tipc_node_find (destaddr);
@@ -1216,18 +1216,14 @@ again:else sz = fragm_rest; -if (likely (!sender->user_port)) { -if (copy_from_user (buf->data + fragm_crs, sect_crs, sz)) { +if (copy_from_user (buf->data + fragm_crs, sect_crs, sz)) { error: -for (; buf_chain; buf_chain = buf) { - buf = buf_chain->next; -kfree_skb (buf_chain); - } -return -EFAULT ; +for (; buf_chain; buf_chain = buf) { + buf = buf_chain->next; +kfree_skb (buf_chain); } - }else -skb_copy_to_linear_data_offset (buf, fragm_crs, - sect_crs, sz); +return -EFAULT ; + } sect_crs += sz; sect_rest -= sz; fragm_crs += sz;
net/tipc/msg.c +5 -10
@@ -73,8 +73,8 @@ void tipc_msg_init(struct tipc_msg *m, u32 user, u32 type,* Returns message data size or errno */ int tipc_msg_build (struct tipc_msg *hdr,struct iovec const *msg_sect, -u32 num_sect,unsigned int total_len, -int max_size,int usrmem,struct sk_buff **buf) +u32 num_sect,unsigned int total_len,int max_size, +struct sk_buff **buf) {int dsz, sz, hsz, pos, res, cnt;
@@ -92,14 +92,9 @@ int tipc_msg_build(struct tipc_msg *hdr, struct iovec const *msg_sect,return -ENOMEM ;skb_copy_to_linear_data (*buf, hdr, hsz);for (res =1 , cnt =0 ; res && (cnt < num_sect); cnt++) { -if (likely (usrmem)) - res = !copy_from_user ((*buf)->data + pos, - msg_sect[cnt].iov_base, - msg_sect[cnt].iov_len); -else -skb_copy_to_linear_data_offset (*buf, pos, - msg_sect[cnt].iov_base, - msg_sect[cnt].iov_len); +skb_copy_to_linear_data_offset (*buf, pos, + msg_sect[cnt].iov_base, + msg_sect[cnt].iov_len); pos += msg_sect[cnt].iov_len; }if (likely (res))
net/tipc/msg.h +2 -2
@@ -722,6 +722,6 @@ u32 tipc_msg_tot_importance(struct tipc_msg *m);void tipc_msg_init (struct tipc_msg *m,u32 user,u32 type,u32 hsize,u32 destnode);int tipc_msg_build (struct tipc_msg *hdr,struct iovec const *msg_sect, -u32 num_sect,unsigned int total_len, -int max_size,int usrmem,struct sk_buff **buf); +u32 num_sect,unsigned int total_len,int max_size, +struct sk_buff **buf);#endif
net/tipc/port.c +3 -5
@@ -115,7 +115,7 @@ int tipc_multicast(u32 ref, struct tipc_name_seq const *seq,msg_set_nameupper (hdr, seq->upper);msg_set_hdr_sz (hdr,MCAST_H_SIZE ); res =tipc_msg_build (hdr, msg_sect, num_sect, total_len,MAX_MSG_SIZE , - !oport->user_port, &buf); + &buf);if (unlikely (!buf))return res;
@@ -234,7 +234,6 @@ struct tipc_port *tipc_createport_raw(void *usr_handle,INIT_LIST_HEAD (&p_ptr->subscription.nodesub_list); p_ptr->dispatcher = dispatcher; p_ptr->wakeup = wakeup; - p_ptr->user_port =NULL ;k_init_timer (&p_ptr->timer, (Handler )port_timeout, ref);INIT_LIST_HEAD (&p_ptr->publications);INIT_LIST_HEAD (&p_ptr->port_list);
@@ -271,7 +270,6 @@ int tipc_deleteport(u32 ref) buf =port_build_peer_abort_msg (p_ptr,TIPC_ERR_NO_PORT );tipc_nodesub_unsubscribe (&p_ptr->subscription); } -kfree (p_ptr->user_port);spin_lock_bh (&tipc_port_list_lock);list_del (&p_ptr->port_list);
@@ -444,7 +442,7 @@ int tipc_port_reject_sections(struct tipc_port *p_ptr, struct tipc_msg *hdr,int res; res =tipc_msg_build (hdr, msg_sect, num_sect, total_len,MAX_MSG_SIZE , - !p_ptr->user_port, &buf); + &buf);if (!buf)return res;
@@ -927,7 +925,7 @@ static int tipc_port_recv_sections(struct tipc_port *sender, unsigned int num_seint res; res =tipc_msg_build (&sender->phdr, msg_sect, num_sect, total_len, -MAX_MSG_SIZE , !sender->user_port, &buf); +MAX_MSG_SIZE , &buf);if (likely (buf))tipc_port_recv_msg (buf);return res;
net/tipc/port.h +0 -14
@@ -47,18 +47,6 @@ SKB_TRUESIZE(TIPC_MAX_USER_MSG_SIZE))/** -* struct user_port - TIPC user port (used with native API) -* @usr_handle: user-specified field -* @ref: object reference to associated TIPC port -* -* <various callback routines> -*/ -struct user_port { -void *usr_handle; -u32 ref; -}; - -/** * struct tipc_port - TIPC port structure * @usr_handle: pointer to additional user-defined information about port * @lock: pointer to spinlock for controlling access to port
@@ -74,7 +62,6 @@ struct user_port {* @port_list: adjacent ports in TIPC's global list of ports * @dispatcher: ptr to routine which handles received messages * @wakeup: ptr to routine to call when port is no longer congested -* @user_port: ptr to user port associated with port (if any) * @wait_list: adjacent ports in list of ports waiting on link congestion * @waiting_pkts: * @sent: # of non-empty messages sent by port
@@ -101,7 +88,6 @@ struct tipc_port {struct list_head port_list;u32 (*dispatcher)(struct tipc_port *,struct sk_buff *);void (*wakeup)(struct tipc_port *); -struct user_port *user_port;struct list_head wait_list;u32 waiting_pkts;u32 sent;
Signature · 1 line
1.8.1.2
PATCH v2 9/16 tipc: rename tipc_createport_raw to tipc_createport
In reply to Paul GortmakerFrom: Ying Xue <[email protected]>
After the removal of the native API, there is now only one way to to create a TIPC port instance -- the function tipc_createport_raw(). We make it more readable by renaming it to tipc_createport().
--- net/tipc/port.c | 4 ++-- net/tipc/port.h | 2 +- net/tipc/socket.c | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-)
net/tipc/port.c +2 -2
@@ -202,11 +202,11 @@ exit: }/** -* tipc_createport_raw - create a generic TIPC port +* tipc_createport - create a generic TIPC port * * Returns pointer to (locked) TIPC port, or NULL if unable to create it */ -struct tipc_port *tipc_createport_raw (void *usr_handle, +struct tipc_port *tipc_createport (void *usr_handle,u32 (*dispatcher)(struct tipc_port *,struct sk_buff *),void (*wakeup)(struct tipc_port *),const u32 importance)
net/tipc/port.h +1 -1
@@ -106,7 +106,7 @@ struct tipc_port_list;/* * TIPC port manipulation routines */ -struct tipc_port *tipc_createport_raw (void *usr_handle, +struct tipc_port *tipc_createport (void *usr_handle,u32 (*dispatcher)(struct tipc_port *,struct sk_buff *),void (*wakeup)(struct tipc_port *),const u32 importance);
net/tipc/socket.c +2 -2
@@ -195,8 +195,8 @@ static int tipc_sk_create(struct net *net, struct socket *sock, int protocol,return -ENOMEM ;/* Allocate TIPC port for socket to use */ - tp_ptr =tipc_createport_raw (sk, &dispatch, &wakeupdispatch, -TIPC_LOW_IMPORTANCE ); + tp_ptr =tipc_createport (sk, &dispatch, &wakeupdispatch, +TIPC_LOW_IMPORTANCE );if (unlikely (!tp_ptr)) {sk_free (sk);return -ENOMEM ;
Signature · 1 line
1.8.1.2
PATCH v2 10/16 tipc: convert config_lock from spinlock to mutex
In reply to Paul GortmakerFrom: Ying Xue <[email protected]>
As the configuration server is now running under process context, it's unnecessary for us to have a spinlock serializing the TIPC configuration process. Instead, we replace it with a mutex lock, which gives us more freedom. For instance, we can now call pre-emptable functions within the protected area.
--- net/tipc/config.c | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-)
net/tipc/config.c +3 -14
@@ -42,7 +42,7 @@#define REPLY_TRUNCATED "<truncated>\n" -static DEFINE_SPINLOCK (config_lock); +static DEFINE_MUTEX (config_mutex);static struct tipc_server cfgsrv;static const void *req_tlv_area;/* request message TLV area */
@@ -181,18 +181,7 @@ static struct sk_buff *cfg_set_own_addr(void)if (tipc_own_addr)return tipc_cfg_reply_error_string (TIPC_CFG_NOT_SUPPORTED " (cannot change node address once assigned)" ); - -/* -* Must temporarily release configuration spinlock while switching into -* networking mode as it calls tipc_eth_media_start(), which may sleep. -* Releasing the lock is harmless as other locally-issued configuration -* commands won't occur until this one completes, and remotely-issued -* configuration commands can't be received until a local configuration -* command to enable the first bearer is received and processed. -*/ -spin_unlock_bh (&config_lock);tipc_core_start_net (addr); -spin_lock_bh (&config_lock);return tipc_cfg_reply_none (); }
@@ -248,7 +237,7 @@ struct sk_buff *tipc_cfg_do_cmd(u32 orig_node, u16 cmd, const void *request_area {struct sk_buff *rep_tlv_buf; -spin_lock_bh (&config_lock); +mutex_lock (&config_mutex);/* Save request and reply details in a well-known location */ req_tlv_area = request_area;
@@ -377,7 +366,7 @@ struct sk_buff *tipc_cfg_do_cmd(u32 orig_node, u16 cmd, const void *request_area/* Return reply buffer */ exit: -spin_unlock_bh (&config_lock); +mutex_unlock (&config_mutex);return rep_tlv_buf; }
Signature · 1 line
1.8.1.2
PATCH v2 11/16 tipc: save sock structure pointer instead of void pointer to tipc_port
In reply to Paul GortmakerFrom: Ying Xue <[email protected]>
Directly save sock structure pointer instead of void pointer to avoid unnecessary cast conversions.
--- net/tipc/port.c | 4 ++-- net/tipc/port.h | 6 +++--- net/tipc/socket.c | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-)
net/tipc/port.c +2 -2
@@ -206,7 +206,7 @@ exit:* * Returns pointer to (locked) TIPC port, or NULL if unable to create it */ -struct tipc_port *tipc_createport (void *usr_handle, +struct tipc_port *tipc_createport (struct sock *sk,u32 (*dispatcher)(struct tipc_port *,struct sk_buff *),void (*wakeup)(struct tipc_port *),const u32 importance)
@@ -227,7 +227,7 @@ struct tipc_port *tipc_createport(void *usr_handle,return NULL ; } - p_ptr->usr_handle = usr_handle; + p_ptr->sk = sk; p_ptr->max_pkt =MAX_PKT_DEFAULT ; p_ptr->ref = ref;INIT_LIST_HEAD (&p_ptr->wait_list);
net/tipc/port.h +3 -3
@@ -48,7 +48,7 @@/** * struct tipc_port - TIPC port structure -* @usr_handle: pointer to additional user-defined information about port +* @sk: pointer to socket handle * @lock: pointer to spinlock for controlling access to port * @connected: non-zero if port is currently connected to a peer port * @conn_type: TIPC type used when connection was established
@@ -74,7 +74,7 @@* @subscription: "node down" subscription used to terminate failed connections */ struct tipc_port { -void *usr_handle; +struct sock *sk;spinlock_t *lock;int connected;u32 conn_type;
@@ -106,7 +106,7 @@ struct tipc_port_list;/* * TIPC port manipulation routines */ -struct tipc_port *tipc_createport (void *usr_handle, +struct tipc_port *tipc_createport (struct sock *sk,u32 (*dispatcher)(struct tipc_port *,struct sk_buff *),void (*wakeup)(struct tipc_port *),const u32 importance);
net/tipc/socket.c +2 -2
@@ -1406,7 +1406,7 @@ static int backlog_rcv(struct sock *sk, struct sk_buff *buf)*/ static u32 dispatch (struct tipc_port *tport,struct sk_buff *buf) { -struct sock *sk = (struct sock *)tport->usr_handle; +struct sock *sk = tport->sk;u32 res;/*
@@ -1437,7 +1437,7 @@ static u32 dispatch(struct tipc_port *tport, struct sk_buff *buf)*/ static void wakeupdispatch (struct tipc_port *tport) { -struct sock *sk = (struct sock *)tport->usr_handle; +struct sock *sk = tport->sk; sk->sk_write_space (sk); }
Signature · 1 line
1.8.1.2
PATCH v2 12/16 tipc: cosmetic realignment of function arguments
In reply to Paul GortmakerNo runtime code changes here. Just a realign of the function arguments to start where the 1st one was, and fit as many args as can be put in an 80 char line.
--- net/tipc/bcast.c | 3 +-- net/tipc/bcast.h | 3 ++- net/tipc/discover.c | 7 +++---- net/tipc/eth_media.c | 2 +- net/tipc/link.c | 18 +++++++----------- net/tipc/msg.c | 4 ++-- net/tipc/msg.h | 4 ++-- net/tipc/name_table.c | 10 +++++----- net/tipc/name_table.h | 11 ++++++----- net/tipc/node_subscr.c | 2 +- net/tipc/port.c | 7 ++++--- net/tipc/port.h | 10 ++++++---- net/tipc/socket.c | 12 ++++++------ net/tipc/subscr.c | 14 ++++---------- net/tipc/subscr.h | 13 ++++--------- 15 files changed, 54 insertions(+), 66 deletions(-)
net/tipc/bcast.c +1 -2
@@ -578,8 +578,7 @@ u32 tipc_bclink_acks_missing(struct tipc_node *n_ptr)* Returns 0 (packet sent successfully) under all circumstances, * since the broadcast link's pseudo-bearer never blocks */ -static int tipc_bcbearer_send (struct sk_buff *buf, -struct tipc_bearer *unused1, +static int tipc_bcbearer_send (struct sk_buff *buf,struct tipc_bearer *unused1,struct tipc_media_addr *unused2) {int bp_index;
net/tipc/bcast.h +2 -1
@@ -75,7 +75,8 @@ void tipc_nmap_remove(struct tipc_node_map *nm_ptr, u32 node);/** * tipc_nmap_equal - test for equality of node maps */ -static inline int tipc_nmap_equal (struct tipc_node_map *nm_a,struct tipc_node_map *nm_b) +static inline int tipc_nmap_equal (struct tipc_node_map *nm_a, +struct tipc_node_map *nm_b) {return !memcmp (nm_a, nm_b,sizeof (*nm_a)); }
net/tipc/discover.c +3 -4
@@ -70,8 +70,7 @@ struct tipc_link_req {* @dest_domain: network domain of node(s) which should respond to message * @b_ptr: ptr to bearer issuing message */ -static struct sk_buff *tipc_disc_init_msg (u32 type, -u32 dest_domain, +static struct sk_buff *tipc_disc_init_msg (u32 type,u32 dest_domain,struct tipc_bearer *b_ptr) {struct sk_buff *buf =tipc_buf_acquire (INT_H_SIZE );
@@ -346,8 +345,8 @@ exit:* * Returns 0 if successful, otherwise -errno. */ -int tipc_disc_create (struct tipc_bearer *b_ptr, -struct tipc_media_addr *dest,u32 dest_domain) +int tipc_disc_create (struct tipc_bearer *b_ptr,struct tipc_media_addr *dest, +u32 dest_domain) {struct tipc_link_req *req;
net/tipc/eth_media.c +1 -1
@@ -62,7 +62,7 @@ static struct eth_bearer eth_bearers[MAX_ETH_BEARERS];static int eth_started;static int recv_notification (struct notifier_block *nb,unsigned long evt, -void *dv); +void *dv);/* * Network device notifier info */
net/tipc/link.c +7 -11
@@ -771,8 +771,7 @@ static void link_state_event(struct tipc_link *l_ptr, unsigned int event)* link_bundle_buf(): Append contents of a buffer to * the tail of an existing one. */ -static int link_bundle_buf (struct tipc_link *l_ptr, -struct sk_buff *bundler, +static int link_bundle_buf (struct tipc_link *l_ptr,struct sk_buff *bundler,struct sk_buff *buf) {struct tipc_msg *bundler_msg =buf_msg (bundler);
@@ -1064,8 +1063,7 @@ static int link_send_buf_fast(struct tipc_link *l_ptr, struct sk_buff *buf,*/ int tipc_link_send_sections_fast (struct tipc_port *sender,struct iovec const *msg_sect, -const u32 num_sect, -unsigned int total_len, +const u32 num_sect,unsigned int total_len,u32 destaddr) {struct tipc_msg *hdr = &sender->phdr;
@@ -1155,8 +1153,7 @@ exit:*/ static int link_send_sections_long (struct tipc_port *sender,struct iovec const *msg_sect, -u32 num_sect, -unsigned int total_len, +u32 num_sect,unsigned int total_len,u32 destaddr) {struct tipc_link *l_ptr;
@@ -1408,7 +1405,7 @@ static void link_reset_all(unsigned long addr) }static void link_retransmit_failure (struct tipc_link *l_ptr, -struct sk_buff *buf) +struct sk_buff *buf) {struct tipc_msg *msg =buf_msg (buf);
@@ -1863,8 +1860,8 @@ static void link_handle_out_of_seq_msg(struct tipc_link *l_ptr,* Send protocol message to the other endpoint. */ void tipc_link_send_proto_msg (struct tipc_link *l_ptr,u32 msg_typ, -int probe_msg,u32 gap,u32 tolerance, -u32 priority,u32 ack_mtu) +int probe_msg,u32 gap,u32 tolerance, +u32 priority,u32 ack_mtu) {struct sk_buff *buf =NULL ;struct tipc_msg *msg = l_ptr->pmsg;
@@ -2107,8 +2104,7 @@ exit:* another bearer. Owner node is locked. */ static void tipc_link_tunnel (struct tipc_link *l_ptr, -struct tipc_msg *tunnel_hdr, -struct tipc_msg *msg, +struct tipc_msg *tunnel_hdr,struct tipc_msg *msg,u32 selector) {struct tipc_link *tunnel;
net/tipc/msg.c +2 -2
@@ -51,8 +51,8 @@ u32 tipc_msg_tot_importance(struct tipc_msg *m) } -void tipc_msg_init (struct tipc_msg *m,u32 user,u32 type, -u32 hsize,u32 destnode) +void tipc_msg_init (struct tipc_msg *m,u32 user,u32 type,u32 hsize, +u32 destnode) {memset (m,0 , hsize);msg_set_version (m);
net/tipc/msg.h +2 -2
@@ -719,8 +719,8 @@ static inline void msg_set_link_tolerance(struct tipc_msg *m, u32 n) }u32 tipc_msg_tot_importance (struct tipc_msg *m); -void tipc_msg_init (struct tipc_msg *m,u32 user,u32 type, -u32 hsize,u32 destnode); +void tipc_msg_init (struct tipc_msg *m,u32 user,u32 type,u32 hsize, +u32 destnode);int tipc_msg_build (struct tipc_msg *hdr,struct iovec const *msg_sect,u32 num_sect,unsigned int total_len,int max_size,struct sk_buff **buf);
net/tipc/name_table.c +5 -5
@@ -440,7 +440,7 @@ found:* sequence overlapping with the requested sequence */ static void tipc_nameseq_subscribe (struct name_seq *nseq, -struct tipc_subscription *s) +struct tipc_subscription *s) {struct sub_seq *sseq = nseq->sseqs;
@@ -662,7 +662,7 @@ exit:* tipc_nametbl_publish - add name publication to network name tables */ struct publication *tipc_nametbl_publish (u32 type,u32 lower,u32 upper, -u32 scope,u32 port_ref,u32 key) +u32 scope,u32 port_ref,u32 key) {struct publication *publ;
@@ -753,7 +753,7 @@ void tipc_nametbl_unsubscribe(struct tipc_subscription *s)* subseq_list - print specified sub-sequence contents into the given buffer */ static int subseq_list (struct sub_seq *sseq,char *buf,int len,u32 depth, -u32 index) +u32 index) {char portIdStr[27 ];const char *scope_str[] = {"" ," zone" ," cluster" ," node" };
@@ -792,7 +792,7 @@ static int subseq_list(struct sub_seq *sseq, char *buf, int len, u32 depth,* nameseq_list - print specified name sequence contents into the given buffer */ static int nameseq_list (struct name_seq *seq,char *buf,int len,u32 depth, -u32 type,u32 lowbound,u32 upbound,u32 index) +u32 type,u32 lowbound,u32 upbound,u32 index) {struct sub_seq *sseq;char typearea[11 ];
@@ -849,7 +849,7 @@ static int nametbl_header(char *buf, int len, u32 depth)* nametbl_list - print specified name table contents into the given buffer */ static int nametbl_list (char *buf,int len,u32 depth_info, -u32 type,u32 lowbound,u32 upbound) +u32 type,u32 lowbound,u32 upbound) {struct hlist_head *seq_head;struct name_seq *seq;
net/tipc/name_table.h +6 -5
@@ -87,14 +87,15 @@ extern rwlock_t tipc_nametbl_lock;struct sk_buff *tipc_nametbl_get (const void *req_tlv_area,int req_tlv_space);u32 tipc_nametbl_translate (u32 type,u32 instance,u32 *node);int tipc_nametbl_mc_translate (u32 type,u32 lower,u32 upper,u32 limit, -struct tipc_port_list *dports); +struct tipc_port_list *dports);struct publication *tipc_nametbl_publish (u32 type,u32 lower,u32 upper, -u32 scope,u32 port_ref,u32 key); +u32 scope,u32 port_ref,u32 key);int tipc_nametbl_withdraw (u32 type,u32 lower,u32 ref,u32 key);struct publication *tipc_nametbl_insert_publ (u32 type,u32 lower,u32 upper, -u32 scope,u32 node,u32 ref,u32 key); -struct publication *tipc_nametbl_remove_publ (u32 type,u32 lower, -u32 node,u32 ref,u32 key); +u32 scope,u32 node,u32 ref, +u32 key); +struct publication *tipc_nametbl_remove_publ (u32 type,u32 lower,u32 node, +u32 ref,u32 key);void tipc_nametbl_subscribe (struct tipc_subscription *s);void tipc_nametbl_unsubscribe (struct tipc_subscription *s);int tipc_nametbl_init (void );
net/tipc/node_subscr.c +1 -1
@@ -42,7 +42,7 @@* tipc_nodesub_subscribe - create "node down" subscription for specified node */ void tipc_nodesub_subscribe (struct tipc_node_subscr *node_sub,u32 addr, -void *usr_handle,net_ev_handler handle_down) +void *usr_handle,net_ev_handler handle_down) {if (in_own_node (addr)) { node_sub->node =NULL ;
net/tipc/port.c +4 -3
@@ -207,9 +207,10 @@ exit:* Returns pointer to (locked) TIPC port, or NULL if unable to create it */ struct tipc_port *tipc_createport (struct sock *sk, -u32 (*dispatcher)(struct tipc_port *,struct sk_buff *), -void (*wakeup)(struct tipc_port *), -const u32 importance) +u32 (*dispatcher)(struct tipc_port *, +struct sk_buff *), +void (*wakeup)(struct tipc_port *), +const u32 importance) {struct tipc_port *p_ptr;struct tipc_msg *msg;
net/tipc/port.h +6 -4
@@ -107,8 +107,10 @@ struct tipc_port_list;* TIPC port manipulation routines */ struct tipc_port *tipc_createport (struct sock *sk, -u32 (*dispatcher)(struct tipc_port *,struct sk_buff *), -void (*wakeup)(struct tipc_port *),const u32 importance); +u32 (*dispatcher)(struct tipc_port *, +struct sk_buff *), +void (*wakeup)(struct tipc_port *), +const u32 importance);int tipc_reject_msg (struct sk_buff *buf,u32 err);
@@ -126,9 +128,9 @@ int tipc_portunreturnable(u32 portref, unsigned int *isunreturnable);int tipc_set_portunreturnable (u32 portref,unsigned int isunreturnable);int tipc_publish (u32 portref,unsigned int scope, -struct tipc_name_seq const *name_seq); +struct tipc_name_seq const *name_seq);int tipc_withdraw (u32 portref,unsigned int scope, -struct tipc_name_seq const *name_seq); +struct tipc_name_seq const *name_seq);int tipc_connect (u32 portref,struct tipc_portid const *port);
net/tipc/socket.c +6 -6
@@ -278,7 +278,7 @@ void tipc_sock_release_local(struct socket *sock)*/ int tipc_sock_accept_local (struct socket *sock,struct socket **newsock, -int flags) +int flags) {struct sock *sk = sock->sk;int ret;
@@ -889,7 +889,7 @@ static void set_orig_addr(struct msghdr *m, struct tipc_msg *msg)* Returns 0 if successful, otherwise errno */ static int anc_data_recv (struct msghdr *m,struct tipc_msg *msg, -struct tipc_port *tport) +struct tipc_port *tport) {u32 anc_data[3 ];u32 err;
@@ -1736,8 +1736,8 @@ restart:* * Returns 0 on success, errno otherwise */ -static int setsockopt (struct socket *sock, -int lvl,int opt,char __user *ov,unsigned int ol) +static int setsockopt (struct socket *sock,int lvl,int opt,char __user *ov, +unsigned int ol) {struct sock *sk = sock->sk;struct tipc_port *tport =tipc_sk_port (sk);
@@ -1795,8 +1795,8 @@ static int setsockopt(struct socket *sock,* * Returns 0 on success, errno otherwise */ -static int getsockopt (struct socket *sock, -int lvl,int opt,char __user *ov,int __user *ol) +static int getsockopt (struct socket *sock,int lvl,int opt,char __user *ov, +int __user *ol) {struct sock *sk = sock->sk;struct tipc_port *tport =tipc_sk_port (sk);
net/tipc/subscr.c +4 -10
@@ -117,10 +117,8 @@ static void subscr_send_event(struct tipc_subscription *sub, u32 found_lower,* * Returns 1 if there is overlap, otherwise 0. */ -int tipc_subscr_overlap (struct tipc_subscription *sub, -u32 found_lower, +int tipc_subscr_overlap (struct tipc_subscription *sub,u32 found_lower,u32 found_upper) - {if (found_lower < sub->seq.lower) found_lower = sub->seq.lower;
@@ -136,13 +134,9 @@ int tipc_subscr_overlap(struct tipc_subscription *sub,* * Protected by nameseq.lock in name_table.c */ -void tipc_subscr_report_overlap (struct tipc_subscription *sub, -u32 found_lower, -u32 found_upper, -u32 event, -u32 port_ref, -u32 node, -int must) +void tipc_subscr_report_overlap (struct tipc_subscription *sub,u32 found_lower, +u32 found_upper,u32 event,u32 port_ref, +u32 node,int must) {if (!tipc_subscr_overlap (sub, found_lower, found_upper))return ;
net/tipc/subscr.h +4 -9
@@ -67,17 +67,12 @@ struct tipc_subscription {struct tipc_event evt; }; -int tipc_subscr_overlap (struct tipc_subscription *sub, -u32 found_lower, +int tipc_subscr_overlap (struct tipc_subscription *sub,u32 found_lower,u32 found_upper); -void tipc_subscr_report_overlap (struct tipc_subscription *sub, -u32 found_lower, -u32 found_upper, -u32 event, -u32 port_ref, -u32 node, -int must_report); +void tipc_subscr_report_overlap (struct tipc_subscription *sub,u32 found_lower, +u32 found_upper,u32 event,u32 port_ref, +u32 node,int must);int tipc_subscr_start (void );
Signature · 1 line
1.8.1.2
PATCH v2 13/16 tipc: enhance priority of link protocol packet
In reply to Paul GortmakerFrom: Ying Xue <[email protected]>
pfifo_fast is set as default traffic class queueing discipline. This queue has three so called "bands". Within each band, FIFO rules apply. However, as long as there are packets waiting in band 0, band 1 won't be processed.
Now all kind of TIPC type packet priorities are never set, that is, their priorities are 0, so they are mapped to band 1 of pfifo_fast qdisc. But, especially during link congestion, if link protocol packet can be sent out as earlier as possible than other type of packets so that protocol packet can arrive at peer endpoint in time, the peer will timely reset its link timeout timer to keep the link alive. So enhancing the priority of link protocol packets can meet the specific demand to avoid unnecessary link reset due to a transient link congestion.
--- net/tipc/link.c | 3 +++ 1 file changed, 3 insertions(+)
net/tipc/link.c +3 -0
@@ -41,6 +41,8 @@#include "discover.h" #include "config.h" +#include <linux/pkt_sched.h> +/* * Error message prefixes */
@@ -1947,6 +1949,7 @@ void tipc_link_send_proto_msg(struct tipc_link *l_ptr, u32 msg_typ,return ;skb_copy_to_linear_data (buf, msg,sizeof (l_ptr->proto_msg)); + buf->priority =TC_PRIO_CONTROL ;/* Defer message if bearer is already blocked */ if (tipc_bearer_blocked (l_ptr->b_ptr)) {
Signature · 1 line
1.8.1.2
PATCH v2 14/16 tipc: make tipc_link_send_sections_fast exit earlier
In reply to Paul GortmakerFrom: Ying Xue <[email protected]>
Once message build request function returns invalid code, the process of sending message cannot continue. So in case of message build failure, tipc_link_send_sections_fast() should return immediately.
--- net/tipc/link.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
net/tipc/link.c +3 -4
@@ -1082,6 +1082,9 @@ again:*/ res =tipc_msg_build (hdr, msg_sect, num_sect, total_len, sender->max_pkt, &buf); +/* Exit if build request was invalid */ +if (unlikely (res <0 )) +return res;read_lock_bh (&tipc_net_lock); node =tipc_node_find (destaddr);
@@ -1098,10 +1101,6 @@ exit:return res; } -/* Exit if build request was invalid */ -if (unlikely (res <0 )) - goto exit; -/* Exit if link (or bearer) is congested */ if (link_congested (l_ptr) ||tipc_bearer_blocked (l_ptr->b_ptr)) {
Signature · 1 line
1.8.1.2
PATCH v2 15/16 tipc: fix wrong return value for link_send_sections_long routine
In reply to Paul GortmakerFrom: Ying Xue <[email protected]>
When skb buffer cannot be allocated in link_send_sections_long(), -ENOMEM error code instead of -EFAULT should be returned to its caller.
--- net/tipc/link.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
net/tipc/link.c +6 -2
@@ -1168,6 +1168,7 @@ static int link_send_sections_long(struct tipc_port *sender,const unchar *sect_crs;int curr_sect;u32 fragm_no; +int res =0 ; again: fragm_no =1 ;
@@ -1215,12 +1216,13 @@ again: sz = fragm_rest;if (copy_from_user (buf->data + fragm_crs, sect_crs, sz)) { + res = -EFAULT ; error:for (; buf_chain; buf_chain = buf) { buf = buf_chain->next;kfree_skb (buf_chain); } -return -EFAULT ; +return res; } sect_crs += sz; sect_rest -= sz;
@@ -1241,8 +1243,10 @@ error:msg_set_fragm_no (&fragm_hdr, ++fragm_no); prev = buf; buf =tipc_buf_acquire (fragm_sz +INT_H_SIZE ); -if (!buf) +if (!buf) { + res = -ENOMEM ; goto error; + } buf->next =NULL ; prev->next = buf;
Signature · 1 line
1.8.1.2
PATCH v2 16/16 tipc: remove dev_base_lock use from enable_bearer
In reply to Paul GortmakerFrom: Ying Xue <[email protected]>
Convert enable_bearer() to RCU locking with dev_get_by_name().
Based on a similar changeset in commit 840a185d ["aoe: remove dev_base_lock use from aoecmd_cfg_pkts()"] -- quoting that:
"dev_base_lock is the legacy way to lock the device list,
and is planned to disappear. (writers hold RTNL, readers hold RCU lock)"
--- net/tipc/eth_media.c | 13 ++----------- net/tipc/ib_media.c | 13 ++----------- 2 files changed, 4 insertions(+), 22 deletions(-)
net/tipc/eth_media.c +2 -11
@@ -162,8 +162,7 @@ static void setup_bearer(struct work_struct *work)*/ static int enable_bearer (struct tipc_bearer *tb_ptr) { -struct net_device *dev =NULL ; -struct net_device *pdev =NULL ; +struct net_device *dev;struct eth_bearer *eb_ptr = ð_bearers[0 ];struct eth_bearer *stop = ð_bearers[MAX_ETH_BEARERS ];char *driver_name =strchr ((const char *)tb_ptr->name,':' ) +1 ;
@@ -178,15 +177,7 @@ static int enable_bearer(struct tipc_bearer *tb_ptr) }/* Find device with specified name */ -read_lock (&dev_base_lock); -for_each_netdev (&init_net, pdev) { -if (!strncmp (pdev->name, driver_name,IFNAMSIZ )) { - dev = pdev; -dev_hold (dev); -break ; - } - } -read_unlock (&dev_base_lock); + dev =dev_get_by_name (&init_net, driver_name);if (!dev)return -ENODEV ;
net/tipc/ib_media.c +2 -11
@@ -155,8 +155,7 @@ static void setup_bearer(struct work_struct *work)*/ static int enable_bearer (struct tipc_bearer *tb_ptr) { -struct net_device *dev =NULL ; -struct net_device *pdev =NULL ; +struct net_device *dev;struct ib_bearer *ib_ptr = &ib_bearers[0 ];struct ib_bearer *stop = &ib_bearers[MAX_IB_BEARERS ];char *driver_name =strchr ((const char *)tb_ptr->name,':' ) +1 ;
@@ -171,15 +170,7 @@ static int enable_bearer(struct tipc_bearer *tb_ptr) }/* Find device with specified name */ -read_lock (&dev_base_lock); -for_each_netdev (&init_net, pdev) { -if (!strncmp (pdev->name, driver_name,IFNAMSIZ )) { - dev = pdev; -dev_hold (dev); -break ; - } - } -read_unlock (&dev_base_lock); + dev =dev_get_by_name (&init_net, driver_name);if (!dev)return -ENODEV ;
Signature · 1 line
1.8.1.2
David Miller
maintainerFrom: Paul Gortmaker <[email protected]>
Date: Mon, 17 Jun 2013 10:54:35 -0400
Quoted 26 lines
This is a rework of the content sent earlier[1], with the following changes:
-drop the
Kconfig--> modparam conversion patch; this was
requested to be replaced[2] with a dynamic port quantity resizing. Ying and Erik were discussing how best to achieve this, and then vacation schedules got in the way, so implementing that will come (hopefully) in the next round.-rework the
sk_rcvbufpatch to allow memory resizing via sysctl
as per what Ying and Neil discussed[3]-add 4 more seemingly straigtforward and relatively small changes
from Ying (the last 4 in the series).-add cosmetic UAPI comment update patch from Ying.
That said, the largest change is still the one where we make use of the fact that linux supports kernel threads and do the server like operations within kernel threads. As Jon says:
We remove the last remnants of the TIPC native API, to make it possible to simplify locking policy and solve a problem with lost topology events.
First, we introduce a socket-based alternative to the native API.
Quoted 8 lines
Second, we convert the two remaining users of the native API, the TIPC internal topology server and the configuarion server, to use the new API.
Third, we remove the remaining code pertaining to the native API.
I have re-tested this collection of commits between 32 and 64 bit x86 machines using the standard tipc test suite, and build tested for ppc.
Series applied, thanks Paul.