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

cache.h (2000B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/*
      3 * Request reply cache. This was heavily inspired by the
      4 * implementation in 4.3BSD/4.4BSD.
      5 *
      6 * Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de>
      7 */
      8
      9#ifndef NFSCACHE_H
     10#define NFSCACHE_H
     11
     12#include <linux/sunrpc/svc.h>
     13#include "netns.h"
     14
     15/*
     16 * Representation of a reply cache entry.
     17 *
     18 * Note that we use a sockaddr_in6 to hold the address instead of the more
     19 * typical sockaddr_storage. This is for space reasons, since sockaddr_storage
     20 * is much larger than a sockaddr_in6.
     21 */
     22struct svc_cacherep {
     23	struct {
     24		/* Keep often-read xid, csum in the same cache line: */
     25		__be32			k_xid;
     26		__wsum			k_csum;
     27		u32			k_proc;
     28		u32			k_prot;
     29		u32			k_vers;
     30		unsigned int		k_len;
     31		struct sockaddr_in6	k_addr;
     32	} c_key;
     33
     34	struct rb_node		c_node;
     35	struct list_head	c_lru;
     36	unsigned char		c_state,	/* unused, inprog, done */
     37				c_type,		/* status, buffer */
     38				c_secure : 1;	/* req came from port < 1024 */
     39	unsigned long		c_timestamp;
     40	union {
     41		struct kvec	u_vec;
     42		__be32		u_status;
     43	}			c_u;
     44};
     45
     46#define c_replvec		c_u.u_vec
     47#define c_replstat		c_u.u_status
     48
     49/* cache entry states */
     50enum {
     51	RC_UNUSED,
     52	RC_INPROG,
     53	RC_DONE
     54};
     55
     56/* return values */
     57enum {
     58	RC_DROPIT,
     59	RC_REPLY,
     60	RC_DOIT
     61};
     62
     63/*
     64 * Cache types.
     65 * We may want to add more types one day, e.g. for diropres and
     66 * attrstat replies. Using cache entries with fixed length instead
     67 * of buffer pointers may be more efficient.
     68 */
     69enum {
     70	RC_NOCACHE,
     71	RC_REPLSTAT,
     72	RC_REPLBUFF,
     73};
     74
     75/* Cache entries expire after this time period */
     76#define RC_EXPIRE		(120 * HZ)
     77
     78/* Checksum this amount of the request */
     79#define RC_CSUMLEN		(256U)
     80
     81int	nfsd_drc_slab_create(void);
     82void	nfsd_drc_slab_free(void);
     83int	nfsd_reply_cache_init(struct nfsd_net *);
     84void	nfsd_reply_cache_shutdown(struct nfsd_net *);
     85int	nfsd_cache_lookup(struct svc_rqst *);
     86void	nfsd_cache_update(struct svc_rqst *, int, __be32 *);
     87int	nfsd_reply_cache_stats_open(struct inode *, struct file *);
     88
     89#endif /* NFSCACHE_H */