diff options
Diffstat (limited to 'drivers/oprofile/oprof.c')
-rw-r--r-- | drivers/oprofile/oprof.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/drivers/oprofile/oprof.c b/drivers/oprofile/oprof.c index e5162a64018b..2c645170f06e 100644 --- a/drivers/oprofile/oprof.c +++ b/drivers/oprofile/oprof.c | |||
@@ -53,9 +53,24 @@ int oprofile_setup(void) | |||
53 | * us missing task deaths and eventually oopsing | 53 | * us missing task deaths and eventually oopsing |
54 | * when trying to process the event buffer. | 54 | * when trying to process the event buffer. |
55 | */ | 55 | */ |
56 | if (oprofile_ops.sync_start) { | ||
57 | int sync_ret = oprofile_ops.sync_start(); | ||
58 | switch (sync_ret) { | ||
59 | case 0: | ||
60 | goto post_sync; | ||
61 | case 1: | ||
62 | goto do_generic; | ||
63 | case -1: | ||
64 | goto out3; | ||
65 | default: | ||
66 | goto out3; | ||
67 | } | ||
68 | } | ||
69 | do_generic: | ||
56 | if ((err = sync_start())) | 70 | if ((err = sync_start())) |
57 | goto out3; | 71 | goto out3; |
58 | 72 | ||
73 | post_sync: | ||
59 | is_setup = 1; | 74 | is_setup = 1; |
60 | mutex_unlock(&start_mutex); | 75 | mutex_unlock(&start_mutex); |
61 | return 0; | 76 | return 0; |
@@ -118,7 +133,20 @@ out: | |||
118 | void oprofile_shutdown(void) | 133 | void oprofile_shutdown(void) |
119 | { | 134 | { |
120 | mutex_lock(&start_mutex); | 135 | mutex_lock(&start_mutex); |
136 | if (oprofile_ops.sync_stop) { | ||
137 | int sync_ret = oprofile_ops.sync_stop(); | ||
138 | switch (sync_ret) { | ||
139 | case 0: | ||
140 | goto post_sync; | ||
141 | case 1: | ||
142 | goto do_generic; | ||
143 | default: | ||
144 | goto post_sync; | ||
145 | } | ||
146 | } | ||
147 | do_generic: | ||
121 | sync_stop(); | 148 | sync_stop(); |
149 | post_sync: | ||
122 | if (oprofile_ops.shutdown) | 150 | if (oprofile_ops.shutdown) |
123 | oprofile_ops.shutdown(); | 151 | oprofile_ops.shutdown(); |
124 | is_setup = 0; | 152 | is_setup = 0; |