Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 292486
b: refs/heads/master
c: de801de
h: refs/heads/master
v: v3
  • Loading branch information
Jimi Xenidis authored and Benjamin Herrenschmidt committed Mar 7, 2012
1 parent dc2a449 commit e549372
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 3 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: a6cf7ed5119fb22f54584a9f867b638edd3c4384
refs/heads/master: de801de139ba2a2f2c74393ea00a321477ecc0dc
23 changes: 21 additions & 2 deletions trunk/arch/powerpc/mm/icswx.c
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ EXPORT_SYMBOL_GPL(drop_cop);

static int acop_use_cop(int ct)
{
/* todo */
/* There is no alternate policy, yet */
return -1;
}

Expand Down Expand Up @@ -227,11 +227,30 @@ int acop_handle_fault(struct pt_regs *regs, unsigned long address,
ct = (ccw >> 16) & 0x3f;
}

/*
* We could be here because another thread has enabled acop
* but the ACOP register has yet to be updated.
*
* This should have been taken care of by the IPI to sync all
* the threads (see smp_call_function(sync_cop, mm, 1)), but
* that could take forever if there are a significant amount
* of threads.
*
* Given the number of threads on some of these systems,
* perhaps this is the best way to sync ACOP rather than whack
* every thread with an IPI.
*/
if ((acop_copro_type_bit(ct) & current->active_mm->context.acop) != 0) {
sync_cop(current->active_mm);
return 0;
}

/* check for alternate policy */
if (!acop_use_cop(ct))
return 0;

/* at this point the CT is unknown to the system */
pr_warn("%s[%d]: Coprocessor %d is unavailable",
pr_warn("%s[%d]: Coprocessor %d is unavailable\n",
current->comm, current->pid, ct);

/* get inst if we don't already have it */
Expand Down
6 changes: 6 additions & 0 deletions trunk/arch/powerpc/mm/icswx.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,4 +59,10 @@ extern void free_cop_pid(int free_pid);

extern int acop_handle_fault(struct pt_regs *regs, unsigned long address,
unsigned long error_code);

static inline u64 acop_copro_type_bit(unsigned int type)
{
return 1ULL << (63 - type);
}

#endif /* !_ARCH_POWERPC_MM_ICSWX_H_ */

0 comments on commit e549372

Please sign in to comment.