Re: [PATCH] block: reexpand iov_iter after read/write

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 5/6/21 12:55 PM, Al Viro wrote:
> On Thu, May 06, 2021 at 11:19:03AM -0600, Jens Axboe wrote:
> 
>> Doing a quick profile, on the latter run with ->write_iter() we're
>> spending 8% of the time in _copy_from_iter(), and 4% in
>> new_sync_write(). That's obviously not there at all for the first case.
>> Both have about 4% in eventfd_write(). Non-iter case spends 1% in
>> copy_from_user().
>>
>> Finally with your branch pulled in as well, iow using ->write_iter() for
>> eventfd and your iov changes:
>>
>> Executed in  485.26 millis    fish           external
>>    usr time  103.09 millis   70.00 micros  103.03 millis
>>    sys time  382.18 millis   83.00 micros  382.09 millis
>>
>> Executed in  485.16 millis    fish           external
>>    usr time  104.07 millis   69.00 micros  104.00 millis
>>    sys time  381.09 millis   94.00 micros  381.00 millis
>>
>> and there's no real difference there. We're spending less time in
>> _copy_from_iter() (8% -> 6%) and less time in new_sync_write(), but
>> doesn't seem to manifest itself in reduced runtime.
> 
> Interesting... do you have instruction-level profiles for _copy_from_iter()
> and new_sync_write() on the last of those trees?

Attached output of perf annotate <func> for that last run.

-- 
Jens Axboe

 Percent |	Source code & Disassembly of vmlinux for cycles (72 samples, percent: local period)
---------------------------------------------------------------------------------------------------
         :
         :
         :
         :                      Disassembly of section .text:
         :
         :                      ffffffff812cef20 <new_sync_write>:
         :                      new_sync_write():
         :                      inc_syscr(current);
         :                      return ret;
         :                      }
         :
         :                      static ssize_t new_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos)
         :                      {
    0.00 :   ffffffff812cef20:       callq  ffffffff8103a8a0 <__fentry__>
    0.00 :   ffffffff812cef25:       push   %rbp
    0.00 :   ffffffff812cef26:       mov    %rdx,%r8
    5.55 :   ffffffff812cef29:       mov    %rsp,%rbp
    0.00 :   ffffffff812cef2c:       push   %r12
    0.00 :   ffffffff812cef2e:       push   %rbx
    0.00 :   ffffffff812cef2f:       mov    %rcx,%r12
    0.00 :   ffffffff812cef32:       sub    $0x68,%rsp
         :                      struct iovec iov = { .iov_base = (void __user *)buf, .iov_len = len };
    0.00 :   ffffffff812cef36:       mov    %rdx,-0x70(%rbp)
         :                      iocb_flags():
         :                      }
         :
         :                      static inline int iocb_flags(struct file *file)
         :                      {
         :                      int res = 0;
         :                      if (file->f_flags & O_APPEND)
    0.00 :   ffffffff812cef3a:       mov    0x40(%rdi),%edx
         :                      new_sync_write():
         :                      {
    8.33 :   ffffffff812cef3d:       mov    %rdi,%rbx
         :                      struct iovec iov = { .iov_base = (void __user *)buf, .iov_len = len };
    0.00 :   ffffffff812cef40:       mov    %rsi,-0x78(%rbp)
         :                      iocb_flags():
    0.00 :   ffffffff812cef44:       mov    %edx,%eax
    0.00 :   ffffffff812cef46:       shr    $0x6,%eax
    0.00 :   ffffffff812cef49:       and    $0x10,%eax
         :                      res |= IOCB_APPEND;
         :                      if (file->f_flags & O_DIRECT)
         :                      res |= IOCB_DIRECT;
    0.00 :   ffffffff812cef4c:       mov    %eax,%ecx
    0.00 :   ffffffff812cef4e:       or     $0x20000,%ecx
    0.00 :   ffffffff812cef54:       test   $0x40,%dh
    6.94 :   ffffffff812cef57:       cmovne %ecx,%eax
         :                      if ((file->f_flags & O_DSYNC) || IS_SYNC(file->f_mapping->host))
    0.00 :   ffffffff812cef5a:       test   $0x10,%dh
    0.00 :   ffffffff812cef5d:       jne    ffffffff812cef77 <new_sync_write+0x57>
    0.00 :   ffffffff812cef5f:       mov    0xd0(%rdi),%rcx
    0.00 :   ffffffff812cef66:       mov    (%rcx),%rcx
    0.00 :   ffffffff812cef69:       mov    0x28(%rcx),%rsi
    0.00 :   ffffffff812cef6d:       testb  $0x10,0x50(%rsi)
   13.89 :   ffffffff812cef71:       je     ffffffff812cf04c <new_sync_write+0x12c>
         :                      res |= IOCB_DSYNC;
    0.00 :   ffffffff812cef77:       or     $0x2,%eax
         :                      if (file->f_flags & __O_SYNC)
         :                      res |= IOCB_SYNC;
    0.00 :   ffffffff812cef7a:       mov    %eax,%ecx
    0.00 :   ffffffff812cef7c:       or     $0x4,%ecx
    0.00 :   ffffffff812cef7f:       and    $0x100000,%edx
         :                      file_write_hint():
         :                      if (file->f_write_hint != WRITE_LIFE_NOT_SET)
    0.00 :   ffffffff812cef85:       mov    0x34(%rbx),%edx
         :                      iocb_flags():
         :                      res |= IOCB_SYNC;
    0.00 :   ffffffff812cef88:       cmovne %ecx,%eax
         :                      file_write_hint():
         :                      if (file->f_write_hint != WRITE_LIFE_NOT_SET)
    0.00 :   ffffffff812cef8b:       test   %edx,%edx
    6.97 :   ffffffff812cef8d:       jne    ffffffff812cf03c <new_sync_write+0x11c>
         :                      return file_inode(file)->i_write_hint;
    0.00 :   ffffffff812cef93:       mov    0x20(%rbx),%rdx
    0.00 :   ffffffff812cef97:       movzbl 0x87(%rdx),%edx
         :                      get_current():
         :
         :                      DECLARE_PER_CPU(struct task_struct *, current_task);
         :
         :                      static __always_inline struct task_struct *get_current(void)
         :                      {
         :                      return this_cpu_read_stable(current_task);
    0.00 :   ffffffff812cef9e:       mov    %gs:0x126c0,%rcx
         :                      get_current_ioprio():
         :                      * If the calling process has set an I/O priority, use that. Otherwise, return
         :                      * the default I/O priority.
         :                      */
         :                      static inline int get_current_ioprio(void)
         :                      {
         :                      struct io_context *ioc = current->io_context;
    0.00 :   ffffffff812cefa7:       mov    0x860(%rcx),%rsi
         :
         :                      if (ioc)
    0.00 :   ffffffff812cefae:       xor    %ecx,%ecx
    0.00 :   ffffffff812cefb0:       test   %rsi,%rsi
    0.00 :   ffffffff812cefb3:       je     ffffffff812cefb9 <new_sync_write+0x99>
         :                      return ioc->ioprio;
    0.00 :   ffffffff812cefb5:       movzwl 0x14(%rsi),%ecx
         :                      init_sync_kiocb():
         :                      *kiocb = (struct kiocb) {
    0.00 :   ffffffff812cefb9:       shl    $0x10,%ecx
   12.50 :   ffffffff812cefbc:       movzwl %dx,%edx
    0.00 :   ffffffff812cefbf:       movq   $0x0,-0x38(%rbp)
    0.00 :   ffffffff812cefc7:       movq   $0x0,-0x30(%rbp)
    0.00 :   ffffffff812cefcf:       or     %ecx,%edx
    0.00 :   ffffffff812cefd1:       movq   $0x0,-0x28(%rbp)
    0.00 :   ffffffff812cefd9:       movq   $0x0,-0x18(%rbp)
    0.00 :   ffffffff812cefe1:       mov    %rbx,-0x40(%rbp)
    0.00 :   ffffffff812cefe5:       mov    %eax,-0x20(%rbp)
    6.93 :   ffffffff812cefe8:       mov    %edx,-0x1c(%rbp)
         :                      new_sync_write():
         :                      struct kiocb kiocb;
         :                      struct iov_iter iter;
         :                      ssize_t ret;
         :
         :                      init_sync_kiocb(&kiocb, filp);
         :                      kiocb.ki_pos = (ppos ? *ppos : 0);
    0.00 :   ffffffff812cefeb:       test   %r12,%r12
    0.00 :   ffffffff812cefee:       je     ffffffff812cf05b <new_sync_write+0x13b>
         :                      iov_iter_init(&iter, WRITE, &iov, 1, len);
    0.00 :   ffffffff812ceff0:       mov    $0x1,%esi
    0.00 :   ffffffff812ceff5:       lea    -0x68(%rbp),%rdi
    0.00 :   ffffffff812ceff9:       mov    $0x1,%ecx
    0.00 :   ffffffff812ceffe:       lea    -0x78(%rbp),%rdx
         :                      kiocb.ki_pos = (ppos ? *ppos : 0);
    0.00 :   ffffffff812cf002:       mov    (%r12),%rax
    0.00 :   ffffffff812cf006:       mov    %rax,-0x38(%rbp)
         :                      iov_iter_init(&iter, WRITE, &iov, 1, len);
    8.33 :   ffffffff812cf00a:       callq  ffffffff814c45e0 <iov_iter_init>
         :                      call_write_iter():
         :                      return file->f_op->write_iter(kio, iter);
   12.51 :   ffffffff812cf00f:       mov    0x28(%rbx),%rax
    0.00 :   ffffffff812cf013:       lea    -0x68(%rbp),%rsi
    0.00 :   ffffffff812cf017:       lea    -0x40(%rbp),%rdi
    0.00 :   ffffffff812cf01b:       callq  *0x28(%rax)
         :                      new_sync_write():
         :
         :                      ret = call_write_iter(filp, &kiocb, &iter);
         :                      BUG_ON(ret == -EIOCBQUEUED);
    0.00 :   ffffffff812cf01e:       cmp    $0xfffffffffffffdef,%rax
    0.00 :   ffffffff812cf024:       je     ffffffff812cf089 <new_sync_write+0x169>
         :                      if (ret > 0 && ppos)
    0.00 :   ffffffff812cf026:       test   %rax,%rax
    0.00 :   ffffffff812cf029:       jle    ffffffff812cf033 <new_sync_write+0x113>
         :                      *ppos = kiocb.ki_pos;
    0.00 :   ffffffff812cf02b:       mov    -0x38(%rbp),%rdx
   12.49 :   ffffffff812cf02f:       mov    %rdx,(%r12)
         :                      return ret;
         :                      }
    0.00 :   ffffffff812cf033:       add    $0x68,%rsp
    0.00 :   ffffffff812cf037:       pop    %rbx
    0.00 :   ffffffff812cf038:       pop    %r12
    0.00 :   ffffffff812cf03a:       pop    %rbp
    0.00 :   ffffffff812cf03b:       retq
         :                      ki_hint_validate():
         :                      if (hint <= max_hint)
    0.00 :   ffffffff812cf03c:       xor    %ecx,%ecx
    0.00 :   ffffffff812cf03e:       cmp    $0xffff,%edx
    0.00 :   ffffffff812cf044:       cmova  %ecx,%edx
    0.00 :   ffffffff812cf047:       jmpq   ffffffff812cef9e <new_sync_write+0x7e>
         :                      iocb_flags():
         :                      if ((file->f_flags & O_DSYNC) || IS_SYNC(file->f_mapping->host))
    5.55 :   ffffffff812cf04c:       testb  $0x1,0xc(%rcx)
    0.00 :   ffffffff812cf050:       je     ffffffff812cef7a <new_sync_write+0x5a>
    0.00 :   ffffffff812cf056:       jmpq   ffffffff812cef77 <new_sync_write+0x57>
         :                      new_sync_write():
         :                      iov_iter_init(&iter, WRITE, &iov, 1, len);
    0.00 :   ffffffff812cf05b:       mov    $0x1,%esi
    0.00 :   ffffffff812cf060:       lea    -0x68(%rbp),%rdi
    0.00 :   ffffffff812cf064:       mov    $0x1,%ecx
    0.00 :   ffffffff812cf069:       lea    -0x78(%rbp),%rdx
    0.00 :   ffffffff812cf06d:       callq  ffffffff814c45e0 <iov_iter_init>
         :                      call_write_iter():
         :                      return file->f_op->write_iter(kio, iter);
    0.00 :   ffffffff812cf072:       mov    0x28(%rbx),%rax
    0.00 :   ffffffff812cf076:       lea    -0x68(%rbp),%rsi
    0.00 :   ffffffff812cf07a:       lea    -0x40(%rbp),%rdi
    0.00 :   ffffffff812cf07e:       callq  *0x28(%rax)
         :                      new_sync_write():
         :                      BUG_ON(ret == -EIOCBQUEUED);
    0.00 :   ffffffff812cf081:       cmp    $0xfffffffffffffdef,%rax
    0.00 :   ffffffff812cf087:       jne    ffffffff812cf033 <new_sync_write+0x113>
    0.00 :   ffffffff812cf089:       ud2
 Percent |	Source code & Disassembly of vmlinux for cycles (113 samples, percent: local period)
----------------------------------------------------------------------------------------------------
         :
         :
         :
         :                      Disassembly of section .text:
         :
         :                      ffffffff814c6aa0 <_copy_from_iter>:
         :                      _copy_from_iter():
         :                      }
         :                      EXPORT_SYMBOL_GPL(_copy_mc_to_iter);
         :                      #endif /* CONFIG_ARCH_HAS_COPY_MC */
         :
         :                      size_t _copy_from_iter(void *addr, size_t bytes, struct iov_iter *i)
         :                      {
    0.00 :   ffffffff814c6aa0:       push   %rbp
    7.07 :   ffffffff814c6aa1:       mov    %rdx,%rax
    0.00 :   ffffffff814c6aa4:       mov    %rsp,%rbp
    0.00 :   ffffffff814c6aa7:       push   %r15
    0.00 :   ffffffff814c6aa9:       push   %r14
    0.00 :   ffffffff814c6aab:       push   %r13
    3.54 :   ffffffff814c6aad:       push   %r12
    0.00 :   ffffffff814c6aaf:       push   %rbx
    0.00 :   ffffffff814c6ab0:       sub    $0x50,%rsp
    0.00 :   ffffffff814c6ab4:       mov    %rdx,-0x78(%rbp)
         :                      iov_iter_type():
         :                      };
         :                      };
         :
         :                      static inline enum iter_type iov_iter_type(const struct iov_iter *i)
         :                      {
         :                      return i->iter_type;
    0.89 :   ffffffff814c6ab8:       movzbl (%rdx),%edx
         :                      _copy_from_iter():
    0.00 :   ffffffff814c6abb:       mov    %rdi,-0x68(%rbp)
         :                      if (unlikely(iov_iter_is_pipe(i))) {
    0.00 :   ffffffff814c6abf:       cmp    $0x3,%dl
    0.00 :   ffffffff814c6ac2:       je     ffffffff814c6bd6 <_copy_from_iter+0x136>
    0.00 :   ffffffff814c6ac8:       mov    %rax,%rdi
         :                      WARN_ON(1);
         :                      return 0;
         :                      }
         :                      if (iter_is_iovec(i))
         :                      might_fault();
         :                      iterate_and_advance(i, bytes, base, len, off,
    0.00 :   ffffffff814c6acb:       mov    0x10(%rax),%rax
    0.00 :   ffffffff814c6acf:       cmp    %rsi,%rax
    0.00 :   ffffffff814c6ad2:       cmovbe %rax,%rsi
    2.65 :   ffffffff814c6ad6:       mov    %rsi,%r13
    0.00 :   ffffffff814c6ad9:       test   %rsi,%rsi
    3.52 :   ffffffff814c6adc:       je     ffffffff814c6bdd <_copy_from_iter+0x13d>
    1.76 :   ffffffff814c6ae2:       test   %dl,%dl
    0.00 :   ffffffff814c6ae4:       jne    ffffffff814c6be2 <_copy_from_iter+0x142>
    0.00 :   ffffffff814c6aea:       mov    0x18(%rdi),%rax
    0.00 :   ffffffff814c6aee:       mov    0x8(%rdi),%r14
    0.00 :   ffffffff814c6af2:       xor    %r15d,%r15d
    0.00 :   ffffffff814c6af5:       mov    -0x68(%rbp),%rdi
   25.58 :   ffffffff814c6af9:       lea    0x10(%rax),%r12
    0.00 :   ffffffff814c6afd:       jmp    ffffffff814c6b0e <_copy_from_iter+0x6e>
    0.00 :   ffffffff814c6aff:       mov    -0x68(%rbp),%rax
    0.00 :   ffffffff814c6b03:       lea    (%rax,%r15,1),%rdi
    0.00 :   ffffffff814c6b07:       add    $0x10,%r12
         :                      {
    0.00 :   ffffffff814c6b0b:       xor    %r14d,%r14d
         :                      iterate_and_advance(i, bytes, base, len, off,
    0.00 :   ffffffff814c6b0e:       mov    -0x8(%r12),%rcx
    1.09 :   ffffffff814c6b13:       lea    -0x10(%r12),%rax
    0.00 :   ffffffff814c6b18:       mov    %r12,-0x60(%rbp)
    0.00 :   ffffffff814c6b1c:       mov    %rax,-0x70(%rbp)
    0.00 :   ffffffff814c6b20:       mov    %rcx,%rbx
    0.00 :   ffffffff814c6b23:       sub    %r14,%rbx
    1.76 :   ffffffff814c6b26:       cmp    %r13,%rbx
    0.00 :   ffffffff814c6b29:       cmova  %r13,%rbx
    0.00 :   ffffffff814c6b2d:       test   %rbx,%rbx
    0.00 :   ffffffff814c6b30:       je     ffffffff814c6b07 <_copy_from_iter+0x67>
    0.00 :   ffffffff814c6b32:       mov    -0x10(%r12),%rsi
    0.00 :   ffffffff814c6b37:       mov    %rbx,%rax
    0.00 :   ffffffff814c6b3a:       add    %r14,%rsi
         :                      __chk_range_not_ok():
         :                      */
         :                      if (__builtin_constant_p(size))
         :                      return unlikely(addr > limit - size);
         :
         :                      /* Arbitrary sizes? Be careful about overflow */
         :                      addr += size;
    0.00 :   ffffffff814c6b3d:       add    %rsi,%rax
    4.42 :   ffffffff814c6b40:       jb     ffffffff814c6bd1 <_copy_from_iter+0x131>
         :                      copyin():
         :                      if (access_ok(from, n)) {
    0.00 :   ffffffff814c6b46:       movabs $0x7ffffffff000,%rdx
    0.00 :   ffffffff814c6b50:       cmp    %rdx,%rax
    3.52 :   ffffffff814c6b53:       ja     ffffffff814c6bd1 <_copy_from_iter+0x131>
         :                      copy_user_generic():
         :                      /*
         :                      * If CPU has ERMS feature, use copy_user_enhanced_fast_string.
         :                      * Otherwise, if CPU has rep_good feature, use copy_user_generic_string.
         :                      * Otherwise, use copy_user_generic_unrolled.
         :                      */
         :                      alternative_call_2(copy_user_generic_unrolled,
    0.00 :   ffffffff814c6b55:       mov    %ebx,%edx
    0.00 :   ffffffff814c6b57:       callq  ffffffff81523880 <copy_user_generic_unrolled>
         :                      _copy_from_iter():
         :                      iterate_and_advance(i, bytes, base, len, off,
    6.18 :   ffffffff814c6b5c:       mov    -0x8(%r12),%rcx
         :                      copy_user_generic():
         :                      X86_FEATURE_ERMS,
         :                      ASM_OUTPUT2("=a" (ret), "=D" (to), "=S" (from),
         :                      "=d" (len)),
         :                      "1" (to), "2" (from), "3" (len)
         :                      : "memory", "rcx", "r8", "r9", "r10", "r11");
         :                      return ret;
    0.00 :   ffffffff814c6b61:       mov    %eax,%eax
         :                      _copy_from_iter():
    0.00 :   ffffffff814c6b63:       cltq
    0.00 :   ffffffff814c6b65:       mov    %rbx,%rdx
    0.00 :   ffffffff814c6b68:       sub    %rbx,%r13
    0.00 :   ffffffff814c6b6b:       sub    %rax,%rdx
    0.00 :   ffffffff814c6b6e:       add    %rax,%r13
    0.00 :   ffffffff814c6b71:       add    %rdx,%r15
    3.53 :   ffffffff814c6b74:       add    %r14,%rdx
    0.00 :   ffffffff814c6b77:       cmp    %rcx,%rdx
    0.00 :   ffffffff814c6b7a:       jb     ffffffff814c6bc4 <_copy_from_iter+0x124>
    0.00 :   ffffffff814c6b7c:       test   %r13,%r13
    0.00 :   ffffffff814c6b7f:       jne    ffffffff814c6aff <_copy_from_iter+0x5f>
    0.00 :   ffffffff814c6b85:       mov    -0x78(%rbp),%rcx
    2.66 :   ffffffff814c6b89:       mov    -0x60(%rbp),%rdi
    2.65 :   ffffffff814c6b8d:       mov    %rdi,%rax
    0.00 :   ffffffff814c6b90:       sub    0x18(%rcx),%rax
   11.54 :   ffffffff814c6b94:       mov    %r13,0x8(%rcx)
    0.00 :   ffffffff814c6b98:       mov    %rdi,0x18(%rcx)
   12.36 :   ffffffff814c6b9c:       mov    %rcx,%rdi
    0.00 :   ffffffff814c6b9f:       sar    $0x4,%rax
    0.00 :   ffffffff814c6ba3:       sub    %rax,0x20(%rcx)
    0.00 :   ffffffff814c6ba7:       mov    0x10(%rcx),%rax
    0.00 :   ffffffff814c6bab:       sub    %r15,%rax
    0.00 :   ffffffff814c6bae:       mov    %rax,0x10(%rdi)
         :                      copyin(addr + off, base, len),
         :                      memcpy(addr + off, base, len)
         :                      )
         :
         :                      return bytes;
         :                      }
    3.53 :   ffffffff814c6bb2:       add    $0x50,%rsp
    0.00 :   ffffffff814c6bb6:       mov    %r15,%rax
    0.00 :   ffffffff814c6bb9:       pop    %rbx
    0.00 :   ffffffff814c6bba:       pop    %r12
    0.00 :   ffffffff814c6bbc:       pop    %r13
    0.00 :   ffffffff814c6bbe:       pop    %r14
    0.00 :   ffffffff814c6bc0:       pop    %r15
    1.76 :   ffffffff814c6bc2:       pop    %rbp
    0.00 :   ffffffff814c6bc3:       retq
    0.00 :   ffffffff814c6bc4:       mov    -0x70(%rbp),%rax
    0.00 :   ffffffff814c6bc8:       mov    %rdx,%r13
    0.00 :   ffffffff814c6bcb:       mov    %rax,-0x60(%rbp)
    0.00 :   ffffffff814c6bcf:       jmp    ffffffff814c6b85 <_copy_from_iter+0xe5>
         :                      copyin():
    0.00 :   ffffffff814c6bd1:       mov    %rbx,%rax
    0.00 :   ffffffff814c6bd4:       jmp    ffffffff814c6b63 <_copy_from_iter+0xc3>
         :                      _copy_from_iter():
         :                      WARN_ON(1);
    0.00 :   ffffffff814c6bd6:       ud2
         :                      return 0;
    0.00 :   ffffffff814c6bd8:       xor    %r15d,%r15d
    0.00 :   ffffffff814c6bdb:       jmp    ffffffff814c6bb2 <_copy_from_iter+0x112>
    0.00 :   ffffffff814c6bdd:       xor    %r15d,%r15d
    0.00 :   ffffffff814c6be0:       jmp    ffffffff814c6bb2 <_copy_from_iter+0x112>
         :                      iterate_and_advance(i, bytes, base, len, off,
    0.00 :   ffffffff814c6be2:       cmp    $0x2,%dl
    0.00 :   ffffffff814c6be5:       je     ffffffff814c6e09 <_copy_from_iter+0x369>
    0.00 :   ffffffff814c6beb:       cmp    $0x1,%dl
    0.00 :   ffffffff814c6bee:       je     ffffffff814c6d6b <_copy_from_iter+0x2cb>
    0.00 :   ffffffff814c6bf4:       mov    %rsi,%r15
    0.00 :   ffffffff814c6bf7:       cmp    $0x4,%dl
    0.00 :   ffffffff814c6bfa:       jne    ffffffff814c6bab <_copy_from_iter+0x10b>
    0.00 :   ffffffff814c6bfc:       mov    0x8(%rdi),%rax
    0.00 :   ffffffff814c6c00:       add    0x20(%rdi),%rax
    0.00 :   ffffffff814c6c04:       movl   $0x0,-0x48(%rbp)
    0.00 :   ffffffff814c6c0b:       movq   $0x3,-0x40(%rbp)
    0.00 :   ffffffff814c6c13:       movq   $0x0,-0x38(%rbp)
    0.00 :   ffffffff814c6c1b:       movq   $0x0,-0x30(%rbp)
    0.00 :   ffffffff814c6c23:       mov    %eax,%ebx
    0.00 :   ffffffff814c6c25:       shr    $0xc,%rax
    0.00 :   ffffffff814c6c29:       mov    %rax,%rcx
    0.00 :   ffffffff814c6c2c:       mov    %rax,-0x60(%rbp)
    0.00 :   ffffffff814c6c30:       mov    0x18(%rdi),%rax
    0.00 :   ffffffff814c6c34:       and    $0xfff,%ebx
    0.00 :   ffffffff814c6c3a:       mov    %rcx,-0x50(%rbp)
    0.00 :   ffffffff814c6c3e:       mov    %rax,-0x58(%rbp)
    0.00 :   ffffffff814c6c42:       mov    $0xffffffffffffffff,%rsi
    0.00 :   ffffffff814c6c49:       lea    -0x58(%rbp),%rdi
    0.00 :   ffffffff814c6c4d:       xor    %r15d,%r15d
    0.00 :   ffffffff814c6c50:       callq  ffffffff8151fe40 <xas_find>
    0.00 :   ffffffff814c6c55:       mov    %rax,%r14
    0.00 :   ffffffff814c6c58:       test   %rax,%rax
    0.00 :   ffffffff814c6c5b:       je     ffffffff814c6d51 <_copy_from_iter+0x2b1>
    0.00 :   ffffffff814c6c61:       mov    %ebx,%r12d
         :                      xas_retry():
         :                      * Context: Any context.
         :                      * Return: true if the operation needs to be retried.
         :                      */
         :                      static inline bool xas_retry(struct xa_state *xas, const void *entry)
         :                      {
         :                      if (xa_is_zero(entry))
    0.00 :   ffffffff814c6c64:       cmp    $0x406,%r14
    0.00 :   ffffffff814c6c6b:       je     ffffffff814c6d1c <_copy_from_iter+0x27c>
         :                      return true;
         :                      if (!xa_is_retry(entry))
    0.00 :   ffffffff814c6c71:       cmp    $0x402,%r14
    0.00 :   ffffffff814c6c78:       je     ffffffff814c6f7f <_copy_from_iter+0x4df>
         :                      _copy_from_iter():
    0.00 :   ffffffff814c6c7e:       test   $0x1,%r14b
    0.00 :   ffffffff814c6c82:       jne    ffffffff814c6f78 <_copy_from_iter+0x4d8>
    0.00 :   ffffffff814c6c88:       mov    %r14,%rdi
    0.00 :   ffffffff814c6c8b:       callq  ffffffff81296c00 <PageHuge>
    0.00 :   ffffffff814c6c90:       mov    %eax,%ebx
    0.00 :   ffffffff814c6c92:       test   %eax,%eax
    0.00 :   ffffffff814c6c94:       jne    ffffffff814c6f30 <_copy_from_iter+0x490>
    0.00 :   ffffffff814c6c9a:       mov    -0x60(%rbp),%rdi
    0.00 :   ffffffff814c6c9e:       mov    0x20(%r14),%rax
    0.00 :   ffffffff814c6ca2:       mov    %edi,%ecx
    0.00 :   ffffffff814c6ca4:       sub    %eax,%ecx
    0.00 :   ffffffff814c6ca6:       cmp    %rdi,%rax
    0.00 :   ffffffff814c6ca9:       cmovb  %ecx,%ebx
    0.00 :   ffffffff814c6cac:       jmp    ffffffff814c6d00 <_copy_from_iter+0x260>
    0.00 :   ffffffff814c6cae:       mov    %r12d,%eax
    0.00 :   ffffffff814c6cb1:       mov    $0x1000,%edx
    0.00 :   ffffffff814c6cb6:       movslq %ebx,%rsi
    0.00 :   ffffffff814c6cb9:       mov    -0x68(%rbp),%rcx
    0.00 :   ffffffff814c6cbd:       sub    %rax,%rdx
    0.00 :   ffffffff814c6cc0:       cmp    %r13,%rdx
    0.00 :   ffffffff814c6cc3:       cmova  %r13,%rdx
    0.00 :   ffffffff814c6cc7:       shl    $0x6,%rsi
    0.00 :   ffffffff814c6ccb:       add    %r14,%rsi
         :                      lowmem_page_address():
         :                      */
         :                      #include <linux/vmstat.h>
         :
         :                      static __always_inline void *lowmem_page_address(const struct page *page)
         :                      {
         :                      return page_to_virt(page);
    0.00 :   ffffffff814c6cce:       sub    0xebda73(%rip),%rsi        # ffffffff82384748 <vmemmap_base>
         :                      _copy_from_iter():
    0.00 :   ffffffff814c6cd5:       mov    %rdx,%r12
    0.00 :   ffffffff814c6cd8:       lea    (%rcx,%r15,1),%rdi
    0.00 :   ffffffff814c6cdc:       add    %r12,%r15
         :                      lowmem_page_address():
    0.00 :   ffffffff814c6cdf:       sar    $0x6,%rsi
    0.00 :   ffffffff814c6ce3:       shl    $0xc,%rsi
    0.00 :   ffffffff814c6ce7:       add    0xebda6a(%rip),%rsi        # ffffffff82384758 <page_offset_base>
         :                      _copy_from_iter():
    0.00 :   ffffffff814c6cee:       add    %rax,%rsi
         :                      memcpy():
         :                      if (q_size < size)
         :                      __read_overflow2();
         :                      }
         :                      if (p_size < size || q_size < size)
         :                      fortify_panic(__func__);
         :                      return __underlying_memcpy(p, q, size);
    0.00 :   ffffffff814c6cf1:       callq  ffffffff81a22620 <__memcpy>
         :                      _copy_from_iter():
    0.00 :   ffffffff814c6cf6:       sub    %r12,%r13
    0.00 :   ffffffff814c6cf9:       je     ffffffff814c6d51 <_copy_from_iter+0x2b1>
    0.00 :   ffffffff814c6cfb:       inc    %ebx
    0.00 :   ffffffff814c6cfd:       xor    %r12d,%r12d
         :                      constant_test_bit():
         :                      }
         :
         :                      static __always_inline bool constant_test_bit(long nr, const volatile unsigned long *addr)
         :                      {
         :                      return ((1UL << (nr & (BITS_PER_LONG-1))) &
         :                      (addr[nr >> _BITOPS_LONG_SHIFT])) != 0;
    0.00 :   ffffffff814c6d00:       mov    (%r14),%rax
    0.00 :   ffffffff814c6d03:       shr    $0x10,%rax
    0.00 :   ffffffff814c6d07:       and    $0x1,%eax
         :                      thp_nr_pages():
         :                      */
         :                      static inline int thp_nr_pages(struct page *page)
         :                      {
         :                      VM_BUG_ON_PGFLAGS(PageTail(page), page);
         :                      if (PageHead(page))
         :                      return HPAGE_PMD_NR;
    0.00 :   ffffffff814c6d0a:       cmp    $0x1,%al
    0.00 :   ffffffff814c6d0c:       sbb    %eax,%eax
    0.00 :   ffffffff814c6d0e:       and    $0xfffffe01,%eax
    0.00 :   ffffffff814c6d13:       add    $0x200,%eax
         :                      _copy_from_iter():
    0.00 :   ffffffff814c6d18:       cmp    %eax,%ebx
    0.00 :   ffffffff814c6d1a:       jl     ffffffff814c6cae <_copy_from_iter+0x20e>
         :                      xas_next_entry():
         :                      *
         :                      * Return: The next present entry after the one currently referred to by @xas.
         :                      */
         :                      static inline void *xas_next_entry(struct xa_state *xas, unsigned long max)
         :                      {
         :                      struct xa_node *node = xas->xa_node;
    0.00 :   ffffffff814c6d1c:       mov    -0x40(%rbp),%rdi
         :                      xas_not_node():
         :                      return ((unsigned long)node & 3) || !node;
    0.00 :   ffffffff814c6d20:       test   $0x3,%dil
    0.00 :   ffffffff814c6d24:       setne  %cl
    0.00 :   ffffffff814c6d27:       test   %rdi,%rdi
    0.00 :   ffffffff814c6d2a:       sete   %al
    0.00 :   ffffffff814c6d2d:       or     %al,%cl
    0.00 :   ffffffff814c6d2f:       je     ffffffff814c6ecc <_copy_from_iter+0x42c>
         :                      xas_next_entry():
         :                      return xas_find(xas, max);
         :                      if (unlikely(xas->xa_offset == XA_CHUNK_MASK))
         :                      return xas_find(xas, max);
         :                      entry = xa_entry(xas->xa, node, xas->xa_offset + 1);
         :                      if (unlikely(xa_is_internal(entry)))
         :                      return xas_find(xas, max);
    0.00 :   ffffffff814c6d35:       mov    $0xffffffffffffffff,%rsi
    0.00 :   ffffffff814c6d3c:       lea    -0x58(%rbp),%rdi
    0.00 :   ffffffff814c6d40:       callq  ffffffff8151fe40 <xas_find>
    0.00 :   ffffffff814c6d45:       mov    %rax,%r14
         :                      _copy_from_iter():
    0.00 :   ffffffff814c6d48:       test   %rax,%rax
    0.00 :   ffffffff814c6d4b:       jne    ffffffff814c6c64 <_copy_from_iter+0x1c4>
         :                      __rcu_read_unlock():
         :                      }
         :
         :                      static inline void __rcu_read_unlock(void)
         :                      {
         :                      preempt_enable();
         :                      rcu_read_unlock_strict();
    0.00 :   ffffffff814c6d51:       callq  ffffffff810e12c0 <rcu_read_unlock_strict>
         :                      _copy_from_iter():
    0.00 :   ffffffff814c6d56:       mov    -0x78(%rbp),%rax
    0.00 :   ffffffff814c6d5a:       mov    -0x78(%rbp),%rdi
    0.00 :   ffffffff814c6d5e:       add    %r15,0x8(%rax)
    0.00 :   ffffffff814c6d62:       mov    0x10(%rax),%rax
    0.00 :   ffffffff814c6d66:       jmpq   ffffffff814c6bab <_copy_from_iter+0x10b>
    0.00 :   ffffffff814c6d6b:       mov    0x18(%rdi),%rax
    0.00 :   ffffffff814c6d6f:       xor    %r15d,%r15d
    0.00 :   ffffffff814c6d72:       mov    0x8(%rdi),%rbx
    0.00 :   ffffffff814c6d76:       mov    -0x68(%rbp),%rdi
    0.00 :   ffffffff814c6d7a:       lea    0x10(%rax),%r12
    0.00 :   ffffffff814c6d7e:       mov    %r15,%rax
    0.00 :   ffffffff814c6d81:       mov    %r12,%r15
    0.00 :   ffffffff814c6d84:       mov    %rax,%r12
    0.00 :   ffffffff814c6d87:       jmp    ffffffff814c6d97 <_copy_from_iter+0x2f7>
    0.00 :   ffffffff814c6d89:       mov    -0x68(%rbp),%rax
    0.00 :   ffffffff814c6d8d:       lea    (%rax,%r12,1),%rdi
    0.00 :   ffffffff814c6d91:       add    $0x10,%r15
    0.00 :   ffffffff814c6d95:       xor    %ebx,%ebx
    0.00 :   ffffffff814c6d97:       mov    -0x8(%r15),%r14
    0.00 :   ffffffff814c6d9b:       lea    -0x10(%r15),%rax
    0.00 :   ffffffff814c6d9f:       mov    %r15,-0x60(%rbp)
    0.00 :   ffffffff814c6da3:       mov    %rax,-0x70(%rbp)
    0.00 :   ffffffff814c6da7:       sub    %rbx,%r14
    0.00 :   ffffffff814c6daa:       cmp    %r13,%r14
    0.00 :   ffffffff814c6dad:       cmova  %r13,%r14
    0.00 :   ffffffff814c6db1:       test   %r14,%r14
    0.00 :   ffffffff814c6db4:       je     ffffffff814c6d91 <_copy_from_iter+0x2f1>
    0.00 :   ffffffff814c6db6:       mov    -0x10(%r15),%rsi
         :                      memcpy():
    0.00 :   ffffffff814c6dba:       mov    %r14,%rdx
         :                      _copy_from_iter():
    0.00 :   ffffffff814c6dbd:       add    %r14,%r12
    0.00 :   ffffffff814c6dc0:       sub    %r14,%r13
    0.00 :   ffffffff814c6dc3:       add    %rbx,%rsi
         :                      memcpy():
    0.00 :   ffffffff814c6dc6:       callq  ffffffff81a22620 <__memcpy>
         :                      _copy_from_iter():
    0.00 :   ffffffff814c6dcb:       lea    (%rbx,%r14,1),%rcx
    0.00 :   ffffffff814c6dcf:       cmp    %rcx,-0x8(%r15)
    0.00 :   ffffffff814c6dd3:       ja     ffffffff814c6eb9 <_copy_from_iter+0x419>
    0.00 :   ffffffff814c6dd9:       test   %r13,%r13
    0.00 :   ffffffff814c6ddc:       jne    ffffffff814c6d89 <_copy_from_iter+0x2e9>
    0.00 :   ffffffff814c6dde:       mov    %r12,%r15
    0.00 :   ffffffff814c6de1:       mov    -0x78(%rbp),%rdi
    0.00 :   ffffffff814c6de5:       mov    -0x60(%rbp),%rcx
    0.00 :   ffffffff814c6de9:       mov    %rcx,%rax
    0.00 :   ffffffff814c6dec:       sub    0x18(%rdi),%rax
    0.00 :   ffffffff814c6df0:       mov    %r13,0x8(%rdi)
    0.00 :   ffffffff814c6df4:       mov    %rcx,0x18(%rdi)
    0.00 :   ffffffff814c6df8:       sar    $0x4,%rax
    0.00 :   ffffffff814c6dfc:       sub    %rax,0x20(%rdi)
    0.00 :   ffffffff814c6e00:       mov    0x10(%rdi),%rax
    0.00 :   ffffffff814c6e04:       jmpq   ffffffff814c6bab <_copy_from_iter+0x10b>
    0.00 :   ffffffff814c6e09:       mov    0x18(%rdi),%r14
    0.00 :   ffffffff814c6e0d:       mov    0x8(%rdi),%r12d
    0.00 :   ffffffff814c6e11:       xor    %r15d,%r15d
    0.00 :   ffffffff814c6e14:       mov    0xc(%r14),%eax
    0.00 :   ffffffff814c6e18:       mov    0x8(%r14),%edx
    0.00 :   ffffffff814c6e1c:       mov    $0x1000,%esi
    0.00 :   ffffffff814c6e21:       mov    -0x68(%rbp),%rdi
    0.00 :   ffffffff814c6e25:       add    %r12d,%eax
    0.00 :   ffffffff814c6e28:       sub    %r12d,%edx
    0.00 :   ffffffff814c6e2b:       mov    %eax,%ecx
    0.00 :   ffffffff814c6e2d:       and    $0xfff,%ecx
    0.00 :   ffffffff814c6e33:       cmp    %r13,%rdx
    0.00 :   ffffffff814c6e36:       cmova  %r13,%rdx
    0.00 :   ffffffff814c6e3a:       sub    %rcx,%rsi
    0.00 :   ffffffff814c6e3d:       cmp    %rsi,%rdx
    0.00 :   ffffffff814c6e40:       cmovbe %rdx,%rsi
    0.00 :   ffffffff814c6e44:       shr    $0xc,%eax
    0.00 :   ffffffff814c6e47:       add    %r15,%rdi
    0.00 :   ffffffff814c6e4a:       mov    %rsi,%rbx
    0.00 :   ffffffff814c6e4d:       mov    %eax,%esi
    0.00 :   ffffffff814c6e4f:       shl    $0x6,%rsi
    0.00 :   ffffffff814c6e53:       add    (%r14),%rsi
         :                      memcpy():
    0.00 :   ffffffff814c6e56:       mov    %rbx,%rdx
         :                      _copy_from_iter():
    0.00 :   ffffffff814c6e59:       add    %rbx,%r15
         :                      lowmem_page_address():
    0.00 :   ffffffff814c6e5c:       sub    0xebd8e5(%rip),%rsi        # ffffffff82384748 <vmemmap_base>
         :                      _copy_from_iter():
    0.00 :   ffffffff814c6e63:       add    %ebx,%r12d
         :                      lowmem_page_address():
    0.00 :   ffffffff814c6e66:       sar    $0x6,%rsi
    0.00 :   ffffffff814c6e6a:       shl    $0xc,%rsi
    0.00 :   ffffffff814c6e6e:       add    0xebd8e3(%rip),%rsi        # ffffffff82384758 <page_offset_base>
         :                      _copy_from_iter():
    0.00 :   ffffffff814c6e75:       add    %rcx,%rsi
         :                      memcpy():
    0.00 :   ffffffff814c6e78:       callq  ffffffff81a22620 <__memcpy>
         :                      _copy_from_iter():
    0.00 :   ffffffff814c6e7d:       cmp    %r12d,0x8(%r14)
    0.00 :   ffffffff814c6e81:       jne    ffffffff814c6e8a <_copy_from_iter+0x3ea>
    0.00 :   ffffffff814c6e83:       add    $0x10,%r14
    0.00 :   ffffffff814c6e87:       xor    %r12d,%r12d
    0.00 :   ffffffff814c6e8a:       sub    %rbx,%r13
    0.00 :   ffffffff814c6e8d:       jne    ffffffff814c6e14 <_copy_from_iter+0x374>
    0.00 :   ffffffff814c6e8f:       mov    -0x78(%rbp),%rcx
    0.00 :   ffffffff814c6e93:       mov    %r12d,%eax
    0.00 :   ffffffff814c6e96:       mov    %rax,0x8(%rcx)
    0.00 :   ffffffff814c6e9a:       mov    %r14,%rax
    0.00 :   ffffffff814c6e9d:       sub    0x18(%rcx),%rax
    0.00 :   ffffffff814c6ea1:       mov    %rcx,%rdi
    0.00 :   ffffffff814c6ea4:       mov    %r14,0x18(%rcx)
    0.00 :   ffffffff814c6ea8:       sar    $0x4,%rax
    0.00 :   ffffffff814c6eac:       sub    %rax,0x20(%rcx)
    0.00 :   ffffffff814c6eb0:       mov    0x10(%rcx),%rax
    0.00 :   ffffffff814c6eb4:       jmpq   ffffffff814c6bab <_copy_from_iter+0x10b>
    0.00 :   ffffffff814c6eb9:       mov    -0x70(%rbp),%rax
    0.00 :   ffffffff814c6ebd:       mov    %r12,%r15
    0.00 :   ffffffff814c6ec0:       mov    %rcx,%r13
    0.00 :   ffffffff814c6ec3:       mov    %rax,-0x60(%rbp)
    0.00 :   ffffffff814c6ec7:       jmpq   ffffffff814c6de1 <_copy_from_iter+0x341>
         :                      xas_next_entry():
         :                      if (unlikely(xas_not_node(node) || node->shift ||
    0.00 :   ffffffff814c6ecc:       cmpb   $0x0,(%rdi)
    0.00 :   ffffffff814c6ecf:       jne    ffffffff814c6d35 <_copy_from_iter+0x295>
    0.00 :   ffffffff814c6ed5:       mov    -0x50(%rbp),%rsi
    0.00 :   ffffffff814c6ed9:       movzbl -0x46(%rbp),%r9d
    0.00 :   ffffffff814c6ede:       mov    %rsi,%r8
    0.00 :   ffffffff814c6ee1:       mov    %r9,%rax
    0.00 :   ffffffff814c6ee4:       and    $0x3f,%r8d
    0.00 :   ffffffff814c6ee8:       cmp    %r8,%r9
    0.00 :   ffffffff814c6eeb:       jne    ffffffff814c6d35 <_copy_from_iter+0x295>
         :                      if (unlikely(xas->xa_index >= max))
    0.00 :   ffffffff814c6ef1:       cmp    $0xffffffffffffffff,%rsi
    0.00 :   ffffffff814c6ef5:       je     ffffffff814c6f60 <_copy_from_iter+0x4c0>
         :                      if (unlikely(xas->xa_offset == XA_CHUNK_MASK))
    0.00 :   ffffffff814c6ef7:       cmp    $0x3f,%al
    0.00 :   ffffffff814c6ef9:       je     ffffffff814c6f4b <_copy_from_iter+0x4ab>
         :                      entry = xa_entry(xas->xa, node, xas->xa_offset + 1);
    0.00 :   ffffffff814c6efb:       movzbl %al,%r8d
         :                      xa_entry():
         :                      return rcu_dereference_check(node->slots[offset],
    0.00 :   ffffffff814c6eff:       add    $0x5,%r8
    0.00 :   ffffffff814c6f03:       mov    0x8(%rdi,%r8,8),%r14
         :                      xa_is_internal():
         :                      return ((unsigned long)entry & 3) == 2;
    0.00 :   ffffffff814c6f08:       mov    %r14,%r8
    0.00 :   ffffffff814c6f0b:       and    $0x3,%r8d
         :                      xas_next_entry():
         :                      if (unlikely(xa_is_internal(entry)))
    0.00 :   ffffffff814c6f0f:       cmp    $0x2,%r8
    0.00 :   ffffffff814c6f13:       je     ffffffff814c6f37 <_copy_from_iter+0x497>
         :                      xas->xa_offset++;
    0.00 :   ffffffff814c6f15:       inc    %eax
         :                      xas->xa_index++;
    0.00 :   ffffffff814c6f17:       inc    %rsi
         :                      } while (!entry);
    0.00 :   ffffffff814c6f1a:       mov    $0x1,%ecx
    0.00 :   ffffffff814c6f1f:       test   %r14,%r14
    0.00 :   ffffffff814c6f22:       je     ffffffff814c6ef1 <_copy_from_iter+0x451>
    0.00 :   ffffffff814c6f24:       mov    %al,-0x46(%rbp)
    0.00 :   ffffffff814c6f27:       mov    %rsi,-0x50(%rbp)
    0.00 :   ffffffff814c6f2b:       jmpq   ffffffff814c6c64 <_copy_from_iter+0x1c4>
         :                      _copy_from_iter():
    0.00 :   ffffffff814c6f30:       ud2
    0.00 :   ffffffff814c6f32:       jmpq   ffffffff814c6d51 <_copy_from_iter+0x2b1>
    0.00 :   ffffffff814c6f37:       test   %cl,%cl
    0.00 :   ffffffff814c6f39:       je     ffffffff814c6d35 <_copy_from_iter+0x295>
    0.00 :   ffffffff814c6f3f:       mov    %al,-0x46(%rbp)
    0.00 :   ffffffff814c6f42:       mov    %rsi,-0x50(%rbp)
    0.00 :   ffffffff814c6f46:       jmpq   ffffffff814c6d35 <_copy_from_iter+0x295>
    0.00 :   ffffffff814c6f4b:       test   %cl,%cl
    0.00 :   ffffffff814c6f4d:       je     ffffffff814c6d35 <_copy_from_iter+0x295>
    0.00 :   ffffffff814c6f53:       movb   $0x3f,-0x46(%rbp)
    0.00 :   ffffffff814c6f57:       mov    %rsi,-0x50(%rbp)
         :                      xas_next_entry():
         :                      return xas_find(xas, max);
    0.00 :   ffffffff814c6f5b:       jmpq   ffffffff814c6d35 <_copy_from_iter+0x295>
    0.00 :   ffffffff814c6f60:       test   %cl,%cl
    0.00 :   ffffffff814c6f62:       je     ffffffff814c6d35 <_copy_from_iter+0x295>
    0.00 :   ffffffff814c6f68:       mov    %al,-0x46(%rbp)
    0.00 :   ffffffff814c6f6b:       movq   $0xffffffffffffffff,-0x50(%rbp)
         :                      return xas_find(xas, max);
    0.00 :   ffffffff814c6f73:       jmpq   ffffffff814c6d35 <_copy_from_iter+0x295>
         :                      _copy_from_iter():
    0.00 :   ffffffff814c6f78:       ud2
    0.00 :   ffffffff814c6f7a:       jmpq   ffffffff814c6d51 <_copy_from_iter+0x2b1>
         :                      xas_reset():
         :                      xas->xa_node = XAS_RESTART;
    0.00 :   ffffffff814c6f7f:       movq   $0x3,-0x40(%rbp)
         :                      xas_not_node():
         :                      return ((unsigned long)node & 3) || !node;
    0.00 :   ffffffff814c6f87:       jmpq   ffffffff814c6d35 <_copy_from_iter+0x295>

[Index of Archives]     [Linux RAID]     [Linux SCSI]     [Linux ATA RAID]     [IDE]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Device Mapper]

  Powered by Linux