Thread (8 messages) 8 messages, 3 authors, 2013-07-03

Re: linux-next: Tree for Jun 28 [ BISECTED: rsyslog/imklog: High CPU usage ]

From: Sedat Dilek <hidden>
Date: 2013-06-30 21:49:30
Also in: lkml

On Sun, Jun 30, 2013 at 8:19 PM, Oleg Nesterov [off-list ref] wrote:
Andrew, please drop these

        wait-introduce-wait_event_commonwq-condition-state-timeout.patch
        wait-introduce-prepare_to_wait_event.patch

patches again. I'll send v3 although it really looks like I should
never try to touch wait.h.

On 06/29, Sedat Dilek wrote:
quoted
As this all did not show me what caused the problem I started a
git-bisect session.

This revealed the following culprit commit:

     commit bb1f30cb7d3ba21098f0ee7e0382160ba2599a43
     "wait: introduce wait_event_common(wq, condition, state, timeout)"
Heh. First of all, I am really sorry.

Not only "__wait_no_timeout(tout) ?:" was wrong, I didn't bother
to recheck this logic even after I got the "warning: the omitted
middle operand in ?:" reports.

Sedat, thanks you very much! Any chance you can try the patch below?
Thanks for the quick fix!

No worries. Good we catched the issue, now.

Yupp, the patch fixes the issue here.

Please, send a patch against reported tree (here: next-20130628) next time.
( Attached is the one which applied here. )

I have zero clue about that "tout-tout" and "?" but you should keep
coding-style within your patch?
...
+                       __ret = __wait_no_timeout(tout) ? 0 :           \
+                                                       (__tout ?: 1);
 \ <--- ((__tout) ?: 1) like below ((tout) ?: 1)
...
+               __ret = __wait_no_timeout(tout) ? 0 : ((tout) ?: 1);    \

Feel free to give credits :-).

- Sedat -
quoted hunk ↗ jump to hunk
Oleg.

--- a/include/linux/wait.h
+++ b/include/linux/wait.h
@@ -191,12 +191,8 @@ wait_queue_head_t *bit_waitqueue(void *, int);
        for (;;) {                                                      \
                __ret = prepare_to_wait_event(&wq, &__wait, state);     \
                if (condition) {                                        \
-                       __ret = __wait_no_timeout(tout);                \
-                       if (!__ret) {                                   \
-                               __ret = __tout;                         \
-                               if (!__ret)                             \
-                                       __ret = 1;                      \
-                       }                                               \
+                       __ret = __wait_no_timeout(tout) ? 0 :           \
+                                                       (__tout ?: 1);  \
                        break;                                          \
                }                                                       \
                                                                        \
@@ -217,16 +213,10 @@ wait_queue_head_t *bit_waitqueue(void *, int);
 #define wait_event_common(wq, condition, state, tout)                  \
 ({                                                                     \
        long __ret;                                                     \
-       if (condition) {                                                \
-               __ret = __wait_no_timeout(tout);                        \
-               if (!__ret) {                                           \
-                       __ret = tout;                                   \
-                       if (!__ret)                                     \
-                               __ret = 1;                              \
-               }                                                       \
-       } else {                                                        \
+       if (condition)                                                  \
+               __ret = __wait_no_timeout(tout) ? 0 : ((tout) ?: 1);    \
+       else                                                            \
                __ret = __wait_event_common(wq, condition, state, tout);\
-       }                                                               \
        __ret;                                                          \
 })

Attachments

Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help