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

string_table.h (1327B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef _FS_CEPH_STRING_TABLE_H
      3#define _FS_CEPH_STRING_TABLE_H
      4
      5#include <linux/types.h>
      6#include <linux/kref.h>
      7#include <linux/rbtree.h>
      8#include <linux/rcupdate.h>
      9
     10struct ceph_string {
     11	struct kref kref;
     12	union {
     13		struct rb_node node;
     14		struct rcu_head rcu;
     15	};
     16	size_t len;
     17	char str[];
     18};
     19
     20extern void ceph_release_string(struct kref *ref);
     21extern struct ceph_string *ceph_find_or_create_string(const char *str,
     22						      size_t len);
     23extern bool ceph_strings_empty(void);
     24
     25static inline struct ceph_string *ceph_get_string(struct ceph_string *str)
     26{
     27	kref_get(&str->kref);
     28	return str;
     29}
     30
     31static inline void ceph_put_string(struct ceph_string *str)
     32{
     33	if (!str)
     34		return;
     35	kref_put(&str->kref, ceph_release_string);
     36}
     37
     38static inline int ceph_compare_string(struct ceph_string *cs,
     39				      const char* str, size_t len)
     40{
     41	size_t cs_len = cs ? cs->len : 0;
     42	if (cs_len != len)
     43		return cs_len - len;
     44	if (len == 0)
     45		return 0;
     46	return strncmp(cs->str, str, len);
     47}
     48
     49#define ceph_try_get_string(x)					\
     50({								\
     51	struct ceph_string *___str;				\
     52	rcu_read_lock();					\
     53	for (;;) {						\
     54		___str = rcu_dereference(x);			\
     55		if (!___str ||					\
     56		    kref_get_unless_zero(&___str->kref))	\
     57			break;					\
     58	}							\
     59	rcu_read_unlock();					\
     60	(___str);						\
     61})
     62
     63#endif