* Peter Zijlstra <peterz@infradead.org> [2010-09-03 18:51:54]:
Okay, would something like this suffice?
static unsigned long xol_get_insn_slot(struct user_bkpt *user_bkpt,
struct uprobes_xol_area *xol_area)
{
unsigned long flags, xol_vaddr = 0;
int len;
if (unlikely(!xol_area))
return 0;
smp_rmb();
if (user_bkpt->xol_vaddr)
return user_bkpt->xol_vaddr;
spin_lock_irqsave(&xol_area->lock, flags);
xol_vaddr = xol_take_insn_slot(xol_area);
spin_unlock_irqrestore(&xol_area->lock, flags);
/*
* Initialize the slot if user_bkpt->vaddr points to valid
* instruction slot.
*/
if (!xol_vaddr)
return 0;
len = access_process_vm(current, xol_vaddr, user_bkpt->insn,
UPROBES_XOL_SLOT_BYTES, 1);
if (unlikely(len < UPROBES_XOL_SLOT_BYTES))
printk(KERN_ERR "Failed to copy instruction at %#lx "
"len = %d\n", user_bkpt->vaddr, len);
/*
* Update user_bkpt->xol_vaddr after giving a chance for the slot to
* be initialized.
*/
smp_mb();
user_bkpt->xol_vaddr = xol_vaddr;
return user_bkpt->xol_vaddr;
}
--
Thanks and Regards
Srikar
--