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 static inline struct rcu_string *rcu_string_strdup(const char *src, gfp_t mask) 25 { 26 size_t len = strlen(src) + 1; 27 struct rcu_string *ret = kzalloc(sizeof(struct rcu_string) + 28 (len * sizeof(char)), mask); 29 if (!ret) 30 return ret; 31 strncpy(ret->str, src, len); 32 return ret; 33 } 34 35 static inline void rcu_string_free(struct rcu_string *str) 36 { 37 if (str) 38 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 }) 57