diff options
Diffstat (limited to 'drivers/video/fbdev/uvesafb.c')
-rw-r--r-- | drivers/video/fbdev/uvesafb.c | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/drivers/video/fbdev/uvesafb.c b/drivers/video/fbdev/uvesafb.c index 440a6636d8f0..2dee073b21ad 100644 --- a/drivers/video/fbdev/uvesafb.c +++ b/drivers/video/fbdev/uvesafb.c @@ -43,6 +43,7 @@ static const struct fb_fix_screeninfo uvesafb_fix = { .visual = FB_VISUAL_TRUECOLOR, }; +static int task_timeout = UVESAFB_TIMEOUT; /* timeout [ms] of task execution */ static int mtrr = 3; /* enable mtrr by default */ static bool blank = 1; /* enable blanking by default */ static int ypan = 1; /* 0: scroll, 1: ypan, 2: ywrap */ @@ -146,7 +147,9 @@ static int uvesafb_exec(struct uvesafb_ktask *task) struct cn_msg *m; int err; int len = sizeof(task->t) + task->t.buf_len; - + int forever_wait = task_timeout < 0 ? 1 : 0; + /* For infinite wait case, set interval to the legacy 5000 ms */ + int timeout = forever_wait ? 5000 : task_timeout; /* * Check whether the message isn't longer than the maximum * allowed by connector. @@ -212,9 +215,21 @@ static int uvesafb_exec(struct uvesafb_ktask *task) } else if (err == -ENOBUFS) err = 0; - if (!err && !(task->t.flags & TF_EXIT)) - err = !wait_for_completion_timeout(task->done, - msecs_to_jiffies(UVESAFB_TIMEOUT)); + if (!err && !(task->t.flags & TF_EXIT)) { + do { + err = !wait_for_completion_timeout(task->done, + msecs_to_jiffies(timeout)); + if (err) + printk_ratelimited( + KERN_WARNING + "uvesafb: %u ms task timeout%s\n", + timeout, + forever_wait ? + ", infinitely waiting." : "."); + else + break; + } while (forever_wait); + } mutex_lock(&uvfb_lock); uvfb_tasks[seq] = NULL; @@ -1816,6 +1831,8 @@ static int uvesafb_setup(char *options) while ((this_opt = strsep(&options, ",")) != NULL) { if (!*this_opt) continue; + if (!strncmp(this_opt, "task_timeout", 12)) + task_timeout = simple_strtol(this_opt+12, NULL, 0); if (!strcmp(this_opt, "redraw")) ypan = 0; else if (!strcmp(this_opt, "ypan")) @@ -1959,6 +1976,9 @@ static const struct kernel_param_ops param_ops_scroll = { }; #define param_check_scroll(name, p) __param_check(name, p, void) +module_param(task_timeout, int, 0400); +MODULE_PARM_DESC(task_timeout, + "Timeout [ms] of a task's completion, or set to any negative value to infinitely wait"); module_param_named(scroll, ypan, scroll, 0); MODULE_PARM_DESC(scroll, "Scrolling mode, set to 'redraw', 'ypan', or 'ywrap'"); |