Commit 28237e45 authored by Artem Bityutskiy's avatar Artem Bityutskiy

UBI: make tests modes dynamic

Similarly to the debugging checks and message, make the test modes
be dynamically selected via the "debug_tsts" module parameter or
via the "/sys/module/ubi/parameters/debug_tsts" sysfs file. This
is consistent with UBIFS as well.

And now, since all the Kconfig knobs became dynamic, we can remove
the Kconfig.debug file completely.
Signed-off-by: default avatarArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
parent 92d124f5
...@@ -52,6 +52,12 @@ config MTD_UBI_GLUEBI ...@@ -52,6 +52,12 @@ config MTD_UBI_GLUEBI
work on top of UBI. Do not enable this unless you use legacy work on top of UBI. Do not enable this unless you use legacy
software. software.
source "drivers/mtd/ubi/Kconfig.debug" config MTD_UBI_DEBUG
bool "UBI debugging"
depends on SYSFS
select DEBUG_FS
select KALLSYMS_ALL if KALLSYMS && DEBUG_KERNEL
help
This option enables UBI debugging.
endif # MTD_UBI endif # MTD_UBI
comment "UBI debugging options"
config MTD_UBI_DEBUG
bool "UBI debugging"
depends on SYSFS
select DEBUG_FS
select KALLSYMS_ALL if KALLSYMS && DEBUG_KERNEL
help
This option enables UBI debugging.
if MTD_UBI_DEBUG
config MTD_UBI_DEBUG_DISABLE_BGT
bool "Do not enable the UBI background thread"
help
This option switches the background thread off by default. The thread
may be also be enabled/disabled via UBI sysfs.
config MTD_UBI_DEBUG_EMULATE_BITFLIPS
bool "Emulate flash bit-flips"
help
This option emulates bit-flips with probability 1/50, which in turn
causes scrubbing. Useful for debugging and stressing UBI.
config MTD_UBI_DEBUG_EMULATE_WRITE_FAILURES
bool "Emulate flash write failures"
help
This option emulates write failures with probability 1/100. Useful for
debugging and testing how UBI handlines errors.
config MTD_UBI_DEBUG_EMULATE_ERASE_FAILURES
bool "Emulate flash erase failures"
help
This option emulates erase failures with probability 1/100. Useful for
debugging and testing how UBI handlines errors.
endif # MTD_UBI_DEBUG
...@@ -986,8 +986,7 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num, int vid_hdr_offset) ...@@ -986,8 +986,7 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num, int vid_hdr_offset)
* checks @ubi->thread_enabled. Otherwise we may fail to wake it up. * checks @ubi->thread_enabled. Otherwise we may fail to wake it up.
*/ */
spin_lock(&ubi->wl_lock); spin_lock(&ubi->wl_lock);
if (!DBG_DISABLE_BGT) ubi->thread_enabled = 1;
ubi->thread_enabled = 1;
wake_up_process(ubi->bgt_thread); wake_up_process(ubi->bgt_thread);
spin_unlock(&ubi->wl_lock); spin_unlock(&ubi->wl_lock);
......
...@@ -32,12 +32,15 @@ ...@@ -32,12 +32,15 @@
unsigned int ubi_msg_flags; unsigned int ubi_msg_flags;
unsigned int ubi_chk_flags; unsigned int ubi_chk_flags;
unsigned int ubi_tst_flags;
module_param_named(debug_msgs, ubi_msg_flags, uint, S_IRUGO | S_IWUSR); module_param_named(debug_msgs, ubi_msg_flags, uint, S_IRUGO | S_IWUSR);
module_param_named(debug_chks, ubi_chk_flags, uint, S_IRUGO | S_IWUSR); module_param_named(debug_chks, ubi_chk_flags, uint, S_IRUGO | S_IWUSR);
module_param_named(debug_tsts, ubi_chk_flags, uint, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(debug_msgs, "Debug message type flags"); MODULE_PARM_DESC(debug_msgs, "Debug message type flags");
MODULE_PARM_DESC(debug_chks, "Debug check flags"); MODULE_PARM_DESC(debug_chks, "Debug check flags");
MODULE_PARM_DESC(debug_tsts, "Debug special test flags");
/** /**
* ubi_dbg_dump_ec_hdr - dump an erase counter header. * ubi_dbg_dump_ec_hdr - dump an erase counter header.
......
...@@ -116,13 +116,34 @@ int ubi_dbg_check_all_ff(struct ubi_device *ubi, int pnum, int offset, int len); ...@@ -116,13 +116,34 @@ int ubi_dbg_check_all_ff(struct ubi_device *ubi, int pnum, int offset, int len);
int ubi_dbg_check_write(struct ubi_device *ubi, const void *buf, int pnum, int ubi_dbg_check_write(struct ubi_device *ubi, const void *buf, int pnum,
int offset, int len); int offset, int len);
#ifdef CONFIG_MTD_UBI_DEBUG_DISABLE_BGT extern unsigned int ubi_tst_flags;
#define DBG_DISABLE_BGT 1
#else /*
#define DBG_DISABLE_BGT 0 * Special testing flags.
#endif *
* UBIFS_TST_DISABLE_BGT: disable the background thread
* UBI_TST_EMULATE_BITFLIPS: emulate bit-flips
* UBI_TST_EMULATE_WRITE_FAILURES: emulate write failures
* UBI_TST_EMULATE_ERASE_FAILURES: emulate erase failures
*/
enum {
UBI_TST_DISABLE_BGT = 0x1,
UBI_TST_EMULATE_BITFLIPS = 0x2,
UBI_TST_EMULATE_WRITE_FAILURES = 0x4,
UBI_TST_EMULATE_ERASE_FAILURES = 0x8,
};
/**
* ubi_dbg_is_bgt_disabled - if the background thread is disabled.
*
* Returns non-zero if the UBI background thread is disabled for testing
* purposes.
*/
static inline int ubi_dbg_is_bgt_disabled(void)
{
return ubi_tst_flags & UBI_TST_DISABLE_BGT;
}
#ifdef CONFIG_MTD_UBI_DEBUG_EMULATE_BITFLIPS
/** /**
* ubi_dbg_is_bitflip - if it is time to emulate a bit-flip. * ubi_dbg_is_bitflip - if it is time to emulate a bit-flip.
* *
...@@ -130,13 +151,11 @@ int ubi_dbg_check_write(struct ubi_device *ubi, const void *buf, int pnum, ...@@ -130,13 +151,11 @@ int ubi_dbg_check_write(struct ubi_device *ubi, const void *buf, int pnum,
*/ */
static inline int ubi_dbg_is_bitflip(void) static inline int ubi_dbg_is_bitflip(void)
{ {
return !(random32() % 200); if (ubi_tst_flags & UBI_TST_EMULATE_BITFLIPS)
return !(random32() % 200);
return 0;
} }
#else
#define ubi_dbg_is_bitflip() 0
#endif
#ifdef CONFIG_MTD_UBI_DEBUG_EMULATE_WRITE_FAILURES
/** /**
* ubi_dbg_is_write_failure - if it is time to emulate a write failure. * ubi_dbg_is_write_failure - if it is time to emulate a write failure.
* *
...@@ -145,13 +164,11 @@ static inline int ubi_dbg_is_bitflip(void) ...@@ -145,13 +164,11 @@ static inline int ubi_dbg_is_bitflip(void)
*/ */
static inline int ubi_dbg_is_write_failure(void) static inline int ubi_dbg_is_write_failure(void)
{ {
return !(random32() % 500); if (ubi_tst_flags & UBI_TST_EMULATE_WRITE_FAILURES)
return !(random32() % 500);
return 0;
} }
#else
#define ubi_dbg_is_write_failure() 0
#endif
#ifdef CONFIG_MTD_UBI_DEBUG_EMULATE_ERASE_FAILURES
/** /**
* ubi_dbg_is_erase_failure - if its time to emulate an erase failure. * ubi_dbg_is_erase_failure - if its time to emulate an erase failure.
* *
...@@ -160,11 +177,10 @@ static inline int ubi_dbg_is_write_failure(void) ...@@ -160,11 +177,10 @@ static inline int ubi_dbg_is_write_failure(void)
*/ */
static inline int ubi_dbg_is_erase_failure(void) static inline int ubi_dbg_is_erase_failure(void)
{ {
if (ubi_tst_flags & UBI_TST_EMULATE_ERASE_FAILURES)
return !(random32() % 400); return !(random32() % 400);
return 0;
} }
#else
#define ubi_dbg_is_erase_failure() 0
#endif
#else #else
...@@ -187,7 +203,7 @@ static inline int ubi_dbg_is_erase_failure(void) ...@@ -187,7 +203,7 @@ static inline int ubi_dbg_is_erase_failure(void)
#define ubi_dbg_dump_flash(ubi, pnum, offset, len) ({}) #define ubi_dbg_dump_flash(ubi, pnum, offset, len) ({})
#define ubi_dbg_print_hex_dump(l, ps, pt, r, g, b, len, a) ({}) #define ubi_dbg_print_hex_dump(l, ps, pt, r, g, b, len, a) ({})
#define DBG_DISABLE_BGT 0 #define ubi_dbg_is_bgt_disabled() 0
#define ubi_dbg_is_bitflip() 0 #define ubi_dbg_is_bitflip() 0
#define ubi_dbg_is_write_failure() 0 #define ubi_dbg_is_write_failure() 0
#define ubi_dbg_is_erase_failure() 0 #define ubi_dbg_is_erase_failure() 0
......
...@@ -613,7 +613,7 @@ static void schedule_ubi_work(struct ubi_device *ubi, struct ubi_work *wrk) ...@@ -613,7 +613,7 @@ static void schedule_ubi_work(struct ubi_device *ubi, struct ubi_work *wrk)
list_add_tail(&wrk->list, &ubi->works); list_add_tail(&wrk->list, &ubi->works);
ubi_assert(ubi->works_count >= 0); ubi_assert(ubi->works_count >= 0);
ubi->works_count += 1; ubi->works_count += 1;
if (ubi->thread_enabled) if (ubi->thread_enabled && !ubi_dbg_is_bgt_disabled())
wake_up_process(ubi->bgt_thread); wake_up_process(ubi->bgt_thread);
spin_unlock(&ubi->wl_lock); spin_unlock(&ubi->wl_lock);
} }
...@@ -1364,7 +1364,7 @@ int ubi_thread(void *u) ...@@ -1364,7 +1364,7 @@ int ubi_thread(void *u)
spin_lock(&ubi->wl_lock); spin_lock(&ubi->wl_lock);
if (list_empty(&ubi->works) || ubi->ro_mode || if (list_empty(&ubi->works) || ubi->ro_mode ||
!ubi->thread_enabled) { !ubi->thread_enabled || ubi_dbg_is_bgt_disabled()) {
set_current_state(TASK_INTERRUPTIBLE); set_current_state(TASK_INTERRUPTIBLE);
spin_unlock(&ubi->wl_lock); spin_unlock(&ubi->wl_lock);
schedule(); schedule();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment