Line data Source code
1 : /*
2 : * Copyright (C) 2012 Red Hat. All rights reserved.
3 : *
4 : * This program is free software; you can redistribute it and/or
5 : * modify it under the terms of the GNU General Public
6 : * License v2 as published by the Free Software Foundation.
7 : *
8 : * This program is distributed in the hope that it will be useful,
9 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 : * General Public License for more details.
12 : *
13 : * You should have received a copy of the GNU General Public
14 : * License along with this program; if not, write to the
15 : * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
16 : * Boston, MA 021110-1307, USA.
17 : */
18 :
19 : struct rcu_string {
20 : struct rcu_head rcu;
21 : char str[0];
22 : };
23 :
24 382 : static inline struct rcu_string *rcu_string_strdup(const char *src, gfp_t mask)
25 : {
26 382 : size_t len = strlen(src) + 1;
27 382 : struct rcu_string *ret = kzalloc(sizeof(struct rcu_string) +
28 : (len * sizeof(char)), mask);
29 382 : if (!ret)
30 : return ret;
31 382 : strncpy(ret->str, src, len);
32 382 : return ret;
33 : }
34 :
35 : static inline void rcu_string_free(struct rcu_string *str)
36 : {
37 256 : if (str)
38 256 : kfree_rcu(str, rcu);
39 : }
40 :
41 : #define printk_in_rcu(fmt, ...) do { \
42 : rcu_read_lock(); \
43 : printk(fmt, __VA_ARGS__); \
44 : rcu_read_unlock(); \
45 : } while (0)
46 :
47 : #define printk_ratelimited_in_rcu(fmt, ...) do { \
48 : rcu_read_lock(); \
49 : printk_ratelimited(fmt, __VA_ARGS__); \
50 : rcu_read_unlock(); \
51 : } while (0)
52 :
53 : #define rcu_str_deref(rcu_str) ({ \
54 : struct rcu_string *__str = rcu_dereference(rcu_str); \
55 : __str->str; \
56 : })
|