cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

netns.h (5622B)


      1/* SPDX-License-Identifier: GPL-2.0-or-later */
      2/*
      3 * per net namespace data structures for nfsd
      4 *
      5 * Copyright (C) 2012, Jeff Layton <jlayton@redhat.com>
      6 */
      7
      8#ifndef __NFSD_NETNS_H__
      9#define __NFSD_NETNS_H__
     10
     11#include <net/net_namespace.h>
     12#include <net/netns/generic.h>
     13#include <linux/percpu_counter.h>
     14#include <linux/siphash.h>
     15
     16/* Hash tables for nfs4_clientid state */
     17#define CLIENT_HASH_BITS                 4
     18#define CLIENT_HASH_SIZE                (1 << CLIENT_HASH_BITS)
     19#define CLIENT_HASH_MASK                (CLIENT_HASH_SIZE - 1)
     20
     21#define SESSION_HASH_SIZE	512
     22
     23struct cld_net;
     24struct nfsd4_client_tracking_ops;
     25
     26enum {
     27	/* cache misses due only to checksum comparison failures */
     28	NFSD_NET_PAYLOAD_MISSES,
     29	/* amount of memory (in bytes) currently consumed by the DRC */
     30	NFSD_NET_DRC_MEM_USAGE,
     31	NFSD_NET_COUNTERS_NUM
     32};
     33
     34/*
     35 * Represents a nfsd "container". With respect to nfsv4 state tracking, the
     36 * fields of interest are the *_id_hashtbls and the *_name_tree. These track
     37 * the nfs4_client objects by either short or long form clientid.
     38 *
     39 * Each nfsd_net runs a nfs4_laundromat workqueue job when necessary to clean
     40 * up expired clients and delegations within the container.
     41 */
     42struct nfsd_net {
     43	struct cld_net *cld_net;
     44
     45	struct cache_detail *svc_expkey_cache;
     46	struct cache_detail *svc_export_cache;
     47
     48	struct cache_detail *idtoname_cache;
     49	struct cache_detail *nametoid_cache;
     50
     51	struct lock_manager nfsd4_manager;
     52	bool grace_ended;
     53	time64_t boot_time;
     54
     55	struct dentry *nfsd_client_dir;
     56
     57	/*
     58	 * reclaim_str_hashtbl[] holds known client info from previous reset/reboot
     59	 * used in reboot/reset lease grace period processing
     60	 *
     61	 * conf_id_hashtbl[], and conf_name_tree hold confirmed
     62	 * setclientid_confirmed info.
     63	 *
     64	 * unconf_str_hastbl[] and unconf_name_tree hold unconfirmed
     65	 * setclientid info.
     66	 */
     67	struct list_head *reclaim_str_hashtbl;
     68	int reclaim_str_hashtbl_size;
     69	struct list_head *conf_id_hashtbl;
     70	struct rb_root conf_name_tree;
     71	struct list_head *unconf_id_hashtbl;
     72	struct rb_root unconf_name_tree;
     73	struct list_head *sessionid_hashtbl;
     74	/*
     75	 * client_lru holds client queue ordered by nfs4_client.cl_time
     76	 * for lease renewal.
     77	 *
     78	 * close_lru holds (open) stateowner queue ordered by nfs4_stateowner.so_time
     79	 * for last close replay.
     80	 *
     81	 * All of the above fields are protected by the client_mutex.
     82	 */
     83	struct list_head client_lru;
     84	struct list_head close_lru;
     85	struct list_head del_recall_lru;
     86
     87	/* protected by blocked_locks_lock */
     88	struct list_head blocked_locks_lru;
     89
     90	struct delayed_work laundromat_work;
     91
     92	/* client_lock protects the client lru list and session hash table */
     93	spinlock_t client_lock;
     94
     95	/* protects blocked_locks_lru */
     96	spinlock_t blocked_locks_lock;
     97
     98	struct file *rec_file;
     99	bool in_grace;
    100	const struct nfsd4_client_tracking_ops *client_tracking_ops;
    101
    102	time64_t nfsd4_lease;
    103	time64_t nfsd4_grace;
    104	bool somebody_reclaimed;
    105
    106	bool track_reclaim_completes;
    107	atomic_t nr_reclaim_complete;
    108
    109	bool nfsd_net_up;
    110	bool lockd_up;
    111
    112	seqlock_t writeverf_lock;
    113	unsigned char writeverf[8];
    114
    115	/*
    116	 * Max number of connections this nfsd container will allow. Defaults
    117	 * to '0' which is means that it bases this on the number of threads.
    118	 */
    119	unsigned int max_connections;
    120
    121	u32 clientid_base;
    122	u32 clientid_counter;
    123	u32 clverifier_counter;
    124
    125	struct svc_serv *nfsd_serv;
    126	/* When a listening socket is added to nfsd, keep_active is set
    127	 * and this justifies a reference on nfsd_serv.  This stops
    128	 * nfsd_serv from being freed.  When the number of threads is
    129	 * set, keep_active is cleared and the reference is dropped.  So
    130	 * when the last thread exits, the service will be destroyed.
    131	 */
    132	int keep_active;
    133
    134	/*
    135	 * clientid and stateid data for construction of net unique COPY
    136	 * stateids.
    137	 */
    138	u32		s2s_cp_cl_id;
    139	struct idr	s2s_cp_stateids;
    140	spinlock_t	s2s_cp_lock;
    141
    142	/*
    143	 * Version information
    144	 */
    145	bool *nfsd_versions;
    146	bool *nfsd4_minorversions;
    147
    148	/*
    149	 * Duplicate reply cache
    150	 */
    151	struct nfsd_drc_bucket   *drc_hashtbl;
    152
    153	/* max number of entries allowed in the cache */
    154	unsigned int             max_drc_entries;
    155
    156	/* number of significant bits in the hash value */
    157	unsigned int             maskbits;
    158	unsigned int             drc_hashsize;
    159
    160	/*
    161	 * Stats and other tracking of on the duplicate reply cache.
    162	 * The longest_chain* fields are modified with only the per-bucket
    163	 * cache lock, which isn't really safe and should be fixed if we want
    164	 * these statistics to be completely accurate.
    165	 */
    166
    167	/* total number of entries */
    168	atomic_t                 num_drc_entries;
    169
    170	/* Per-netns stats counters */
    171	struct percpu_counter    counter[NFSD_NET_COUNTERS_NUM];
    172
    173	/* longest hash chain seen */
    174	unsigned int             longest_chain;
    175
    176	/* size of cache when we saw the longest hash chain */
    177	unsigned int             longest_chain_cachesize;
    178
    179	struct shrinker		nfsd_reply_cache_shrinker;
    180
    181	/* tracking server-to-server copy mounts */
    182	spinlock_t              nfsd_ssc_lock;
    183	struct list_head        nfsd_ssc_mount_list;
    184	wait_queue_head_t       nfsd_ssc_waitq;
    185
    186	/* utsname taken from the process that starts the server */
    187	char			nfsd_name[UNX_MAXNODENAME+1];
    188
    189	struct nfsd_fcache_disposal *fcache_disposal;
    190
    191	siphash_key_t		siphash_key;
    192};
    193
    194/* Simple check to find out if a given net was properly initialized */
    195#define nfsd_netns_ready(nn) ((nn)->sessionid_hashtbl)
    196
    197extern void nfsd_netns_free_versions(struct nfsd_net *nn);
    198
    199extern unsigned int nfsd_net_id;
    200
    201void nfsd_copy_write_verifier(__be32 verf[2], struct nfsd_net *nn);
    202void nfsd_reset_write_verifier(struct nfsd_net *nn);
    203#endif /* __NFSD_NETNS_H__ */