1. 04 5月, 2006 1 次提交
  2. 02 5月, 2006 8 次提交
    • J
      [PATCH] vmsplice: restrict stealing a little more · 330ab716
      Jens Axboe 提交于
      Apply the same rules as the anon pipe pages, only allow stealing
      if no one else is using the page.
      Signed-off-by: NJens Axboe <axboe@suse.de>
      330ab716
    • J
      [PATCH] splice: fix page LRU accounting · a893b99b
      Jens Axboe 提交于
      Currently we rely on the PIPE_BUF_FLAG_LRU flag being set correctly
      to know whether we need to fiddle with page LRU state after stealing it,
      however for some origins we just don't know if the page is on the LRU
      list or not.
      
      So remove PIPE_BUF_FLAG_LRU and do this check/add manually in pipe_to_file()
      instead.
      Signed-off-by: NJens Axboe <axboe@suse.de>
      a893b99b
    • J
      [PATCH] vmsplice: fix badly placed end paranthesis · 7591489a
      Jens Axboe 提交于
      We need to use the minium of {len, PAGE_SIZE-off}, not {len, PAGE_SIZE}-off.
      The latter doesn't make any sense, and could cause us to attempt negative
      length transfers...
      Signed-off-by: NJens Axboe <axboe@suse.de>
      7591489a
    • J
      [PATCH] vmsplice: allow user to pass in gift pages · 7afa6fd0
      Jens Axboe 提交于
      If SPLICE_F_GIFT is set, the user is basically giving this pages away to
      the kernel. That means we can steal them for eg page cache uses instead
      of copying it.
      
      The data must be properly page aligned and also a multiple of the page size
      in length.
      Signed-off-by: NJens Axboe <axboe@suse.de>
      7afa6fd0
    • J
      [PATCH] pipe: enable atomic copying of pipe data to/from user space · f6762b7a
      Jens Axboe 提交于
      The pipe ->map() method uses kmap() to virtually map the pages, which
      is both slow and has known scalability issues on SMP. This patch enables
      atomic copying of pipe pages, by pre-faulting data and using kmap_atomic()
      instead.
      
      lmbench bw_pipe and lat_pipe measurements agree this is a Good Thing. Here
      are results from that on a UP machine with highmem (1.5GiB of RAM), running
      first a UP kernel, SMP kernel, and SMP kernel patched.
      
      Vanilla-UP:
      Pipe bandwidth: 1622.28 MB/sec
      Pipe bandwidth: 1610.59 MB/sec
      Pipe bandwidth: 1608.30 MB/sec
      Pipe latency: 7.3275 microseconds
      Pipe latency: 7.2995 microseconds
      Pipe latency: 7.3097 microseconds
      
      Vanilla-SMP:
      Pipe bandwidth: 1382.19 MB/sec
      Pipe bandwidth: 1317.27 MB/sec
      Pipe bandwidth: 1355.61 MB/sec
      Pipe latency: 9.6402 microseconds
      Pipe latency: 9.6696 microseconds
      Pipe latency: 9.6153 microseconds
      
      Patched-SMP:
      Pipe bandwidth: 1578.70 MB/sec
      Pipe bandwidth: 1579.95 MB/sec
      Pipe bandwidth: 1578.63 MB/sec
      Pipe latency: 9.1654 microseconds
      Pipe latency: 9.2266 microseconds
      Pipe latency: 9.1527 microseconds
      Signed-off-by: NJens Axboe <axboe@suse.de>
      f6762b7a
    • J
      [PATCH] splice: call handle_ra_miss() on failure to lookup page · e27dedd8
      Jens Axboe 提交于
      Notify the readahead logic of the missing page. Suggested by
      Oleg Nesterov.
      Signed-off-by: NJens Axboe <axboe@suse.de>
      e27dedd8
    • J
      [PATCH] pipe: introduce ->pin() buffer operation · f84d7519
      Jens Axboe 提交于
      The ->map() function is really expensive on highmem machines right now,
      since it has to use the slower kmap() instead of kmap_atomic(). Splice
      rarely needs to access the virtual address of a page, so it's a waste
      of time doing it.
      
      Introduce ->pin() to take over the responsibility of making sure the
      page data is valid. ->map() is then reduced to just kmap(). That way we
      can also share a most of the pipe buffer ops between pipe.c and splice.c
      Signed-off-by: NJens Axboe <axboe@suse.de>
      f84d7519
    • J
      [PATCH] splice: fix bugs in pipe_to_file() · 0568b409
      Jens Axboe 提交于
      Found by Oleg Nesterov <oleg@tv-sign.ru>, fixed by me.
      
      - Only allow full pages to go to the page cache.
      - Check page != buf->page instead of using PIPE_BUF_FLAG_STOLEN.
      - Remember to clear 'stolen' if add_to_page_cache() fails.
      
      And as a cleanup on that:
      
      - Make the bottom fall-through logic a little less convoluted. Also make
        the steal path hold an extra reference to the page, so we don't have
        to differentiate between stolen and non-stolen at the end.
      Signed-off-by: NJens Axboe <axboe@suse.de>
      0568b409
  3. 30 4月, 2006 1 次提交
  4. 27 4月, 2006 2 次提交
  5. 26 4月, 2006 4 次提交
  6. 20 4月, 2006 1 次提交
  7. 19 4月, 2006 5 次提交
  8. 11 4月, 2006 8 次提交
  9. 10 4月, 2006 8 次提交
  10. 03 4月, 2006 2 次提交
    • J
      [PATCH] splice: fix page stealing LRU handling. · 3e7ee3e7
      Jens Axboe 提交于
      Originally from Nick Piggin, just adapted to the newer branch.
      
      You can't check PageLRU without holding zone->lru_lock.  The page
      release code can get away with it only because the page refcount is 0 at
      that point. Also, you can't reliably remove pages from the LRU unless
      the refcount is 0. Ever.
      Signed-off-by: NNick Piggin <nickpiggin@yahoo.com.au>
      Signed-off-by: NJens Axboe <axboe@suse.de>
      3e7ee3e7
    • J
      [PATCH] splice: page stealing needs to wait_on_page_writeback() · ad8d6f0a
      Jens Axboe 提交于
      Thanks to Andrew for the good explanation of why this is so. akpm writes:
      
      If a page is under writeback and we remove it from pagecache, it's still
      going to get written to disk.  But the VFS no longer knows about that page,
      nor that this page is about to modify disk blocks.
      
      So there might be scenarios in which those
      blocks-which-are-about-to-be-written-to get reused for something else.
      When writeback completes, it'll scribble on those blocks.
      
      This won't happen in ext2/ext3-style filesystems in normal mode because the
      page has buffers and try_to_release_page() will fail.
      
      But ext2 in nobh mode doesn't attach buffers at all - it just sticks the
      page in a BIO, finds some new blocks, points the BIO at those blocks and
      lets it rip.
      
      While that write IO's in flight, someone could truncate the file.  Truncate
      won't block on the writeout because the page isn't in pagecache any more.
      So truncate will the free the blocks from the file under the page's feet.
      Then something else can reallocate those blocks.  Then write data to them.
      
      Now, the original write completes, corrupting the filesystem.
      Signed-off-by: NJens Axboe <axboe@suse.de>
      ad8d6f0a