Source
239
239
return err;
240
240
}
241
241
242
242
static int timer_mode;
243
243
244
244
static int __init oprofile_init(void)
245
245
{
246
246
int err;
247
247
248
248
/* always init architecture to setup backtrace support */
249
+
timer_mode = 0;
249
250
err = oprofile_arch_init(&oprofile_ops);
251
+
if (!err) {
252
+
if (!timer && !oprofilefs_register())
253
+
return 0;
254
+
oprofile_arch_exit();
255
+
}
250
256
251
-
timer_mode = err || timer; /* fall back to timer mode on errors */
252
-
if (timer_mode) {
253
-
if (!err)
254
-
oprofile_arch_exit();
257
+
/* setup timer mode: */
258
+
timer_mode = 1;
259
+
/* no nmi timer mode if oprofile.timer is set */
260
+
if (timer || op_nmi_timer_init(&oprofile_ops)) {
255
261
err = oprofile_timer_init(&oprofile_ops);
256
262
if (err)
257
263
return err;
258
264
}
259
265
260
-
err = oprofilefs_register();
261
-
if (!err)
262
-
return 0;
263
-
264
-
/* failed */
265
-
if (!timer_mode)
266
-
oprofile_arch_exit();
267
-
268
-
return err;
266
+
return oprofilefs_register();
269
267
}
270
268
271
269
272
270
static void __exit oprofile_exit(void)
273
271
{
274
272
oprofilefs_unregister();
275
273
if (!timer_mode)
276
274
oprofile_arch_exit();
277
275
}
278
276