Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 90ddc4f0 authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller
Browse files

[NET]: move struct proto_ops to const



I noticed that some of 'struct proto_ops' used in the kernel may share
a cache line used by locks or other heavily modified data. (default
linker alignement is 32 bytes, and L1_CACHE_LINE is 64 or 128 at
least)

This patch makes sure a 'struct proto_ops' can be declared as const,
so that all cpus can share all parts of it without false sharing.

This is not mandatory : a driver can still use a read/write structure
if it needs to (and eventually a __read_mostly)

I made a global stubstitute to change all existing occurences to make
them const.

This should reduce the possibility of false sharing on SMP, and
speedup some socket system calls.

Signed-off-by: default avatarEric Dumazet <dada1@cosmosbay.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 77d76ea3
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -107,7 +107,7 @@ enum sock_type {
struct socket {
	socket_state		state;
	unsigned long		flags;
	struct proto_ops	*ops;
	const struct proto_ops	*ops;
	struct fasync_struct	*fasync_list;
	struct file		*file;
	struct sock		*sk;
@@ -260,7 +260,7 @@ SOCKCALL_WRAP(name, recvmsg, (struct kiocb *iocb, struct socket *sock, struct ms
SOCKCALL_WRAP(name, mmap, (struct file *file, struct socket *sock, struct vm_area_struct *vma), \
	      (file, sock, vma)) \
	      \
static struct proto_ops name##_ops = {			\
static const struct proto_ops name##_ops = {			\
	.family		= fam,				\
	.owner		= THIS_MODULE,			\
	.release	= __lock_##name##_release,	\
+2 −2
Original line number Diff line number Diff line
#ifndef _INET_COMMON_H
#define _INET_COMMON_H

extern struct proto_ops		inet_stream_ops;
extern struct proto_ops		inet_dgram_ops;
extern const struct proto_ops		inet_stream_ops;
extern const struct proto_ops		inet_dgram_ops;

/*
 *	INET4 prototypes used by INET6
+2 −2
Original line number Diff line number Diff line
@@ -538,8 +538,8 @@ extern int sysctl_ip6frag_low_thresh;
extern int sysctl_ip6frag_time;
extern int sysctl_ip6frag_secret_interval;

extern struct proto_ops inet6_stream_ops;
extern struct proto_ops inet6_dgram_ops;
extern const struct proto_ops inet6_stream_ops;
extern const struct proto_ops inet6_dgram_ops;

extern int ip6_mc_source(int add, int omode, struct sock *sk,
			 struct group_source_req *pgsr);
+1 −1
Original line number Diff line number Diff line
@@ -65,7 +65,7 @@ struct inet_protosw {
	int		 protocol; /* This is the L4 protocol number.  */

	struct proto	 *prot;
	struct proto_ops *ops;
	const struct proto_ops *ops;
  
	int              capability; /* Which (if any) capability do
				      * we need to use this socket
+2 −2
Original line number Diff line number Diff line
@@ -63,7 +63,7 @@
#include <linux/atalk.h>

struct datalink_proto *ddp_dl, *aarp_dl;
static struct proto_ops atalk_dgram_ops;
static const struct proto_ops atalk_dgram_ops;

/**************************************************************************\
*                                                                          *
@@ -1841,7 +1841,7 @@ static struct net_proto_family atalk_family_ops = {
	.owner		= THIS_MODULE,
};

static struct proto_ops SOCKOPS_WRAPPED(atalk_dgram_ops) = {
static const struct proto_ops SOCKOPS_WRAPPED(atalk_dgram_ops) = {
	.family		= PF_APPLETALK,
	.owner		= THIS_MODULE,
	.release	= atalk_release,
Loading