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: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
This commit is contained in:
parent
92d124f531
commit
28237e4583
|
@ -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
|
||||||
|
|
|
@ -1,37 +0,0 @@
|
||||||
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)
|
||||||
* 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 @@
|
||||||
|
|
||||||
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);
|
||||||
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,
|
||||||
*/
|
*/
|
||||||
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)
|
||||||
*/
|
*/
|
||||||
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)
|
||||||
*/
|
*/
|
||||||
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)
|
||||||
#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)
|
||||||
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)
|
||||||
|
|
||||||
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();
|
||||||
|
|
Loading…
Reference in New Issue