Changeset 269


Ignore:
Timestamp:
05/08/14 00:04:21 (11 years ago)
Author:
atzm
Message:

optimize workqueue on smp environment

File:
1 edited

Legend:

Unmodified
Added
Removed
  • ksyslog/trunk/ksyslog.c

    r268 r269  
    2222static struct socket *ksyslog_rcv_sk = NULL; 
    2323 
    24 static struct delayed_work ksyslog_work; 
     24static struct delayed_work __percpu *ksyslog_work = NULL; 
    2525static struct workqueue_struct *ksyslog_wq = NULL; 
    2626 
     
    297297 
    298298static void 
     299ksyslog_work_register_cpu(int cpu, struct delayed_work *work, unsigned long timer) 
     300{ 
     301        queue_delayed_work_on(cpu, ksyslog_wq, work, timer * HZ / 1000); 
     302} 
     303 
     304static void 
    299305ksyslog_work_register(unsigned long timer) 
    300306{ 
    301         queue_delayed_work(ksyslog_wq, &ksyslog_work, timer * HZ / 1000); 
     307        int cpu; 
     308 
     309        for_each_possible_cpu(cpu) 
     310                ksyslog_work_register_cpu(cpu, per_cpu_ptr(ksyslog_work, cpu), timer); 
    302311} 
    303312 
     
    305314ksyslog_work_unregister(void) 
    306315{ 
    307         cancel_delayed_work_sync(&ksyslog_work); 
     316        int cpu; 
     317 
     318        for_each_possible_cpu(cpu) 
     319                cancel_delayed_work_sync(per_cpu_ptr(ksyslog_work, cpu)); 
    308320} 
    309321 
     
    348360 
    349361out: 
    350         ksyslog_work_register(ksyslog_flush_interval); 
     362        ksyslog_work_register_cpu(smp_processor_id(), 
     363                                  per_cpu_ptr(ksyslog_work, smp_processor_id()), 
     364                                  ksyslog_flush_interval); 
    351365} 
    352366 
     
    617631        ksyslog_rcv_sk = NULL; 
    618632 
    619         if (ksyslog_wq) { 
     633        if (ksyslog_work) { 
    620634                ksyslog_work_unregister(); 
     635                free_percpu(ksyslog_work); 
     636        } 
     637        ksyslog_work = NULL; 
     638 
     639        if (ksyslog_wq) 
    621640                destroy_workqueue(ksyslog_wq); 
    622         } 
    623641        ksyslog_wq = NULL; 
    624642 
     
    636654ksyslog_init(void) 
    637655{ 
    638         int err; 
     656        int cpu, err; 
    639657        struct sockaddr_in sin; 
    640658 
     
    656674        } 
    657675 
    658         INIT_DELAYED_WORK(&ksyslog_work, ksyslog_work_handler); 
     676        ksyslog_work = alloc_percpu(struct delayed_work); 
     677        if (!ksyslog_work) { 
     678                pr_err("ksyslog: alloc_percpu(ksyslog_work) failed\n"); 
     679                err = -ENOMEM; 
     680                goto err; 
     681        } 
     682        for_each_possible_cpu(cpu) 
     683                INIT_DELAYED_WORK(per_cpu_ptr(ksyslog_work, cpu), ksyslog_work_handler); 
    659684 
    660685        err = sock_create(AF_INET, SOCK_DGRAM, 0, &ksyslog_rcv_sk); 
Note: See TracChangeset for help on using the changeset viewer.