Merge branch 'upstream'

This commit is contained in:
Darik Horn 2012-09-14 12:39:34 -05:00
commit 015edbd1c0
2 changed files with 16 additions and 12 deletions

View File

@ -60,9 +60,9 @@ typedef struct taskq_ent {
* KM_SLEEP/KM_NOSLEEP. TQ_NOQUEUE/TQ_NOALLOC are set particularly
* large so as not to conflict with already used GFP_* defines.
*/
#define TQ_SLEEP KM_SLEEP
#define TQ_NOSLEEP KM_NOSLEEP
#define TQ_PUSHPAGE KM_PUSHPAGE
#define TQ_SLEEP 0x00000000
#define TQ_NOSLEEP 0x00000001
#define TQ_PUSHPAGE 0x00000002
#define TQ_NOQUEUE 0x01000000
#define TQ_NOALLOC 0x02000000
#define TQ_NEW 0x04000000

View File

@ -38,6 +38,18 @@
taskq_t *system_taskq;
EXPORT_SYMBOL(system_taskq);
static int
task_km_flags(uint_t flags)
{
if (flags & TQ_NOSLEEP)
return KM_NOSLEEP;
if (flags & TQ_PUSHPAGE)
return KM_PUSHPAGE;
return KM_SLEEP;
}
/*
* NOTE: Must be called with tq->tq_lock held, returns a list_t which
* is not attached to the free, work, or pending taskq lists.
@ -90,7 +102,7 @@ retry:
}
spin_unlock_irqrestore(&tq->tq_lock, tq->tq_lock_flags);
t = kmem_alloc(sizeof(taskq_ent_t), flags & (TQ_SLEEP | TQ_NOSLEEP));
t = kmem_alloc(sizeof(taskq_ent_t), task_km_flags(flags));
spin_lock_irqsave(&tq->tq_lock, tq->tq_lock_flags);
if (t) {
@ -249,14 +261,6 @@ __taskq_dispatch(taskq_t *tq, task_func_t func, void *arg, uint_t flags)
ASSERT(tq);
ASSERT(func);
/* Solaris assumes TQ_SLEEP if not passed explicitly */
if (!(flags & (TQ_SLEEP | TQ_NOSLEEP)))
flags |= TQ_SLEEP;
if (unlikely(in_atomic() && (flags & TQ_SLEEP)))
PANIC("May schedule while atomic: %s/0x%08x/%d\n",
current->comm, preempt_count(), current->pid);
spin_lock_irqsave(&tq->tq_lock, tq->tq_lock_flags);
/* Taskq being destroyed and all tasks drained */