On Thu, Mar 12, 2009 at 2:37 PM, Greg Freemyer <greg.freemyer@xxxxxxxxx> wrote: > On Thu, Mar 12, 2009 at 1:59 PM, Sandeep K Sinha > <sandeepksinha@xxxxxxxxx> wrote: >> On Thu, Mar 12, 2009 at 9:43 PM, Greg Freemyer <greg.freemyer@xxxxxxxxx> wrote: >>> On Thu, Mar 12, 2009 at 11:16 AM, Sandeep K Sinha >>> <sandeepksinha@xxxxxxxxx> wrote: >>>> Hi all, >>>> >>>> I am listing above two codes for re-allocating new blocks for a given inode. >>>> >>>> These code snippets are specific to ext2. >>>> The problem here is that it is performing slower than cp and dd. >>>> >>>> Can anyone help in determining what can be the possible reason(s) ? >>> >>> Excessive use of sync_dirty_buffer(); >>> >>> You're calling it for every single block you copy. Pretty sure it is a >>> very aggressive call that forces the data out to the disk immediately, >>> thus the benefits of caching and elevators are lost. And those are >>> big benefits. >>> >> >> probably the reason being that the ext2 has some issues with sync. >> http://kerneltrap.org/index.php?q=mailarchive/linux-fsdevel/2007/2/14/316836/thread >> >> Hence, if we don't do this we see a difference in the original and >> reallocated file. > > Sandeep, > Sandeep, I dropped ext4. Seperately, if you want to try to get your flip page approach to work without sync_dirty_buffer(), I think you need to re-code it as: /* Swap data pointers for the data buffers */ lock_buffer(src_bhptr); lock_buffer(dst_bhptr); oldpage = dst_bhptr->b_page; olddata = dst_bhptr->b_data; dst_bhptr->b_data = src_bhptr->b_data; dst_bhptr->b_page = src_bhptr->b_page; src_bhptr->b_data = oldpage; src_bhptr->b_page = olddata; flush_dcache_page(src_bhptr->b_page); flush_dcache_page(dst_bhptr->b_page); unlock_buffer(src_bhptr); unlock_buffer(dst_bhptr); /* buffer dirty so it will automatically get written to disk by io_scheduler */ mark_buffer_dirty(dst_bhptr); brelse(src_bhptr); /* src is not dirty, will be released immediately */ brelse(dst_bhptr); /* dst is dirty, will be released as soon as the data is written to disk and the buffer becomes clean */ } /* End of block copy loop */ ext2_sync_inode(dest_ind); I threw in some comments just for my own sake. The above is totally untested, but it looks much better "to me" than the logic you currently have. Personally I would get your memcpy approach perfected first. It should be able to run at the same speed as cp from userspace. Then come back and experiment with the above small speed optimization which might run faster, but more importantly should show a smaller CPU load since you aren't having to move the data around one extra time. Greg -- Greg Freemyer Head of EDD Tape Extraction and Processing team Litigation Triage Solutions Specialist http://www.linkedin.com/in/gregfreemyer First 99 Days Litigation White Paper - http://www.norcrossgroup.com/forms/whitepapers/99%20Days%20whitepaper.pdf The Norcross Group The Intersection of Evidence & Technology http://www.norcrossgroup.com -- To unsubscribe from this list: send an email with "unsubscribe kernelnewbies" to ecartis@xxxxxxxxxxxx Please read the FAQ at http://kernelnewbies.org/FAQ