Thread (160 messages) 160 messages, 9 authors, 2011-10-25

Re: [PATCH v5 3.1.0-rc4-tip 18/26] uprobes: slot allocation.

From: Peter Zijlstra <peterz@infradead.org>
Date: 2011-09-27 12:56:29
Also in: lkml

On Tue, 2011-09-20 at 17:33 +0530, Srikar Dronamraju wrote:
+static unsigned long xol_take_insn_slot(struct uprobes_xol_area *area)
+{
+       unsigned long slot_addr, flags;
+       int slot_nr;
+
+       do {
+               spin_lock_irqsave(&area->slot_lock, flags);
+               slot_nr = find_first_zero_bit(area->bitmap, UINSNS_PER_PAGE);
+               if (slot_nr < UINSNS_PER_PAGE) {
+                       __set_bit(slot_nr, area->bitmap);
+                       slot_addr = area->vaddr +
+                                       (slot_nr * UPROBES_XOL_SLOT_BYTES);
+                       atomic_inc(&area->slot_count);
+               }
+               spin_unlock_irqrestore(&area->slot_lock, flags);
+               if (slot_nr >= UINSNS_PER_PAGE)
+                       xol_wait_event(area);
+
+       } while (slot_nr >= UINSNS_PER_PAGE);
+
+       return slot_addr;
+}
+static void xol_free_insn_slot(struct task_struct *tsk)
+{
+       struct uprobes_xol_area *area;
+       unsigned long vma_end;
+       unsigned long slot_addr;
+
+       if (!tsk->mm || !tsk->mm->uprobes_xol_area || !tsk->utask)
+               return;
+
+       slot_addr = tsk->utask->xol_vaddr;
+
+       if (unlikely(!slot_addr || IS_ERR_VALUE(slot_addr)))
+               return;
+
+       area = tsk->mm->uprobes_xol_area;
+       vma_end = area->vaddr + PAGE_SIZE;
+       if (area->vaddr <= slot_addr && slot_addr < vma_end) {
+               int slot_nr;
+               unsigned long offset = slot_addr - area->vaddr;
+               unsigned long flags;
+
+               slot_nr = offset / UPROBES_XOL_SLOT_BYTES;
+               if (slot_nr >= UINSNS_PER_PAGE)
+                       return;
+
+               spin_lock_irqsave(&area->slot_lock, flags);
+               __clear_bit(slot_nr, area->bitmap);
+               spin_unlock_irqrestore(&area->slot_lock, flags);
+               atomic_dec(&area->slot_count);
+               if (waitqueue_active(&area->wq))
+                       wake_up(&area->wq);
+               tsk->utask->xol_vaddr = 0;
+       }
+} 
So if you want to keep that slot_lock, you might as well make
->slot_count a normal integer.

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help