Hello, Oleg.

On Wed, Jun 05, 2013 at 09:07:23PM +0200, Oleg Nesterov wrote:
> And in fact, perhaps we can implement wait_event_common() and avoid the
> code duplications?
> 
>       #define __wait_no_timeout(timeout)      \
>               (__builtin_constant_p(timeout) && (timeout) == 
> MAX_SCHEDULE_TIMEOUT)
> 
>       /* uglified signal_pending_state() */
>       #define __wait_signal_pending(state)                                    
> \
>               ((state == TASK_INTERRUPTIBLE) ? signal_pending(current) :      
> \
>                (state == TASK_KILLABLE) ? fatal_signal_pending(current) :     
> \
>                 0)
> 
>       #define __wait_event_common(wq, condition, state, tout)                 
> \
>       ({                                                                      
> \
>               DEFINE_WAIT(__wait);                                            
> \
>               long __ret = 0, __tout = tout;                                  
> \
>                                                                               
> \
>               for (;;) {                                                      
> \
>                       prepare_to_wait(&wq, &__wait, state);                   
> \
>                       if (condition) {                                        
> \
>                               __ret = __wait_no_timeout(tout) ?: __tout ?: 1; 
> \
>                               break;                                          
> \
>                       }                                                       
> \
>                                                                               
> \
>                       if (__wait_signal_pending(state)) {                     
> \
>                               __ret = -ERESTARTSYS;                           
> \
>                               break;                                          
> \
>                       }                                                       
> \
>                                                                               
> \
>                       if (__wait_no_timeout(tout))                            
> \
>                               schedule();                                     
> \
>                       else if (__tout)                                        
> \
>                               __tout = schedule_timeout(__tout);              
> \
>                       else                                                    
> \
>                               break;                                          
> \
>               }                                                               
> \
>               finish_wait(&wq, &__wait);                                      
> \
>               __ret;                                                          
> \
>       })

Heh, yeah, this looks good to me and a lot better than trying to do
the same thing over and over again and ending up with subtle
differences.

> Hmm. I compiled the kernel with the patch below,
> 
>               $ size vmlinux
>                  text    data     bss     dec     hex filename
>       -       4978601 2935080 10104832        18018513        112f0d1 vmlinux
>       +       4977769 2930984 10104832        18013585        112dd91 vmlinux

Nice.  Provided you went over assembly outputs of at least some
combinations, please feel free to add

 Reviewed-by: Tejun Heo <t...@kernel.org>

Thanks.

-- 
tejun
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to