Displaying 5 results from an estimated 5 matches for "futex_op_add".
2019 May 09
2
[RFC PATCH V2] vhost: don't use kmap() to log dirty pages
...struct page *page;
- void *base;
- int bit = nr + (log % PAGE_SIZE) * 8;
+ u32 old;
int r;
r = get_user_pages_fast(log, 1, 1, &page);
if (r < 0)
return r;
BUG_ON(r != 1);
- base = kmap_atomic(page);
- set_bit(bit, base);
- kunmap_atomic(base);
+
+ r = arch_futex_atomic_op_inuser(FUTEX_OP_ADD, 1 << nr, &old, addr);
+ /* TODO: fallback to kmap() when -ENOSYS? */
+
set_page_dirty_lock(page);
put_page(page);
- return 0;
+ return r;
}
-static int log_write(void __user *log_base,
+static int log_write(u32 __user *log_base,
u64 write_address, u64 write_length)
{
u6...
2019 May 09
2
[RFC PATCH V2] vhost: don't use kmap() to log dirty pages
...struct page *page;
- void *base;
- int bit = nr + (log % PAGE_SIZE) * 8;
+ u32 old;
int r;
r = get_user_pages_fast(log, 1, 1, &page);
if (r < 0)
return r;
BUG_ON(r != 1);
- base = kmap_atomic(page);
- set_bit(bit, base);
- kunmap_atomic(base);
+
+ r = arch_futex_atomic_op_inuser(FUTEX_OP_ADD, 1 << nr, &old, addr);
+ /* TODO: fallback to kmap() when -ENOSYS? */
+
set_page_dirty_lock(page);
put_page(page);
- return 0;
+ return r;
}
-static int log_write(void __user *log_base,
+static int log_write(u32 __user *log_base,
u64 write_address, u64 write_length)
{
u6...
2019 May 09
0
[RFC PATCH V2] vhost: don't use kmap() to log dirty pages
...uarantees page is not going away but does it guarantee PTE won't be
invaidated or write protected?
> if (r < 0)
> return r;
> BUG_ON(r != 1);
> - base = kmap_atomic(page);
> - set_bit(bit, base);
> - kunmap_atomic(base);
> +
> + r = arch_futex_atomic_op_inuser(FUTEX_OP_ADD, 1 << nr, &old, addr);
> + /* TODO: fallback to kmap() when -ENOSYS? */
> +
Add a comment why this won't fail? Maybe warn on EFAULT?
Also down the road a variant that does not need tricks like this is
still nice to have.
> set_page_dirty_lock(page);
> put_page(page...
2019 May 10
2
[RFC PATCH V2] vhost: don't use kmap() to log dirty pages
...h
fixup_user_fault() if arch_futex_atomic_op_in_user() fail.
>
>> if (r < 0)
>> return r;
>> BUG_ON(r != 1);
>> - base = kmap_atomic(page);
>> - set_bit(bit, base);
>> - kunmap_atomic(base);
>> +
>> + r = arch_futex_atomic_op_inuser(FUTEX_OP_ADD, 1 << nr, &old, addr);
>> + /* TODO: fallback to kmap() when -ENOSYS? */
>> +
> Add a comment why this won't fail? Maybe warn on EFAULT?
>
> Also down the road a variant that does not need tricks like this is
> still nice to have.
Ok. Let me post a V3.
Thank...
2019 May 10
2
[RFC PATCH V2] vhost: don't use kmap() to log dirty pages
...h
fixup_user_fault() if arch_futex_atomic_op_in_user() fail.
>
>> if (r < 0)
>> return r;
>> BUG_ON(r != 1);
>> - base = kmap_atomic(page);
>> - set_bit(bit, base);
>> - kunmap_atomic(base);
>> +
>> + r = arch_futex_atomic_op_inuser(FUTEX_OP_ADD, 1 << nr, &old, addr);
>> + /* TODO: fallback to kmap() when -ENOSYS? */
>> +
> Add a comment why this won't fail? Maybe warn on EFAULT?
>
> Also down the road a variant that does not need tricks like this is
> still nice to have.
Ok. Let me post a V3.
Thank...