mirror of
https://github.com/torvalds/linux.git
synced 2026-05-05 23:05:25 -04:00
powerpc/spufs: synchronize interaction between spu exception handling and time slicing
Time slicing can occur at the same time as spu exception handling resulting in the wakeup of the wrong thread. This change uses the the spu's register_lock to enforce synchronization between bind/unbind and spu exception handling so that they are mutually exclusive. Signed-off-by: Luke Browning <lukebrowning@us.ibm.com> Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
This commit is contained in:
committed by
Jeremy Kerr
parent
1f64643aa5
commit
2c911a14b7
@@ -230,19 +230,23 @@ static void spu_bind_context(struct spu *spu, struct spu_context *ctx)
|
||||
ctx->stats.slb_flt_base = spu->stats.slb_flt;
|
||||
ctx->stats.class2_intr_base = spu->stats.class2_intr;
|
||||
|
||||
spu_associate_mm(spu, ctx->owner);
|
||||
|
||||
spin_lock_irq(&spu->register_lock);
|
||||
spu->ctx = ctx;
|
||||
spu->flags = 0;
|
||||
ctx->spu = spu;
|
||||
ctx->ops = &spu_hw_ops;
|
||||
spu->pid = current->pid;
|
||||
spu->tgid = current->tgid;
|
||||
spu_associate_mm(spu, ctx->owner);
|
||||
spu->ibox_callback = spufs_ibox_callback;
|
||||
spu->wbox_callback = spufs_wbox_callback;
|
||||
spu->stop_callback = spufs_stop_callback;
|
||||
spu->mfc_callback = spufs_mfc_callback;
|
||||
mb();
|
||||
spin_unlock_irq(&spu->register_lock);
|
||||
|
||||
spu_unmap_mappings(ctx);
|
||||
|
||||
spu_switch_log_notify(spu, ctx, SWITCH_LOG_START, 0);
|
||||
spu_restore(&ctx->csa, spu);
|
||||
spu->timestamp = jiffies;
|
||||
@@ -423,18 +427,22 @@ static void spu_unbind_context(struct spu *spu, struct spu_context *ctx)
|
||||
spu_unmap_mappings(ctx);
|
||||
spu_save(&ctx->csa, spu);
|
||||
spu_switch_log_notify(spu, ctx, SWITCH_LOG_STOP, 0);
|
||||
|
||||
spin_lock_irq(&spu->register_lock);
|
||||
spu->timestamp = jiffies;
|
||||
ctx->state = SPU_STATE_SAVED;
|
||||
spu->ibox_callback = NULL;
|
||||
spu->wbox_callback = NULL;
|
||||
spu->stop_callback = NULL;
|
||||
spu->mfc_callback = NULL;
|
||||
spu_associate_mm(spu, NULL);
|
||||
spu->pid = 0;
|
||||
spu->tgid = 0;
|
||||
ctx->ops = &spu_backing_ops;
|
||||
spu->flags = 0;
|
||||
spu->ctx = NULL;
|
||||
spin_unlock_irq(&spu->register_lock);
|
||||
|
||||
spu_associate_mm(spu, NULL);
|
||||
|
||||
ctx->stats.slb_flt +=
|
||||
(spu->stats.slb_flt - ctx->stats.slb_flt_base);
|
||||
|
||||
Reference in New Issue
Block a user