~lttng/lttng-ust/lttng-ust

« back to all changes in this revision

Viewing changes to include/ust/immediate.h

  • Committer: Pierre-Marc Fournier
  • Date: 2009-10-27 22:58:15 UTC
  • mfrom: (232.1.5)
  • Revision ID: git-v1:aa08b4413291fabcbd1b1144377d37034ad361de
Merge branch 'for-pierre-marc' of git://git.infradead.org/users/jblunck/ust

Fixed conflicts:
        include/ust/marker.h

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#ifndef _LINUX_IMMEDIATE_H
 
2
#define _LINUX_IMMEDIATE_H
 
3
 
 
4
/*
 
5
 * Immediate values, can be updated at runtime and save cache lines.
 
6
 *
 
7
 * (C) Copyright 2007 Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
 
8
 *
 
9
 * This library is free software; you can redistribute it and/or
 
10
 * modify it under the terms of the GNU Lesser General Public
 
11
 * License as published by the Free Software Foundation; either
 
12
 * version 2.1 of the License, or (at your option) any later version.
 
13
 *
 
14
 * This library is distributed in the hope that it will be useful,
 
15
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
16
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
17
 * Lesser General Public License for more details.
 
18
 *
 
19
 * You should have received a copy of the GNU Lesser General Public
 
20
 * License along with this library; if not, write to the Free Software
 
21
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
 
22
 */
 
23
 
 
24
#ifdef USE_IMMEDIATE
 
25
 
 
26
#include <asm/immediate.h>
 
27
 
 
28
/**
 
29
 * imv_set - set immediate variable (with locking)
 
30
 * @name: immediate value name
 
31
 * @i: required value
 
32
 *
 
33
 * Sets the value of @name, taking the module_mutex if required by
 
34
 * the architecture.
 
35
 */
 
36
#define imv_set(name, i)                                                \
 
37
        do {                                                            \
 
38
                name##__imv = (i);                                      \
 
39
                core_imv_update();                                      \
 
40
                module_imv_update();                                    \
 
41
        } while (0)
 
42
 
 
43
/*
 
44
 * Internal update functions.
 
45
 */
 
46
extern void core_imv_update(void);
 
47
extern void imv_update_range(const struct __imv *begin,
 
48
        const struct __imv *end);
 
49
extern void imv_unref_core_init(void);
 
50
extern void imv_unref(struct __imv *begin, struct __imv *end, void *start,
 
51
                unsigned long size);
 
52
 
 
53
#else
 
54
 
 
55
/*
 
56
 * Generic immediate values: a simple, standard, memory load.
 
57
 */
 
58
 
 
59
/**
 
60
 * imv_read - read immediate variable
 
61
 * @name: immediate value name
 
62
 *
 
63
 * Reads the value of @name.
 
64
 */
 
65
#define imv_read(name)                  _imv_read(name)
 
66
 
 
67
/**
 
68
 * imv_set - set immediate variable (with locking)
 
69
 * @name: immediate value name
 
70
 * @i: required value
 
71
 *
 
72
 * Sets the value of @name, taking the module_mutex if required by
 
73
 * the architecture.
 
74
 */
 
75
#define imv_set(name, i)                (name##__imv = (i))
 
76
 
 
77
static inline void core_imv_update(void) { }
 
78
static inline void imv_unref_core_init(void) { }
 
79
 
 
80
#endif
 
81
 
 
82
#define DECLARE_IMV(type, name) extern __typeof__(type) name##__imv
 
83
#define DEFINE_IMV(type, name)  __typeof__(type) name##__imv
 
84
 
 
85
#define EXPORT_IMV_SYMBOL(name) EXPORT_SYMBOL(name##__imv)
 
86
#define EXPORT_IMV_SYMBOL_GPL(name) EXPORT_SYMBOL_GPL(name##__imv)
 
87
 
 
88
/**
 
89
 * _imv_read - Read immediate value with standard memory load.
 
90
 * @name: immediate value name
 
91
 *
 
92
 * Force a data read of the immediate value instead of the immediate value
 
93
 * based mechanism. Useful for __init and __exit section data read.
 
94
 */
 
95
#define _imv_read(name)         (name##__imv)
 
96
 
 
97
#endif