2017-05-22 24 views
0

schedule_work関数が呼び出されたときに、すでに待ち行列に入れられている場合は、キューに作業タスクを入れません。しかし、すでにキューに入っていても、同じタスクを複数回実行するようにキューに入れたいと思っています。どのようにこれを行うことができますか? workqueue.hからLinuxで同じワークキュー作業を複数回キューに入れる方法はありますか?

/** 
* schedule_work - put work task in global workqueue 
* @work: job to be done 
* 
* Returns %false if @work was already on the kernel-global workqueue and 
* %true otherwise. 
* 
* This puts a job in the kernel-global workqueue if it was not already 
* queued and leaves it in the same position on the kernel-global 
* workqueue otherwise. 
*/ 
static inline bool schedule_work(struct work_struct *work) 
+0

オンラインのCPUと同じくらい多くの作品をスケジュールすることができます。それ以外の場合は、何かを考慮する必要があります。 – 0andriy

答えて

1

Workqueueを1回実行する必要があるシングル "タスク" を表すためにあらゆるwork構造を期待しています。

これで、タスクを複数回実行する最も簡単な方法 - 毎回新しいwork構造を作成します。

また、ワークキューのために珍しい何かでは、実行中の作業を繰り返して、あなたは繰り返し、いくつかの機能を実行するための独自のカーネルスレッドを作成することがあります。と

DECLARE_WAITQUEUE(repeat_wq); // Kernel thread will wait on this workqueue. 
int n_works = 0; // Number of work requests to process. 

// Thread function 
void repeat_work(void* unused) 
{ 
    spin_lock_irq(repeat_wq.lock); // Reuse workqueue's spinlock for our needs 
    while(1) { 
     // Wait until work request or thread should be stopped 
     wait_event_interruptible_locked(&repeat_wq, 
      n_works || kthread_should_stop()); 
     if(kthread_should_stop()) break; 
     spin_unlock_irq(repeat_wq.lock); 

     <do the work> 

     // Acquire the lock for decrement count and recheck condition 
     spin_lock_irq(repeat_wq.lock); 
     n_works--; 
    } 
    // Finally release the lock 
    spin_unlock_irq(repeat_wq.lock); 
} 

// Request new work. 
void add_work(void) 
{ 
    unsigned long flags; 
    spin_lock_irqsave(repeat_wq.lock, flags); 
    n_works++; 
    wake_up_locked(&repeat_wq); 
    spin_unlock_irqrestore(repeat_wq.lock, flags);  
} 

ワークキューは、あまりにもカーネルスレッドです特定のスレッド機能kthread_worker_fn()

関連する問題