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 19struct rcu_string { 20 struct rcu_head rcu; 21 char str[0]; 22}; 23 24static 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 35static 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