|
@@ -18,6 +18,7 @@
|
|
|
#ifdef CONFIG_USE_GENERIC_SMP_HELPERS
|
|
|
enum {
|
|
|
CSD_FLAG_LOCK = 0x01,
|
|
|
+ CSD_FLAG_WAIT = 0x02,
|
|
|
};
|
|
|
|
|
|
struct call_function_data {
|
|
@@ -124,7 +125,7 @@ static void csd_lock(struct call_single_data *csd)
|
|
|
|
|
|
static void csd_unlock(struct call_single_data *csd)
|
|
|
{
|
|
|
- WARN_ON(!(csd->flags & CSD_FLAG_LOCK));
|
|
|
+ WARN_ON((csd->flags & CSD_FLAG_WAIT) && !(csd->flags & CSD_FLAG_LOCK));
|
|
|
|
|
|
/*
|
|
|
* ensure we're all done before releasing data:
|
|
@@ -146,6 +147,9 @@ void generic_exec_single(int cpu, struct call_single_data *csd, int wait)
|
|
|
unsigned long flags;
|
|
|
int ipi;
|
|
|
|
|
|
+ if (wait)
|
|
|
+ csd->flags |= CSD_FLAG_WAIT;
|
|
|
+
|
|
|
raw_spin_lock_irqsave(&dst->lock, flags);
|
|
|
ipi = list_empty(&dst->list);
|
|
|
list_add_tail(&csd->list, &dst->list);
|