History

WorkStruct: Separate delayable and non-delayable events.

Separate delayable work items from non-delayable work items be splitting them into a separate structure (delayed_work), which incorporates a work_struct and the timer_list removed from work_struct. The work_struct struct is huge, and this limits it's usefulness. On a 64-bit architecture it's nearly 100 bytes in size. This reduces that by half for the non-delayable type of event.

David Howells committed 19 years ago

Commit 52bad641 parent 0f9005a22 files · +96 −73Browse files

Showing the changes to kernel/workqueue.c (1 of 22 files). Show all

Unified · Split

kernel/workqueue.c+28−23
@@ -122,29 +122,33 @@ EXPORT_SYMBOL_GPL(queue_work); · 121 unmodified lines
122122
123123 static void delayed_work_timer_fn(unsigned long __data)
124124 {
125− struct work_struct *work = (struct work_struct *)__data;
126− struct workqueue_struct *wq = work->wq_data;
125+ struct delayed_work *dwork = (struct delayed_work *)__data;
126+ struct workqueue_struct *wq = dwork->work.wq_data;
127127 int cpu = smp_processor_id();
128128
129129 if (unlikely(is_single_threaded(wq)))
130130 cpu = singlethread_cpu;
131131
132− __queue_work(per_cpu_ptr(wq->cpu_wq, cpu), work);
132+ __queue_work(per_cpu_ptr(wq->cpu_wq, cpu), &dwork->work);
133133 }
134134
135135 /**
136136 * queue_delayed_work - queue work on a workqueue after delay
137137 * @wq: workqueue to use
138− * @work: work to queue
138+ * @work: delayable work to queue
139139 * @delay: number of jiffies to wait before queueing
140140 *
141141 * Returns 0 if @work was already on a queue, non-zero otherwise.
142142 */
143143 int fastcall queue_delayed_work(struct workqueue_struct *wq,
144− struct work_struct *work, unsigned long delay)
144+ struct delayed_work *dwork, unsigned long delay)
145145 {
146146 int ret = 0;
147− struct timer_list *timer = &work->timer;
147+ struct timer_list *timer = &dwork->timer;
148+ struct work_struct *work = &dwork->work;
149+
150+ if (delay == 0)
151+ return queue_work(wq, work);
148152
149153 if (!test_and_set_bit(0, &work->pending)) {
150154 BUG_ON(timer_pending(timer));
@@ -153,7 +157,7 @@ int fastcall queue_delayed_work(struct workqueue_struct *wq, · 2 unmodified lines
153157 /* This stores wq for the moment, for the timer_fn */
154158 work->wq_data = wq;
155159 timer->expires = jiffies + delay;
156− timer->data = (unsigned long)work;
160+ timer->data = (unsigned long)dwork;
157161 timer->function = delayed_work_timer_fn;
158162 add_timer(timer);
159163 ret = 1;
@@ -172,10 +176,11 @@ EXPORT_SYMBOL_GPL(queue_delayed_work); · 12 unmodified lines
172176 * Returns 0 if @work was already on a queue, non-zero otherwise.
173177 */
174178 int queue_delayed_work_on(int cpu, struct workqueue_struct *wq,
175− struct work_struct *work, unsigned long delay)
179+ struct delayed_work *dwork, unsigned long delay)
176180 {
177181 int ret = 0;
178− struct timer_list *timer = &work->timer;
182+ struct timer_list *timer = &dwork->timer;
183+ struct work_struct *work = &dwork->work;
179184
180185 if (!test_and_set_bit(0, &work->pending)) {
181186 BUG_ON(timer_pending(timer));
@@ -184,7 +189,7 @@ int queue_delayed_work_on(int cpu, struct workqueue_struct *wq, · 2 unmodified lines
184189 /* This stores wq for the moment, for the timer_fn */
185190 work->wq_data = wq;
186191 timer->expires = jiffies + delay;
187− timer->data = (unsigned long)work;
192+ timer->data = (unsigned long)dwork;
188193 timer->function = delayed_work_timer_fn;
189194 add_timer_on(timer, cpu);
190195 ret = 1;
@@ -468,31 +473,31 @@ EXPORT_SYMBOL(schedule_work); · 277 unmodified lines
468473
469474 /**
470475 * schedule_delayed_work - put work task in global workqueue after delay
471− * @work: job to be done
472− * @delay: number of jiffies to wait
476+ * @dwork: job to be done
477+ * @delay: number of jiffies to wait or 0 for immediate execution
473478 *
474479 * After waiting for a given time this puts a job in the kernel-global
475480 * workqueue.
476481 */
477−int fastcall schedule_delayed_work(struct work_struct *work, unsigned long delay)
482+int fastcall schedule_delayed_work(struct delayed_work *dwork, unsigned long delay)
478483 {
479− return queue_delayed_work(keventd_wq, work, delay);
484+ return queue_delayed_work(keventd_wq, dwork, delay);
480485 }
481486 EXPORT_SYMBOL(schedule_delayed_work);
482487
483488 /**
484489 * schedule_delayed_work_on - queue work in global workqueue on CPU after delay
485490 * @cpu: cpu to use
486− * @work: job to be done
491+ * @dwork: job to be done
487492 * @delay: number of jiffies to wait
488493 *
489494 * After waiting for a given time this puts a job in the kernel-global
490495 * workqueue on the specified CPU.
491496 */
492497 int schedule_delayed_work_on(int cpu,
493− struct work_struct *work, unsigned long delay)
498+ struct delayed_work *dwork, unsigned long delay)
494499 {
495− return queue_delayed_work_on(cpu, keventd_wq, work, delay);
500+ return queue_delayed_work_on(cpu, keventd_wq, dwork, delay);
496501 }
497502 EXPORT_SYMBOL(schedule_delayed_work_on);
498503
@@ -539,12 +544,12 @@ EXPORT_SYMBOL(flush_scheduled_work); · 40 unmodified lines
539544 * cancel_rearming_delayed_workqueue - reliably kill off a delayed
540545 * work whose handler rearms the delayed work.
541546 * @wq: the controlling workqueue structure
542− * @work: the delayed work struct
547+ * @dwork: the delayed work struct
543548 */
544549 void cancel_rearming_delayed_workqueue(struct workqueue_struct *wq,
545− struct work_struct *work)
550+ struct delayed_work *dwork)
546551 {
547− while (!cancel_delayed_work(work))
552+ while (!cancel_delayed_work(dwork))
548553 flush_workqueue(wq);
549554 }
550555 EXPORT_SYMBOL(cancel_rearming_delayed_workqueue);
@@ -552,11 +557,11 @@ EXPORT_SYMBOL(cancel_rearming_delayed_workqueue); · 1 unmodified line
552557 /**
553558 * cancel_rearming_delayed_work - reliably kill off a delayed keventd
554559 * work whose handler rearms the delayed work.
555− * @work: the delayed work struct
560+ * @dwork: the delayed work struct
556561 */
557−void cancel_rearming_delayed_work(struct work_struct *work)
562+void cancel_rearming_delayed_work(struct delayed_work *dwork)
558563 {
559− cancel_rearming_delayed_workqueue(keventd_wq, work);
564+ cancel_rearming_delayed_workqueue(keventd_wq, dwork);
560565 }
561566 EXPORT_SYMBOL(cancel_rearming_delayed_work);
562567

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t