From SRS0+6O/x+63+fromorbit.com=dave@internode.on.net Mon Aug 2 02:25:57 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o727Pum2177205 for ; Mon, 2 Aug 2010 02:25:57 -0500 X-ASG-Debug-ID: 1280734443-3f7201070000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5215015CE136 for ; Mon, 2 Aug 2010 00:34:04 -0700 (PDT) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id Pnjlo9XquGa1GnSe for ; Mon, 02 Aug 2010 00:34:04 -0700 (PDT) Received: from dastard (unverified [121.44.216.100]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 33580325-1927428 for multiple; Mon, 02 Aug 2010 16:56:03 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OfpPO-0005TD-Av; Mon, 02 Aug 2010 17:26:02 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OfpPI-0004ER-I5; Mon, 02 Aug 2010 17:25:56 +1000 From: Dave Chinner To: linux-fsdevel@vger.kernel.org Cc: xfs@oss.sgi.com, sandeen@sandeen.net X-ASG-Orig-Subj: [PATCH 0/2] dio: serialise unaligned direct IO V2 Subject: [PATCH 0/2] dio: serialise unaligned direct IO V2 Date: Mon, 2 Aug 2010 17:25:43 +1000 Message-Id: <1280733945-16231-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1280734446 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36793 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean The first patch is unchanged from the first posting. The second patch adds multiple lists and locks to avod potential scalability issues with a single list. This is just a simple hash based on the block address being zeroed. From SRS0+6O/x+63+fromorbit.com=dave@internode.on.net Mon Aug 2 02:26:02 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o727Q2Ox177220 for ; Mon, 2 Aug 2010 02:26:02 -0500 X-ASG-Debug-ID: 1280733979-70ee02e80000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0BC581E39AC4 for ; Mon, 2 Aug 2010 00:26:19 -0700 (PDT) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id DvXzmLwaNqdPNolA for ; Mon, 02 Aug 2010 00:26:19 -0700 (PDT) Received: from dastard (unverified [121.44.216.100]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 33973109-1927428 for multiple; Mon, 02 Aug 2010 16:56:13 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OfpPY-0005TE-Bx; Mon, 02 Aug 2010 17:26:12 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OfpPI-0004EV-Me; Mon, 02 Aug 2010 17:25:56 +1000 From: Dave Chinner To: linux-fsdevel@vger.kernel.org Cc: xfs@oss.sgi.com, sandeen@sandeen.net X-ASG-Orig-Subj: [PATCH 2/2] dio: scale unaligned IO tracking via multiple lists Subject: [PATCH 2/2] dio: scale unaligned IO tracking via multiple lists Date: Mon, 2 Aug 2010 17:25:45 +1000 Message-Id: <1280733945-16231-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1280733945-16231-1-git-send-email-david@fromorbit.com> References: <1280733945-16231-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1280733981 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36794 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner To avoid concerns that a single list and lock tracking the unaligned IOs will not scale appropriately, create multiple lists and locks and chose them by hashing the unaligned block being zeroed. Signed-off-by: Dave Chinner --- fs/direct-io.c | 53 ++++++++++++++++++++++++++++++++++++++++------------- 1 files changed, 40 insertions(+), 13 deletions(-) diff --git a/fs/direct-io.c b/fs/direct-io.c index 611524e..95dcba4 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c @@ -152,8 +152,29 @@ struct dio_zero_block { atomic_t ref; /* reference count */ }; -DEFINE_SPINLOCK(dio_zero_block_lock); -LIST_HEAD(dio_zero_block_list); +#define DIO_ZERO_BLOCK_NR 37LL +struct dio_zero_block_head { + struct list_head list; + spinlock_t lock; +}; + +struct dio_zero_block_head dio_zero_blocks[DIO_ZERO_BLOCK_NR]; +#define to_dio_zero_list(zb) (&dio_zero_blocks[zb % DIO_ZERO_BLOCK_NR].list) +#define to_dio_zero_lock(zb) (&dio_zero_blocks[zb % DIO_ZERO_BLOCK_NR].lock) + + +static int __init +dio_init_zero_block(void) +{ + int i; + + for (i = 0; i < DIO_ZERO_BLOCK_NR; i++) { + spin_lock_init(&dio_zero_blocks[i].lock); + INIT_LIST_HEAD(&dio_zero_blocks[i].list); + } + return 0; +} +subsys_initcall(dio_init_zero_block); /* * Add a filesystem block to the list of blocks we are tracking. @@ -162,6 +183,8 @@ static void dio_start_zero_block(struct dio *dio, sector_t zero_block) { struct dio_zero_block *zb; + struct list_head *list = to_dio_zero_list(zero_block); + spinlock_t *lock = to_dio_zero_lock(zero_block); zb = kmalloc(sizeof(*zb), GFP_NOIO); if (!zb) @@ -172,9 +195,9 @@ dio_start_zero_block(struct dio *dio, sector_t zero_block) zb->dio = dio; atomic_set(&zb->ref, 1); - spin_lock(&dio_zero_block_lock); - list_add(&zb->dio_list, &dio_zero_block_list); - spin_unlock(&dio_zero_block_lock); + spin_lock(lock); + list_add(&zb->dio_list, list); + spin_unlock(lock); } static void @@ -194,20 +217,22 @@ static int dio_wait_zero_block(struct dio *dio, sector_t zero_block) { struct dio_zero_block *zb; + struct list_head *list = to_dio_zero_list(zero_block); + spinlock_t *lock = to_dio_zero_lock(zero_block); - spin_lock(&dio_zero_block_lock); - list_for_each_entry(zb, &dio_zero_block_list, dio_list) { + spin_lock(lock); + list_for_each_entry(zb, list, dio_list) { if (zb->dio->inode != dio->inode) continue; if (zb->zero_block != zero_block) continue; atomic_inc(&zb->ref); - spin_unlock(&dio_zero_block_lock); + spin_unlock(lock); wait_event(zb->wq, (list_empty(&zb->dio_list))); dio_drop_zero_block(zb); return 1; } - spin_unlock(&dio_zero_block_lock); + spin_unlock(lock); return 0; } @@ -217,20 +242,22 @@ dio_wait_zero_block(struct dio *dio, sector_t zero_block) static void dio_end_zero_block(struct dio *dio, sector_t zero_block) { struct dio_zero_block *zb; + struct list_head *list = to_dio_zero_list(zero_block); + spinlock_t *lock = to_dio_zero_lock(zero_block); - spin_lock(&dio_zero_block_lock); - list_for_each_entry(zb, &dio_zero_block_list, dio_list) { + spin_lock(lock); + list_for_each_entry(zb, list, dio_list) { if (zb->dio->inode != dio->inode) continue; if (zb->zero_block != zero_block) continue; list_del_init(&zb->dio_list); - spin_unlock(&dio_zero_block_lock); + spin_unlock(lock); wake_up(&zb->wq); dio_drop_zero_block(zb); return; } - spin_unlock(&dio_zero_block_lock); + spin_unlock(lock); } /* -- 1.7.1 From SRS0+DEPi+63+fromorbit.com=dave@internode.on.net Mon Aug 2 02:26:03 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_33, J_CHICKENPOX_63 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o727Q3u9177226 for ; Mon, 2 Aug 2010 02:26:03 -0500 X-ASG-Debug-ID: 1280733979-51fa03dc0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A5B7F4DD30A for ; Mon, 2 Aug 2010 00:26:20 -0700 (PDT) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id xo7iZAZ20BHPK30X for ; Mon, 02 Aug 2010 00:26:20 -0700 (PDT) Received: from dastard (unverified [121.44.216.100]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 33481696-1927428 for multiple; Mon, 02 Aug 2010 16:56:14 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OfpPY-0005TJ-BU; Mon, 02 Aug 2010 17:26:12 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OfpPI-0004ET-KT; Mon, 02 Aug 2010 17:25:56 +1000 From: Dave Chinner To: linux-fsdevel@vger.kernel.org Cc: xfs@oss.sgi.com, sandeen@sandeen.net X-ASG-Orig-Subj: [PATCH 1/2] dio: track and serialise unaligned direct IO Subject: [PATCH 1/2] dio: track and serialise unaligned direct IO Date: Mon, 2 Aug 2010 17:25:44 +1000 Message-Id: <1280733945-16231-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1280733945-16231-1-git-send-email-david@fromorbit.com> References: <1280733945-16231-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1280733981 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36794 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner If we get two unaligned direct IO's to the same filesystem block that is marked as a new allocation (i.e. buffer_new), then both IOs will zero the portion of the block they are not writing data to. As a result, when the IOs complete there will be a portion of the block that contains zeros from the last IO to complete rather than the data that should be there. This is easily manifested by qemu using aio+dio with an unaligned guest filesystem - every IO is unaligned and fileystem corruption is encountered in the guest filesystem. xfstest 240 (from Eric Sandeen) is also a simple reproducer. To avoid this problem, track unaligned IO that triggers sub-block zeroing and check new incoming unaligned IO that require sub-block zeroing against that list. If we get an overlap where the start and end of unaligned IOs hit the same filesystem block, then we need to block the incoming IOs until the IO that is zeroing the block completes. The blocked IO can then continue without needing to do any zeroing and hence won't overwrite valid data with zeros. Signed-off-by: Dave Chinner --- fs/direct-io.c | 152 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 146 insertions(+), 6 deletions(-) diff --git a/fs/direct-io.c b/fs/direct-io.c index a10cb91..611524e 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c @@ -71,6 +71,9 @@ struct dio { unsigned start_zero_done; /* flag: sub-blocksize zeroing has been performed at the start of a write */ +#define LAST_SECTOR ((sector_t)-1LL) + sector_t zero_block_front; /* fs block we are zeroing at front */ + sector_t zero_block_rear; /* fs block we are zeroing at rear */ int pages_in_io; /* approximate total IO pages */ size_t size; /* total request size (doesn't change)*/ sector_t block_in_file; /* Current offset into the underlying @@ -135,6 +138,101 @@ struct dio { struct page *pages[DIO_PAGES]; /* page buffer */ }; + +/* + * record fs blocks we are doing zeroing on in a zero block list. + * unaligned IO is not very performant and so is relatively uncommon, + * so a global list should be sufficent to track them. + */ +struct dio_zero_block { + struct list_head dio_list; /* list of io in progress */ + sector_t zero_block; /* block being zeroed */ + struct dio *dio; /* owner dio */ + wait_queue_head_t wq; /* New IO block here */ + atomic_t ref; /* reference count */ +}; + +DEFINE_SPINLOCK(dio_zero_block_lock); +LIST_HEAD(dio_zero_block_list); + +/* + * Add a filesystem block to the list of blocks we are tracking. + */ +static void +dio_start_zero_block(struct dio *dio, sector_t zero_block) +{ + struct dio_zero_block *zb; + + zb = kmalloc(sizeof(*zb), GFP_NOIO); + if (!zb) + return; + INIT_LIST_HEAD(&zb->dio_list); + init_waitqueue_head(&zb->wq); + zb->zero_block = zero_block; + zb->dio = dio; + atomic_set(&zb->ref, 1); + + spin_lock(&dio_zero_block_lock); + list_add(&zb->dio_list, &dio_zero_block_list); + spin_unlock(&dio_zero_block_lock); +} + +static void +dio_drop_zero_block(struct dio_zero_block *zb) +{ + if (atomic_dec_and_test(&zb->ref)) + kfree(zb); +} + +/* + * Check whether a filesystem block is currently being zeroed, and if it is + * wait for it to complete before returning. If we waited for a block being + * zeroed, return 1 to indicate that the block is already initialised, + * otherwise return 0 to indicate that it needs zeroing. + */ +static int +dio_wait_zero_block(struct dio *dio, sector_t zero_block) +{ + struct dio_zero_block *zb; + + spin_lock(&dio_zero_block_lock); + list_for_each_entry(zb, &dio_zero_block_list, dio_list) { + if (zb->dio->inode != dio->inode) + continue; + if (zb->zero_block != zero_block) + continue; + atomic_inc(&zb->ref); + spin_unlock(&dio_zero_block_lock); + wait_event(zb->wq, (list_empty(&zb->dio_list))); + dio_drop_zero_block(zb); + return 1; + } + spin_unlock(&dio_zero_block_lock); + return 0; +} + +/* + * Complete a block zeroing and wake up anyone waiting for it. + */ +static void dio_end_zero_block(struct dio *dio, sector_t zero_block) +{ + struct dio_zero_block *zb; + + spin_lock(&dio_zero_block_lock); + list_for_each_entry(zb, &dio_zero_block_list, dio_list) { + if (zb->dio->inode != dio->inode) + continue; + if (zb->zero_block != zero_block) + continue; + list_del_init(&zb->dio_list); + spin_unlock(&dio_zero_block_lock); + wake_up(&zb->wq); + dio_drop_zero_block(zb); + return; + } + spin_unlock(&dio_zero_block_lock); +} + /* * How many pages are in the queue? */ @@ -253,6 +351,11 @@ static int dio_complete(struct dio *dio, loff_t offset, int ret, bool is_async) aio_complete(dio->iocb, ret, 0); } + if (dio->zero_block_front != LAST_SECTOR) + dio_end_zero_block(dio, dio->zero_block_front); + if (dio->zero_block_rear != LAST_SECTOR) + dio_end_zero_block(dio, dio->zero_block_rear); + if (dio->flags & DIO_LOCKING) /* lockdep: non-owner release */ up_read_non_owner(&dio->inode->i_alloc_sem); @@ -777,6 +880,12 @@ static void clean_blockdev_aliases(struct dio *dio) * block with zeros. This happens only if user-buffer, fileoffset or * io length is not filesystem block-size multiple. * + * We need to track the blocks we are zeroing. If we have concurrent IOs that hit + * the same start or end block, we do not want all the IOs to zero the portion + * they are not writing data to as that will overwrite data from the other IOs. + * Hence we need to block until the first unaligned IO completes before we can + * continue (without executing any zeroing). + * * `end' is zero if we're doing the start of the IO, 1 at the end of the * IO. */ @@ -784,8 +893,8 @@ static void dio_zero_block(struct dio *dio, int end) { unsigned dio_blocks_per_fs_block; unsigned this_chunk_blocks; /* In dio_blocks */ - unsigned this_chunk_bytes; struct page *page; + sector_t fsblock; dio->start_zero_done = 1; if (!dio->blkfactor || !buffer_new(&dio->map_bh)) @@ -797,17 +906,41 @@ static void dio_zero_block(struct dio *dio, int end) if (!this_chunk_blocks) return; + if (end) + this_chunk_blocks = dio_blocks_per_fs_block - this_chunk_blocks; + /* * We need to zero out part of an fs block. It is either at the - * beginning or the end of the fs block. + * beginning or the end of the fs block, but first we need to check if + * there is already a zeroing being run on this block. + * + * If we are doing a sub-block IO (i.e. zeroing both front and rear of + * the same block) we don't need to wait or set a gaurd for the rear of + * the block as we already have one set. */ - if (end) - this_chunk_blocks = dio_blocks_per_fs_block - this_chunk_blocks; + fsblock = dio->block_in_file >> dio->blkfactor; + if (!end || dio->zero_block_front != fsblock) { - this_chunk_bytes = this_chunk_blocks << dio->blkbits; + /* wait for any zeroing already in progress */ + if (dio_wait_zero_block(dio, fsblock)) { + /* skip the range we would have zeroed. */ + dio->next_block_for_io += this_chunk_blocks; + return; + } + + /* + * we are going to zero stuff now, so set a guard to catch + * others that might want to zero the same block. + */ + dio_start_zero_block(dio, fsblock); + if (end) + dio->zero_block_rear = fsblock; + else + dio->zero_block_front = fsblock; + } page = ZERO_PAGE(0); - if (submit_page_section(dio, page, 0, this_chunk_bytes, + if (submit_page_section(dio, page, 0, this_chunk_blocks << dio->blkbits, dio->next_block_for_io)) return; @@ -1191,6 +1324,13 @@ __blockdev_direct_IO_newtrunc(int rw, struct kiocb *iocb, struct inode *inode, */ memset(dio, 0, offsetof(struct dio, pages)); + /* + * zero_blocks need to initialised to largeŃ•t value to avoid + * matching the zero block accidentally. + */ + dio->zero_block_front = LAST_SECTOR; + dio->zero_block_rear = LAST_SECTOR; + dio->flags = flags; if (dio->flags & DIO_LOCKING) { /* watch out for a 0 len io from a tricksy fs */ -- 1.7.1 From BATV+70fc035c0fcfd4a23151+2535+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 2 04:30:14 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o729UDB1181641 for ; Mon, 2 Aug 2010 04:30:14 -0500 X-ASG-Debug-ID: 1280741903-105100c80000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5CBE715CE763 for ; Mon, 2 Aug 2010 02:38:23 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id Z4V5JPN1Lna0HyeB for ; Mon, 02 Aug 2010 02:38:23 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OfrLk-0007UW-32; Mon, 02 Aug 2010 09:30:24 +0000 Date: Mon, 2 Aug 2010 05:30:24 -0400 From: Christoph Hellwig To: Dave Chinner Cc: linux-fsdevel@vger.kernel.org, sandeen@sandeen.net, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/2] dio: track and serialise unaligned direct IO Subject: Re: [PATCH 1/2] dio: track and serialise unaligned direct IO Message-ID: <20100802093024.GA7612@infradead.org> References: <1280733945-16231-1-git-send-email-david@fromorbit.com> <1280733945-16231-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1280733945-16231-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-08-17) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1280741904 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean > +DEFINE_SPINLOCK(dio_zero_block_lock); > +LIST_HEAD(dio_zero_block_list); These two should be static. Otherwise looks good, Reviewed-by: Christoph Hellwig From BATV+70fc035c0fcfd4a23151+2535+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 2 04:32:43 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o729Whak181777 for ; Mon, 2 Aug 2010 04:32:43 -0500 X-ASG-Debug-ID: 1280742053-107400d40000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 10B4A15CE77B for ; Mon, 2 Aug 2010 02:40:53 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id aXOqjyROA1ETjGVL for ; Mon, 02 Aug 2010 02:40:53 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OfrOF-0003Xb-V7; Mon, 02 Aug 2010 09:33:00 +0000 Date: Mon, 2 Aug 2010 05:32:59 -0400 From: Christoph Hellwig To: Dave Chinner Cc: linux-fsdevel@vger.kernel.org, sandeen@sandeen.net, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/2] dio: scale unaligned IO tracking via multiple lists Subject: Re: [PATCH 2/2] dio: scale unaligned IO tracking via multiple lists Message-ID: <20100802093259.GB7612@infradead.org> References: <1280733945-16231-1-git-send-email-david@fromorbit.com> <1280733945-16231-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1280733945-16231-3-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-08-17) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1280742054 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Aug 02, 2010 at 05:25:45PM +1000, Dave Chinner wrote: > From: Dave Chinner > > To avoid concerns that a single list and lock tracking the unaligned IOs > will not scale appropriately, create multiple lists and locks and chose them by > hashing the unaligned block being zeroed. > > Signed-off-by: Dave Chinner > --- > fs/direct-io.c | 53 ++++++++++++++++++++++++++++++++++++++++------------- > 1 files changed, 40 insertions(+), 13 deletions(-) > > diff --git a/fs/direct-io.c b/fs/direct-io.c > index 611524e..95dcba4 100644 > --- a/fs/direct-io.c > +++ b/fs/direct-io.c > @@ -152,8 +152,29 @@ struct dio_zero_block { > atomic_t ref; /* reference count */ > }; > > -DEFINE_SPINLOCK(dio_zero_block_lock); > -LIST_HEAD(dio_zero_block_list); > +#define DIO_ZERO_BLOCK_NR 37LL > +struct dio_zero_block_head { > + struct list_head list; > + spinlock_t lock; > +}; > + > +struct dio_zero_block_head dio_zero_blocks[DIO_ZERO_BLOCK_NR]; Again, should be static. > +#define to_dio_zero_list(zb) (&dio_zero_blocks[zb % DIO_ZERO_BLOCK_NR].list) > +#define to_dio_zero_lock(zb) (&dio_zero_blocks[zb % DIO_ZERO_BLOCK_NR].lock) > + struct list_head *list = to_dio_zero_list(zero_block); > + spinlock_t *lock = to_dio_zero_lock(zero_block); What about just finding the dio_zero_block_head and stuffing it into a local variable? Probably doesn't matter in the end anyway. Also looks good. If people really care about making this scale better we could also make it per-sb. One really big problem is that no one tells the users that unaligned direct I/O is a performance problem. We should add a variant of the XFS DIOINFO ioctl to the core VFS, including minimally required and optimal alignment values. From aelder@sgi.com Mon Aug 2 12:47:28 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o72HlSah199734 for ; Mon, 2 Aug 2010 12:47:28 -0500 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay3.corp.sgi.com (Postfix) with ESMTP id C7E81AC019; Mon, 2 Aug 2010 10:47:44 -0700 (PDT) Received: from [128.162.232.147] ([128.162.232.147]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Mon, 2 Aug 2010 12:47:44 -0500 Subject: Re: [PATCH] xfstests: have getfacl(1) report numeric id's From: Alex Elder Reply-To: aelder@sgi.com To: Christoph Hellwig Cc: xfs@oss.sgi.com In-Reply-To: <20100801141549.GB10192@infradead.org> References: <201007302154.o6ULsNdm008915@stout.americas.sgi.com> <20100801141549.GB10192@infradead.org> Content-Type: text/plain; charset="UTF-8" Date: Mon, 02 Aug 2010 12:47:44 -0500 Message-ID: <1280771264.2236.61.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 02 Aug 2010 17:47:44.0390 (UTC) FILETIME=[CFC4E260:01CB326A] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sun, 2010-08-01 at 10:15 -0400, Christoph Hellwig wrote: > On Fri, Jul 30, 2010 at 04:54:23PM -0500, Alex Elder wrote: > > This patch arranges for calls to getfacl(1) to be given the "-n" > > flag, which requests that user and group id's be listed numerically > > rather than using names. The affected test output files are also > > updated to indicate the effect of the change. > > > > This eliminates some spurious output differences I was seeing, due > > to the presence of NIS in my test environment. > > > > Signed-off-by: Alex Elder > > Looks good, > > > Reviewed-by: Christoph Hellwig > > I wonder if this usage should be documented somewhere for future tests. > Same goes for the use of _cat_passwd and _cat_group. I'll add something to the "README" file in the "Test script environment" section and will post that shortly. -Alex From aelder@sgi.com Mon Aug 2 12:50:44 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o72HoimQ199857 for ; Mon, 2 Aug 2010 12:50:44 -0500 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1ED838F804B for ; Mon, 2 Aug 2010 10:51:01 -0700 (PDT) Received: from [128.162.232.147] ([128.162.232.147]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Mon, 2 Aug 2010 12:51:00 -0500 Subject: [PATCH] xfstests: update README file to document some recent changes From: Alex Elder Reply-To: aelder@sgi.com To: xfs@oss.sgi.com Content-Type: text/plain; charset="UTF-8" Date: Mon, 02 Aug 2010 12:51:00 -0500 Message-ID: <1280771460.2236.68.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 02 Aug 2010 17:51:00.0985 (UTC) FILETIME=[44F2E690:01CB326B] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Update the README file to document the new _cat_passwd and _cat_group functions, and to recommend passing "-n" to getfacl(1) so it produces numeric output. Signed-off-by: Alex Elder --- README | 14 ++++++++++++++ 1 file changed, 14 insertions(+) Index: b/README =================================================================== --- a/README +++ b/README @@ -160,6 +160,20 @@ Test script environment: string DATE for deterministic output + _cat_passwd, - dump the content of the password + _cat_group or group file (both the local file + and the content of the NIS database + if it is likely to be present) + + 4. General recommendations, usage conventions, etc.: + - When the content of the password or group file is + required, get it using the _cat_passwd and _cat_group + functions, to ensure NIS information is included if NIS + is active. + - When calling getfacl in a test, pass the "-n" argument so + that numeric rather than symbolic identifiers are used in + the output. + Verified output: Each test script has a numerical name, e.g. 007, and an associated From aelder@oss.sgi.com Mon Aug 2 13:02:09 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o72I29O0200273 for ; Mon, 2 Aug 2010 13:02:09 -0500 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id o72I27CE200245; Mon, 2 Aug 2010 13:02:07 -0500 Date: Mon, 2 Aug 2010 13:02:07 -0500 Message-Id: <201008021802.o72I27CE200245@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, master, updated. v2.6.34-10537-g6b0a299 X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 209fb87a259ead17e966627b7f053d16a96898da X-Git-Newrev: 6b0a2996a0c023d84bc27ec7528a6e54cb5ea264 This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, master has been updated from 209fb87a259ead17e966627b7f053d16a96898da (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- ----------------------------------------------------------------------- Summary of changes: hooks/post-receive -- XFS development tree From aelder@oss.sgi.com Mon Aug 2 13:02:35 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o72I2Z9f200633 for ; Mon, 2 Aug 2010 13:02:35 -0500 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id o72I2Xwn200349; Mon, 2 Aug 2010 13:02:33 -0500 Date: Mon, 2 Aug 2010 13:02:33 -0500 Message-Id: <201008021802.o72I2Xwn200349@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-linus, updated. v2.6.34-10537-g6b0a299 X-Git-Refname: refs/heads/for-linus X-Git-Reftype: branch X-Git-Oldrev: 7b6259e7a83647948fa33a736cc832310c8d85aa X-Git-Newrev: 6b0a2996a0c023d84bc27ec7528a6e54cb5ea264 This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, for-linus has been updated 209fb87 xfs simplify and speed up direct I/O completions fb511f2 xfs: move aio completion after unwritten extent conversion 40e2e97 direct-io: move aio_complete into ->end_io 696123f xfs: fix big endian build ecd7f08 xfs: clean up xfs_bmap_get_bp 5d18898 xfs: simplify xfs_truncate_file 939d723 xfs: kill the b_strat callback in xfs_buf a64afb0 xfs: remove obsolete osyncisosync mount option 0664ce8 xfs: clean up filestreams helpers 73523a2 xfs: fix gcc 4.6 set but not read and unused statement warnings 0f1a932 xfs: Fix build when CONFIG_XFS_POSIX_ACL=n 3f34885 xfs: fix unsigned underflow in xfs_free_eofblocks aea1b95 xfs: use GFP_NOFS for page cache allocation 4a7eddd xfs: fix memory reclaim recursion deadlock on locked inode buffer 4386970 xfs: fix xfs_trans_add_item() lockdep warnings 2f11fea xfs: simplify and remove xfs_ireclaim ec53d1d xfs: don't block on buffer read errors a4190f9 xfs: move inode shrinker unregister even earlier fa17b25 xfs: remove a dmapi leftover 78558fe xfs: writepage always has buffers d4f7a5c xfs: allow writeback from kswapd 651701d xfs: remove incorrect log write optimization 2727ccc xfs: unregister inode shrinker before freeing filesystem structures cca28fb xfs: split xfs_itrace_entry f2d6761 xfs: remove xfs_iput ef35e92 xfs: remove xfs_iput_new d2e078c xfs: some iget tracing cleanups / fixes 807cbbd xfs: do not use emums for flags used in tracing 64c8614 xfs: remove explicit xfs_sync_data/xfs_sync_attr calls on umount f2bde9b xfs: small cleanups for xfs_iomap / __xfs_get_blocks 3070451 xfs: reduce stack usage in xfs_iomap 7a36c8a xfs: avoid synchronous transaction in xfs_fs_write_inode 20cb52e xfs: simplify xfs_vm_writepage 89f3b36 xfs: simplify xfs_vm_releasepage 3d9b02e xfs: fix corruption case for block size < page size b4e9181 xfs: remove unused delta tracking code in xfs_bmapi cd8b0bb xfs: remove unused XFS_BMAPI_ flags a59f557 xfs: remove the unused XFS_TRANS_NOSLEEP/XFS_TRANS_WAIT flags 9134c23 xfs: remove the unused XFS_LOG_SLEEP and XFS_LOG_NOSLEEP flags dbb2f65 xfs: kill the unused xlog_debug variable 4e0d5f9 xfs: fix the xfs_log_iovec i_addr type 898621d xfs: simplify inode to transaction joining 4d16e92 xfs: simplify buffer pinning ca30b2a xfs: give li_cb callbacks the correct prototype 7bfa31d xfs: give xfs_item_ops methods the correct prototypes 9412e31 xfs: merge iop_unpin_remove into iop_unpin e98c414 xfs: simplify log item descriptor tracking 3400777 xfs: remove unneeded #include statements 288699f xfs: drop dmapi hooks 16fd536 xfs: track AGs with reclaimable inodes in per-ag radix tree 70e60ce xfs: convert inode shrinker to per-filesystem contexts 7f8275d mm: add context argument to shrinker callback from 7b6259e7a83647948fa33a736cc832310c8d85aa (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 209fb87a259ead17e966627b7f053d16a96898da Author: Christoph Hellwig Date: Sun Jul 18 21:17:11 2010 +0000 xfs simplify and speed up direct I/O completions Our current handling of direct I/O completions is rather suboptimal, because we defer it to a workqueue more often than needed, and we perform a much to aggressive flush of the workqueue in case unwritten extent conversions happen. This patch changes the direct I/O reads to not even use a completion handler, as we don't bother to use it at all, and to perform the unwritten extent conversions in caller context for synchronous direct I/O. For a small I/O size direct I/O workload on a consumer grade SSD, such as the untar of a kernel tree inside qemu this patch gives speedups of about 5%. Getting us much closer to the speed of a native block device, or a fully allocated XFS file. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Alex Elder commit fb511f2150174b18b28ad54708c1adda0df39b17 Author: Christoph Hellwig Date: Sun Jul 18 21:17:10 2010 +0000 xfs: move aio completion after unwritten extent conversion If we write into an unwritten extent using AIO we need to complete the AIO request after the extent conversion has finished. Without that a read could race to see see the extent still unwritten and return zeros. For synchronous I/O we already take care of that by flushing the xfsconvertd workqueue (which might be a bit of overkill). To do that add iocb and result fields to struct xfs_ioend, so that we can call aio_complete from xfs_end_io after the extent conversion has happened. Note that we need a new result field as io_error is used for positive errno values, while the AIO code can return negative error values and positive transfer sizes. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Alex Elder commit 40e2e97316af6e62affab7a392e792494b8d9dde Author: Christoph Hellwig Date: Sun Jul 18 21:17:09 2010 +0000 direct-io: move aio_complete into ->end_io Filesystems with unwritten extent support must not complete an AIO request until the transaction to convert the extent has been commited. That means the aio_complete calls needs to be moved into the ->end_io callback so that the filesystem can control when to call it exactly. This makes a bit of a mess out of dio_complete and the ->end_io callback prototype even more complicated. Signed-off-by: Christoph Hellwig Reviewed-by: Jan Kara Signed-off-by: Alex Elder commit 696123fca877905696591829c97a2cef11c8d048 Author: Dave Chinner Date: Mon Jul 26 13:51:46 2010 -0500 xfs: fix big endian build Commit 0fd7275cc42ab734eaa1a2c747e65479bd1e42af ("xfs: fix gcc 4.6 set but not read and unused statement warnings") failed to convert some code inside XFS_NATIVE_HOST (big endian host code only) and hence fails to build on such machines. Fix it. Signed-off-by: Dave Chinner Signed-off-by: Alex Elder commit ecd7f082d68d7fb1c96bcf72071aa85db9c00ddf Author: Christoph Hellwig Date: Thu Jul 22 12:52:08 2010 +1000 xfs: clean up xfs_bmap_get_bp Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit 5d18898b20dfed5f373f8a9a7cbe01446036f8e9 Author: Christoph Hellwig Date: Tue Jul 20 17:51:31 2010 +1000 xfs: simplify xfs_truncate_file xfs_truncate_file is only used for truncating quota files. Move it to xfs_qm_syscalls.c so it can be marked static and take advatange of the fact by removing the unused page cache validation and taking the iget into the helper. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit 939d723b721eef71060201738653a73443ff4510 Author: Christoph Hellwig Date: Tue Jul 20 17:51:16 2010 +1000 xfs: kill the b_strat callback in xfs_buf The b_strat callback is used by xfs_buf_iostrategy to perform additional checks before submitting a buffer. It is used in xfs_bwrite and when writing out delayed buffers. In xfs_bwrite it we can de-virtualize the call easily as b_strat is set a few lines above the call to xfs_buf_iostrategy. For the delayed buffers the rationale is a bit more complicated: - there are three callers of xfs_buf_delwri_queue, which places buffers on the delwri list: (1) xfs_bdwrite - this sets up b_strat, so it's fine (2) xfs_buf_iorequest. None of the callers can have XBF_DELWRI set: - xlog_bdstrat is only used for log buffers, which are never delwri - _xfs_buf_read explicitly clears the delwri flag - xfs_buf_iodone_work retries log buffers only - xfsbdstrat - only used for reads, superblock writes without the delwri flag, log I/O and file zeroing with explicitly allocated buffers. - xfs_buf_iostrategy - only calls xfs_buf_iorequest if b_strat is not set (3) xfs_buf_unlock - only puts the buffer on the delwri list if the DELWRI flag is already set. The DELWRI flag is only ever set in xfs_bwrite, xfs_buf_iodone_callbacks, or xfs_trans_log_buf. For xfs_buf_iodone_callbacks and xfs_trans_log_buf we require an initialized buf item, which means b_strat was set to xfs_bdstrat_cb in xfs_buf_item_init. Conclusion: we can just get rid of the callback and replace it with explicit calls to xfs_bdstrat_cb. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit a64afb057b607c04383ab5fb53c51421ba18c434 Author: Christoph Hellwig Date: Tue Jul 20 17:50:52 2010 +1000 xfs: remove obsolete osyncisosync mount option Since Linux 2.6.33 the kernel has support for real O_SYNC, which made the osyncisosync option a no-op. Warn the users about this and remove the mount flag for it. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit 0664ce8d0fde731d76fa7e86b3afb54f3a6830ff Author: Christoph Hellwig Date: Tue Jul 20 17:31:01 2010 +1000 xfs: clean up filestreams helpers Move xfs_filestream_peek_ag, xxfs_filestream_get_ag and xfs_filestream_put_ag from xfs_filestream.h to xfs_filestream.c where it's only callers are, and remove the inline marker while we're at it to let the compiler decide on the inlining. Also don't return a value from xfs_filestream_put_ag because we don't need it. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit 73523a2ecf03f0bfe7c36c244aff8a2ef2208a4a Author: Christoph Hellwig Date: Tue Jul 20 17:54:45 2010 +1000 xfs: fix gcc 4.6 set but not read and unused statement warnings [hch: dropped a few hunks that need structural changes instead] Signed-off-by: Andi Kleen Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit 0f1a932f5d4d6ee71afb141914e2d5f11f27eee1 Author: Tony Luck Date: Tue Jul 20 17:54:41 2010 +1000 xfs: Fix build when CONFIG_XFS_POSIX_ACL=n When CONFIG_XFS_POSIX_ACL is not set "xfs_check_acl" is #defined to NULL - which breaks the code attempting to add a tracepoint on this function. Only define the tracepoint when the function exists. Signed-off-by: Tony Luck Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit 3f34885cd7c6a3f4deea48e3bbc704d91d5704f4 Author: Kulikov Vasiliy Date: Tue Jul 20 17:54:28 2010 +1000 xfs: fix unsigned underflow in xfs_free_eofblocks map_len is unsigned. Checking map_len <= 0 is buggy when it should be below zero. So, check exact expression instead of map_len. Signed-off-by: Kulikov Vasiliy Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit aea1b9532143218f8599ecedbbd6bfbf812385e1 Author: Dave Chinner Date: Tue Jul 20 17:54:12 2010 +1000 xfs: use GFP_NOFS for page cache allocation Avoid a lockdep warning by preventing page cache allocation from recursing back into the filesystem during memory reclaim. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Alex Elder Signed-off-by: Dave Chinner commit 4a7edddcb5b14ddb5962e6906b6fd6b500d7a361 Author: Dave Chinner Date: Tue Jul 20 17:53:59 2010 +1000 xfs: fix memory reclaim recursion deadlock on locked inode buffer Calling into memory reclaim with a locked inode buffer can deadlock if memory reclaim tries to lock the inode buffer during inode teardown. Convert the relevant memory allocations to use KM_NOFS to avoid this deadlock condition. Reported-by: Peter Watkins Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Alex Elder Signed-off-by: Dave Chinner commit 438697064aaa2f64e0fcc6586582a3e7ec36005b Author: Dave Chinner Date: Tue Jul 20 17:53:44 2010 +1000 xfs: fix xfs_trans_add_item() lockdep warnings xfs_trans_add_item() is called with ip->i_ilock held, which means it is unsafe for memory reclaim to recurse back into the filesystem (ilock is required in writeback). Hence the allocation needs to be KM_NOFS to avoid recursion. Lockdep report indicating memory allocation being called with the ip->i_ilock held is as follows: [ 1749.866796] ================================= [ 1749.867788] [ INFO: inconsistent lock state ] [ 1749.868327] 2.6.35-rc3-dgc+ #25 [ 1749.868741] --------------------------------- [ 1749.868741] inconsistent {IN-RECLAIM_FS-W} -> {RECLAIM_FS-ON-W} usage. [ 1749.868741] dd/2835 [HC0[0]:SC0[0]:HE1:SE1] takes: [ 1749.868741] (&(&ip->i_lock)->mr_lock){++++?.}, at: [] xfs_ilock+0x10b/0x190 [ 1749.868741] {IN-RECLAIM_FS-W} state was registered at: [ 1749.868741] [] __lock_acquire+0x437/0x1450 [ 1749.868741] [] lock_acquire+0xa6/0x160 [ 1749.868741] [] down_write_nested+0x65/0xb0 [ 1749.868741] [] xfs_ilock+0x10b/0x190 [ 1749.868741] [] xfs_reclaim_inode+0x99/0x310 [ 1749.868741] [] xfs_inode_ag_walk+0x8b/0x150 [ 1749.868741] [] xfs_inode_ag_iterator+0x8b/0xf0 [ 1749.868741] [] xfs_reclaim_inode_shrink+0x88/0x90 [ 1749.868741] [] shrink_slab+0x137/0x1a0 [ 1749.868741] [] balance_pgdat+0x421/0x6a0 [ 1749.868741] [] kswapd+0x11d/0x320 [ 1749.868741] [] kthread+0x96/0xa0 [ 1749.868741] [] kernel_thread_helper+0x4/0x10 [ 1749.868741] irq event stamp: 4234335 [ 1749.868741] hardirqs last enabled at (4234335): [] kmem_cache_free+0x115/0x220 [ 1749.868741] hardirqs last disabled at (4234334): [] kmem_cache_free+0x3d/0x220 [ 1749.868741] softirqs last enabled at (4233112): [] __do_softirq+0x142/0x260 [ 1749.868741] softirqs last disabled at (4233095): [] call_softirq+0x1c/0x50 [ 1749.868741] [ 1749.868741] other info that might help us debug this: [ 1749.868741] 2 locks held by dd/2835: [ 1749.868741] #0: (&(&ip->i_iolock)->mr_lock#2){+.+.+.}, at: [] xfs_ilock_nowait+0xed/0x200 [ 1749.868741] #1: (&(&ip->i_lock)->mr_lock){++++?.}, at: [] xfs_ilock+0x10b/0x190 [ 1749.868741] [ 1749.868741] stack backtrace: [ 1749.868741] Pid: 2835, comm: dd Not tainted 2.6.35-rc3-dgc+ #25 [ 1749.868741] Call Trace: [ 1749.868741] [] print_usage_bug+0x18a/0x190 [ 1749.868741] [] ? save_stack_trace+0x2f/0x50 [ 1749.868741] [] ? check_usage_backwards+0x0/0xf0 [ 1749.868741] [] mark_lock+0x331/0x400 [ 1749.868741] [] mark_held_locks+0x67/0x90 [ 1749.868741] [] lockdep_trace_alloc+0xa1/0xe0 [ 1749.868741] [] kmem_cache_alloc+0x39/0x1e0 [ 1749.868741] [] kmem_zone_alloc+0x94/0xe0 [ 1749.868741] [] kmem_zone_zalloc+0x1e/0x50 [ 1749.868741] [] xfs_trans_add_item+0x72/0xb0 [ 1749.868741] [] xfs_trans_ijoin+0xa1/0xd0 [ 1749.868741] [] xfs_itruncate_finish+0x312/0x5d0 [ 1749.868741] [] xfs_free_eofblocks+0x227/0x280 [ 1749.868741] [] xfs_release+0x138/0x190 [ 1749.868741] [] xfs_file_release+0x15/0x20 [ 1749.868741] [] fput+0x13f/0x260 [ 1749.868741] [] filp_close+0x52/0x80 [ 1749.868741] [] sys_close+0xb9/0x120 [ 1749.868741] [] system_call_fastpath+0x16/0x1b Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Alex Elder Signed-off-by: Dave Chinner commit 2f11feabb19748c0ffa2eb82d438e8a91b9f6ea0 Author: Dave Chinner Date: Tue Jul 20 17:53:25 2010 +1000 xfs: simplify and remove xfs_ireclaim xfs_ireclaim has to get and put te pag structure because it is only called with the inode to reclaim. The one caller of this function already has a reference on the pag and a pointer to is, so move the radix tree delete to the caller and remove xfs_ireclaim completely. This avoids a xfs_perag_get/put on every inode being reclaimed. The overhead was noticed in a bug report at: https://bugzilla.kernel.org/show_bug.cgi?id=16348 Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Alex Elder Signed-off-by: Dave Chinner commit ec53d1dbb3ca960e7b552397613358ba1dbd12bd Author: Dave Chinner Date: Tue Jul 20 17:52:59 2010 +1000 xfs: don't block on buffer read errors xfs_buf_read() fails to detect dispatch errors before attempting to wait on sychronous IO. If there was an error, it will get stuck forever, waiting for an I/O that was never started. Make sure the error is detected correctly. Further, such a failure can leave locked pages in the page cache which will cause a later operation to hang on the page. Ensure that we correctly process pages in the buffers when we get a dispatch error. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit a4190f90b4e22bde8b01b0086e00dd95439e2edd Author: Dave Chinner Date: Mon Jul 12 06:40:58 2010 +0000 xfs: move inode shrinker unregister even earlier I missed Dave Chinner's second revision of this change, and pushed his first version out to the repository instead. commit a476c59ebb279d738718edc0e3fb76aab3687114 Author: Dave Chinner This commit compensates for that by moving a block of code up a bit further, with a result that matches the the effect of Dave's second version. Dave's first version was: Reviewed-by: Eric Sandeen Dave's second version was: Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder Reviewed-by: Eric Sandeen commit fa17b25e9f95375081b43a741cf1c188682ec588 Author: Christoph Hellwig Date: Sat Jul 3 09:21:17 2010 +0000 xfs: remove a dmapi leftover The open_exec file operation is only added by the external dmapi patch. Signed-off-by: Christoph Hellwig Reviewed-by: Alex Elder Signed-off-by: Alex Elder commit 78558fe8d8326b2395da33456cd9eec57ffc081a Author: Christoph Hellwig Date: Mon Jun 28 10:34:57 2010 -0400 xfs: writepage always has buffers These days we always have buffers thanks to ->page_mkwrite. And we already have an assert a few lines above tripping in case that was not true due to a bug. Signed-off-by: Christoph Hellwig Signed-off-by: Alex Elder commit d4f7a5cbd5449a3d2097f601f588886ea7b70dc3 Author: Christoph Hellwig Date: Mon Jun 28 10:34:44 2010 -0400 xfs: allow writeback from kswapd We only need disable I/O from direct or memcg reclaim. Signed-off-by: Christoph Hellwig Signed-off-by: Alex Elder commit 651701d71da4dc0ac607f17a638e77906f0d280e Author: Christoph Hellwig Date: Mon Jun 28 10:34:34 2010 -0400 xfs: remove incorrect log write optimization We do need a barrier for the first buffer of a split log write. Otherwise we might incorrectly stamp the tail LSN into transactions in the first part of the split write, or not flush data I/O before updating the inode size. Signed-off-by: Christoph Hellwig Signed-off-by: Alex Elder commit 2727ccc950ae17375b15005403e1c35ba8fec1df Author: Dave Chinner Date: Fri Jun 25 11:08:40 2010 +1000 xfs: unregister inode shrinker before freeing filesystem structures Currently we don't remove the XFS mount from the shrinker list until late in the unmount path. By this time, we have already torn down the internals of the filesystem (e.g. the per-ag structures), and hence if the shrinker is executed between the teardown and the unregistering, the shrinker will get NULL per-ag structure pointers and panic trying to dereference them. Fix this by removing the xfs mount from the shrinker list before tearing down it's internal structures. Signed-off-by: Dave Chinner Reviewed-by: Eric Sandeen Signed-off-by: Alex Elder commit cca28fb83d9e60779bb348edc33a62068e5f04a4 Author: Christoph Hellwig Date: Thu Jun 24 11:57:09 2010 +1000 xfs: split xfs_itrace_entry Replace the xfs_itrace_entry catchall with specific trace points. For most simple callers we now use the simple inode class, which used to be the iget class, but add more details tracing for namespace events, which now includes the name of the directory entries manipulated. Remove the xfs_inactive trace point, which is a duplicate of the clear_inode one, and the xfs_change_file_space trace point, which is immediately followed by the more specific alloc/free space trace points. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner commit f2d6761433d69d94e0b39ac44ef0f0f0b0508065 Author: Christoph Hellwig Date: Thu Jun 24 11:52:50 2010 +1000 xfs: remove xfs_iput xfs_iput is just a small wrapper for xfs_iunlock + IRELE. Having this out of line wrapper means the trace events in those two can't track their caller properly. So just remove the wrapper and opencode the unlock + rele in the few callers. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner commit ef35e9255d4ed12522e836fbcec861e7306d794a Author: Christoph Hellwig Date: Thu Jun 24 11:51:19 2010 +1000 xfs: remove xfs_iput_new We never get an i_mode of 0 or a locked VFS inode until we pass in the XFS_IGET_CREATE flag to xfs_iget, which makes xfs_iput_new equivalent to xfs_iput for the only caller. In addition to that xfs_nfs_get_inode does not even need to lock the inode given that the generation never changes for a life inode, so just pass a 0 lock_flags to xfs_iget and release the inode using IRELE in the error path. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner commit d2e078c33c24f97411b0fdd7cd2173e68125e7e3 Author: Christoph Hellwig Date: Thu Jun 24 11:50:22 2010 +1000 xfs: some iget tracing cleanups / fixes The xfs_iget_alloc/found tracepoints are a bit misnamed and misplaced. Rename them to xfs_iget_hit/xfs_iget_miss and move them to the beggining of the xfs_iget_cache_hit/miss functions. Add a new xfs_iget_reclaim_fail tracepoint for the case where we fail to re-initialize a VFS inode, and add a second instance of the xfs_iget_skip tracepoint for the case of a failed igrab() call. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner commit 807cbbdb438d172b87b380eebc1f1c1a5a3549b2 Author: Christoph Hellwig Date: Thu Jun 24 11:49:12 2010 +1000 xfs: do not use emums for flags used in tracing The tracing code can't print flags defined as enums. Most flags that we want to print are defines as macros already, but move the few remaining ones over to make the trace output more useful. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner commit 64c86149410bc62d9ac27a0594b3402a2aca03d8 Author: Christoph Hellwig Date: Thu Jun 24 11:45:34 2010 +1000 xfs: remove explicit xfs_sync_data/xfs_sync_attr calls on umount On the final put of a superblock the VFS already calls sync_filesystem for us to write out all data and wait for it. No need to start another asynchronous writeback inside ->put_super. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner commit f2bde9b89b4d67c9bc3b963cb996f449ddcd27a4 Author: Christoph Hellwig Date: Thu Jun 24 11:44:35 2010 +1000 xfs: small cleanups for xfs_iomap / __xfs_get_blocks Remove the flags argument to __xfs_get_blocks as we can easily derive it from the direct argument, and remove the unused BMAPI_MMAP flag. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner commit 3070451eea1ed8e3bde0573183c7d8ac25fd5e97 Author: Christoph Hellwig Date: Thu Jun 24 11:42:19 2010 +1000 xfs: reduce stack usage in xfs_iomap xfs_iomap passes a xfs_bmbt_irec pointer to xfs_iomap_write_direct and xfs_iomap_write_allocate to give them the results of our read-only xfs_bmapi query. Instead of allocating a new xfs_bmbt_irec on stack for the next call to xfs_bmapi re use the one we got passed as it's not used after this point. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner commit 7a36c8a98a7dd05756bb147be2ac350325ff5830 Author: Christoph Hellwig Date: Thu Jun 24 11:39:25 2010 +1000 xfs: avoid synchronous transaction in xfs_fs_write_inode We already rely on the fact that the sync code will cause a synchronous log force later on (currently via xfs_fs_sync_fs -> xfs_quiesce_data -> xfs_sync_data), so no need to do this here. This allows us to avoid a lot of synchronous log forces during sync, which pays of especially with delayed logging enabled. Some compilebench numbers that show this: xfs (delayed logging, 256k logbufs) =================================== intial create 25.94 MB/s 25.75 MB/s 25.64 MB/s create 8.54 MB/s 9.12 MB/s 9.15 MB/s patch 2.47 MB/s 2.47 MB/s 3.17 MB/s compile 29.65 MB/s 30.51 MB/s 27.33 MB/s clean 90.92 MB/s 98.83 MB/s 128.87 MB/s read tree 11.90 MB/s 11.84 MB/s 8.56 MB/s read compiled 28.75 MB/s 29.96 MB/s 24.25 MB/s delete tree 8.39 seconds 8.12 seconds 8.46 seconds delete compiled 8.35 seconds 8.44 seconds 5.11 seconds stat tree 6.03 seconds 5.59 seconds 5.19 seconds stat compiled tree 9.00 seconds 9.52 seconds 8.49 seconds xfs + write_inode log_force removal =================================== intial create 25.87 MB/s 25.76 MB/s 25.87 MB/s create 15.18 MB/s 14.80 MB/s 14.94 MB/s patch 3.13 MB/s 3.14 MB/s 3.11 MB/s compile 36.74 MB/s 37.17 MB/s 36.84 MB/s clean 226.02 MB/s 222.58 MB/s 217.94 MB/s read tree 15.14 MB/s 15.02 MB/s 15.14 MB/s read compiled tree 29.30 MB/s 29.31 MB/s 29.32 MB/s delete tree 6.22 seconds 6.14 seconds 6.15 seconds delete compiled tree 5.75 seconds 5.92 seconds 5.81 seconds stat tree 4.60 seconds 4.51 seconds 4.56 seconds stat compiled tree 4.07 seconds 3.87 seconds 3.96 seconds In addition to that also remove the delwri inode flush that is unessecary now that bulkstat is always coherent. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner commit 20cb52ebd1b5ca6fa8a5d9b6b1392292f5ca8a45 Author: Christoph Hellwig Date: Thu Jun 24 09:46:01 2010 +1000 xfs: simplify xfs_vm_writepage The writepage implementation in XFS still tries to deal with dirty but unmapped buffers which used to caused by writes through shared mmaps. Since the introduction of ->page_mkwrite these can't happen anymore, so remove the code dealing with them. Note that the all_bh variable which causes us to start I/O on all buffers on the pages was controlled by the count of unmapped buffers, which also included those not actually dirty. It's now unconditionally initialized to 0 but set to 1 for the case of small file size extensions. It probably can be removed entirely, but that's left for another patch. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner commit 89f3b363967a958e756a549c8747c1fb9c930c1a Author: Christoph Hellwig Date: Thu Jun 24 09:45:48 2010 +1000 xfs: simplify xfs_vm_releasepage Currently the xfs releasepage implementation has code to deal with converting delayed allocated and unwritten space. But we never get called for those as we always convert delayed and unwritten space when cleaning a page, or drop the state from the buffers in block_invalidatepage. We still keep a WARN_ON on those cases for now, but remove all the case dealing with it, which allows to fold xfs_page_state_convert into xfs_vm_writepage and remove the !startio case from the whole writeback path. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner commit 3d9b02e3c76531687ab5314e0edf266256f13c2d Author: Eric Sandeen Date: Thu Jun 24 09:45:30 2010 +1000 xfs: fix corruption case for block size < page size xfstests 194 first truncats a file back and then extends it again by truncating it to a larger size. This causes discard_buffer to drop the mapped, but not the uptodate bit and thus creates something that xfs_page_state_convert takes for unmapped space created by mmap because it doesn't check for the dirty bit, which also gets cleared by discard_buffer and checked by other ->writepage implementations like block_write_full_page. Handle this kind of buffers early, and unlike Eric's first version of the patch simply ASSERT that the buffers is dirty, given that the mmap write case can't happen anymore since the introduction of ->page_mkwrite. The now dead code dealing with that will be deleted in a follow on patch. Signed-off-by: Eric Sandeen Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner commit b4e9181e772b0c8b9038c5822ead368b96c2b533 Author: Christoph Hellwig Date: Wed Jun 23 18:11:15 2010 +1000 xfs: remove unused delta tracking code in xfs_bmapi This code was introduced four years ago in commit 3e57ecf640428c01ba1ed8c8fc538447ada1715b without any review and has been unused since. Remove it just as the rest of the code introduced in that commit to reduce that stack usage and complexity in this central piece of code. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner commit cd8b0bb3c49d0691e9e7b4cf19e21ca63b92c053 Author: Christoph Hellwig Date: Wed Jun 23 18:11:15 2010 +1000 xfs: remove unused XFS_BMAPI_ flags Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner commit a59f55703c3725b2fa582924f51db62b58be05bb Author: Christoph Hellwig Date: Wed Jun 23 18:11:15 2010 +1000 xfs: remove the unused XFS_TRANS_NOSLEEP/XFS_TRANS_WAIT flags Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner commit 9134c2332ecb9154860669d778ef2808f06503ec Author: Christoph Hellwig Date: Wed Jun 23 18:11:15 2010 +1000 xfs: remove the unused XFS_LOG_SLEEP and XFS_LOG_NOSLEEP flags Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner commit dbb2f6529feeee8f4de77849edeee2e60c40c805 Author: Christoph Hellwig Date: Wed Jun 23 18:11:15 2010 +1000 xfs: kill the unused xlog_debug variable Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner commit 4e0d5f926b80b06234a4ed664d6ae8c54fb08c4b Author: Christoph Hellwig Date: Wed Jun 23 18:11:15 2010 +1000 xfs: fix the xfs_log_iovec i_addr type By making this member a void pointer we can get rid of a lot of pointless casts. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner commit 898621d5a72c6799a9a13fce20443b4b6699899c Author: Christoph Hellwig Date: Thu Jun 24 11:36:58 2010 +1000 xfs: simplify inode to transaction joining Currently we need to either call IHOLD or xfs_trans_ihold on an inode when joining it to a transaction via xfs_trans_ijoin. This patches instead makes xfs_trans_ijoin usable on it's own by doing an implicity xfs_trans_ihold, which also allows us to drop the third argument. For the case where we want to hold a reference on the inode a xfs_trans_ijoin_ref wrapper is added which does the IHOLD and marks the inode for needing an xfs_iput. In addition to the cleaner interface to the caller this also simplifies the implementation. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner commit 4d16e9246fc3b3cf7bc95609eff66929a39daa06 Author: Christoph Hellwig Date: Wed Jun 23 18:11:15 2010 +1000 xfs: simplify buffer pinning Get rid of the xfs_buf_pin/xfs_buf_unpin/xfs_buf_ispin helpers and opencode them in their only callers, just like we did for the inode pinning a while ago. Also remove duplicate trace points - the bufitem tracepoints cover all the information that is present in a buffer tracepoint. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner commit ca30b2a7b7ac899ac4da6030ccbebf2f137b8e6d Author: Christoph Hellwig Date: Wed Jun 23 18:11:15 2010 +1000 xfs: give li_cb callbacks the correct prototype Stop the function pointer casting madness and give all the li_cb instances correct prototype. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner commit 7bfa31d8e0f90b65ff23be94fca65ce261b43fc8 Author: Christoph Hellwig Date: Wed Jun 23 18:11:15 2010 +1000 xfs: give xfs_item_ops methods the correct prototypes Stop the function pointer casting madness and give all the xfs_item_ops the correct prototypes. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner commit 9412e3181c0ef82efc3d8e88d73e583ec10c34e9 Author: Christoph Hellwig Date: Wed Jun 23 18:11:15 2010 +1000 xfs: merge iop_unpin_remove into iop_unpin The unpin_remove item operation instances always share most of the implementation with the respective unpin implementation. So instead of keeping two different entry points add a remove flag to the unpin operation and share the code more easily. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner commit e98c414f9a3134fe7efc56ef8f1d394b54bfd40e Author: Christoph Hellwig Date: Wed Jun 23 18:11:15 2010 +1000 xfs: simplify log item descriptor tracking Currently we track log item descriptor belonging to a transaction using a complex opencoded chunk allocator. This code has been there since day one and seems to work around the lack of an efficient slab allocator. This patch replaces it with dynamically allocated log item descriptors from a dedicated slab pool, linked to the transaction by a linked list. This allows to greatly simplify the log item descriptor tracking to the point where it's just a couple hundred lines in xfs_trans.c instead of a separate file. The external API has also been simplified while we're at it - the xfs_trans_add_item and xfs_trans_del_item functions to add/ delete items from a transaction have been simplified to the bare minium, and the xfs_trans_find_item function is replaced with a direct dereference of the li_desc field. All debug code walking the list of log items in a transaction is down to a simple list_for_each_entry. Note that we could easily use a singly linked list here instead of the double linked list from list.h as the fastpath only does deletion from sequential traversal. But given that we don't have one available as a library function yet I use the list.h functions for simplicity. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner commit 3400777ff03a3cd4fdbc6cb15676fc7e7ceefc00 Author: Christoph Hellwig Date: Wed Jun 23 18:11:15 2010 +1000 xfs: remove unneeded #include statements Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner commit 288699fecaffa1ef8f75f92020cbb593a772e487 Author: Christoph Hellwig Date: Wed Jun 23 18:11:15 2010 +1000 xfs: drop dmapi hooks Dmapi support was never merged upstream, but we still have a lot of hooks bloating XFS for it, all over the fast pathes of the filesystem. This patch drops over 700 lines of dmapi overhead. If we'll ever get HSM support in mainline at least the namespace events can be done much saner in the VFS instead of the individual filesystem, so it's not like this is much help for future work. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner commit 16fd5367370099b59d96e30bb7d9de8d419659f2 Author: Dave Chinner Date: Tue Jul 20 09:43:39 2010 +1000 xfs: track AGs with reclaimable inodes in per-ag radix tree https://bugzilla.kernel.org/show_bug.cgi?id=16348 When the filesystem grows to a large number of allocation groups, the summing of recalimable inodes gets expensive. In many cases, most AGs won't have any reclaimable inodes and so we are wasting CPU time aggregating over these AGs. This is particularly important for the inode shrinker that gets called frequently under memory pressure. To avoid the overhead, track AGs with reclaimable inodes in the per-ag radix tree so that we can find all the AGs with reclaimable inodes via a simple gang tag lookup. This involves setting the tag when the first reclaimable inode is tracked in the AG, and removing the tag when the last reclaimable inode is removed from the tree. Then the summation process becomes a loop walking the radix tree summing AGs with the reclaim tag set. This significantly reduces the overhead of scanning - a 6400 AG filesystea now only uses about 25% of a cpu in kswapd while slab reclaim progresses instead of being permanently stuck at 100% CPU and making little progress. Clean filesystems filesystems will see no overhead and the overhead only increases linearly with the number of dirty AGs. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit 70e60ce71516c3a9e882edb70a09f696a05961db Author: Dave Chinner Date: Tue Jul 20 08:07:02 2010 +1000 xfs: convert inode shrinker to per-filesystem contexts Now the shrinker passes us a context, wire up a shrinker context per filesystem. This allows us to remove the global mount list and the locking problems that introduced. It also means that a shrinker call does not need to traverse clean filesystems before finding a filesystem with reclaimable inodes. This significantly reduces scanning overhead when lots of filesystems are present. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit 7f8275d0d660c146de6ee3017e1e2e594c49e820 Author: Dave Chinner Date: Mon Jul 19 14:56:17 2010 +1000 mm: add context argument to shrinker callback The current shrinker implementation requires the registered callback to have global state to work from. This makes it difficult to shrink caches that are not global (e.g. per-filesystem caches). Pass the shrinker structure to the callback so that users can embed the shrinker structure in the context the shrinker needs to operate on and get back to it in the callback via container_of(). Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig ----------------------------------------------------------------------- Summary of changes: fs/xfs/Makefile | 4 +- fs/xfs/linux-2.6/xfs_acl.c | 2 +- fs/xfs/linux-2.6/xfs_aops.c | 611 +++++++++++++------------------------ fs/xfs/linux-2.6/xfs_aops.h | 4 +- fs/xfs/linux-2.6/xfs_buf.c | 67 ++--- fs/xfs/linux-2.6/xfs_buf.h | 119 ++++---- fs/xfs/linux-2.6/xfs_dmapi_priv.h | 28 -- fs/xfs/linux-2.6/xfs_export.c | 8 +- fs/xfs/linux-2.6/xfs_file.c | 104 +------ fs/xfs/linux-2.6/xfs_fs_subr.c | 4 - fs/xfs/linux-2.6/xfs_fs_subr.h | 25 -- fs/xfs/linux-2.6/xfs_ioctl.c | 27 +-- fs/xfs/linux-2.6/xfs_ioctl32.c | 6 +- fs/xfs/linux-2.6/xfs_iops.c | 10 +- fs/xfs/linux-2.6/xfs_linux.h | 1 - fs/xfs/linux-2.6/xfs_quotaops.c | 1 - fs/xfs/linux-2.6/xfs_super.c | 173 ++++-------- fs/xfs/linux-2.6/xfs_super.h | 7 - fs/xfs/linux-2.6/xfs_sync.c | 179 +++++++----- fs/xfs/linux-2.6/xfs_sync.h | 5 - fs/xfs/linux-2.6/xfs_trace.c | 4 - fs/xfs/linux-2.6/xfs_trace.h | 131 ++++++-- fs/xfs/quota/xfs_dquot.c | 114 +++---- fs/xfs/quota/xfs_dquot_item.c | 301 ++++++++----------- fs/xfs/quota/xfs_qm.c | 22 +- fs/xfs/quota/xfs_qm_bhv.c | 10 - fs/xfs/quota/xfs_qm_stats.c | 10 - fs/xfs/quota/xfs_qm_syscalls.c | 89 ++++-- fs/xfs/quota/xfs_trans_dquot.c | 35 +-- fs/xfs/support/debug.c | 1 - fs/xfs/xfs_alloc.c | 15 +- fs/xfs/xfs_alloc.h | 20 +- fs/xfs/xfs_alloc_btree.c | 5 - fs/xfs/xfs_attr.c | 91 ++---- fs/xfs/xfs_attr_leaf.c | 5 +- fs/xfs/xfs_bmap.c | 327 +++----------------- fs/xfs/xfs_bmap.h | 37 +-- fs/xfs/xfs_bmap_btree.c | 5 - fs/xfs/xfs_btree.c | 5 - fs/xfs/xfs_buf_item.c | 228 +++++++-------- fs/xfs/xfs_buf_item.h | 2 +- fs/xfs/xfs_da_btree.c | 20 +- fs/xfs/xfs_dfrag.c | 16 +- fs/xfs/xfs_dir2.c | 11 +- fs/xfs/xfs_dir2_block.c | 8 +- fs/xfs/xfs_dir2_data.c | 2 - fs/xfs/xfs_dir2_leaf.c | 4 +- fs/xfs/xfs_dir2_node.c | 2 - fs/xfs/xfs_dir2_sf.c | 2 - fs/xfs/xfs_dmapi.h | 170 ---------- fs/xfs/xfs_dmops.c | 55 ---- fs/xfs/xfs_error.c | 4 - fs/xfs/xfs_extfree_item.c | 278 +++++++---------- fs/xfs/xfs_filestream.c | 84 +++++- fs/xfs/xfs_filestream.h | 82 ----- fs/xfs/xfs_fsops.c | 7 +- fs/xfs/xfs_ialloc.c | 4 - fs/xfs/xfs_ialloc_btree.c | 4 - fs/xfs/xfs_iget.c | 108 +------- fs/xfs/xfs_inode.c | 60 ++--- fs/xfs/xfs_inode.h | 4 +- fs/xfs/xfs_inode_item.c | 273 ++++++----------- fs/xfs/xfs_inode_item.h | 12 +- fs/xfs/xfs_iomap.c | 76 +++--- fs/xfs/xfs_iomap.h | 22 +- fs/xfs/xfs_itable.c | 8 +- fs/xfs/xfs_log.c | 16 +- fs/xfs/xfs_log.h | 11 +- fs/xfs/xfs_log_cil.c | 4 +- fs/xfs/xfs_log_recover.c | 42 +-- fs/xfs/xfs_mount.c | 3 - fs/xfs/xfs_mount.h | 71 +----- fs/xfs/xfs_rename.c | 63 +---- fs/xfs/xfs_rtalloc.c | 9 +- fs/xfs/xfs_rw.c | 15 - fs/xfs/xfs_trans.c | 211 ++++++++----- fs/xfs/xfs_trans.h | 117 +------- fs/xfs/xfs_trans_ail.c | 1 - fs/xfs/xfs_trans_buf.c | 75 +---- fs/xfs/xfs_trans_extfree.c | 23 +- fs/xfs/xfs_trans_inode.c | 74 ++--- fs/xfs/xfs_trans_item.c | 441 -------------------------- fs/xfs/xfs_trans_priv.h | 18 +- fs/xfs/xfs_utils.c | 87 ------ fs/xfs/xfs_utils.h | 1 - fs/xfs/xfs_vnodeops.c | 293 ++++-------------- 86 files changed, 1681 insertions(+), 4052 deletions(-) delete mode 100644 fs/xfs/linux-2.6/xfs_dmapi_priv.h delete mode 100644 fs/xfs/linux-2.6/xfs_fs_subr.h delete mode 100644 fs/xfs/xfs_dmapi.h delete mode 100644 fs/xfs/xfs_dmops.c delete mode 100644 fs/xfs/xfs_trans_item.c hooks/post-receive -- XFS development tree From aelder@sgi.com Mon Aug 2 13:44:45 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o72IiitQ202590 for ; Mon, 2 Aug 2010 13:44:44 -0500 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay3.corp.sgi.com (Postfix) with ESMTP id C1459AC006; Mon, 2 Aug 2010 11:45:00 -0700 (PDT) Received: from stout.americas.sgi.com (localhost6.localdomain6 [127.0.0.1]) by stout.americas.sgi.com (8.14.3/8.14.2) with ESMTP id o72Ij0H8021378; Mon, 2 Aug 2010 13:45:00 -0500 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o72Ij016021377; Mon, 2 Aug 2010 13:45:00 -0500 From: Alex Elder Message-Id: <201008021845.o72Ij016021377@stout.americas.sgi.com> Date: Mon, 02 Aug 2010 13:44:59 -0500 To: torvalds@linux-foundation.org Subject: [GIT PULL] XFS update for 2.6.36-rc1 Cc: linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org User-Agent: Heirloom mailx 12.4 7/29/08 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean The following changes since commit 9fe6206f400646a2322096b56c59891d530e8d51: Linux 2.6.35 (2010-08-01 15:11:14 -0700) are available in the git repository at: git://oss.sgi.com/xfs/xfs for-linus Alex Elder (1): Merge branch 'v2.6.35' Christoph Hellwig (38): xfs: drop dmapi hooks xfs: remove unneeded #include statements xfs: simplify log item descriptor tracking xfs: merge iop_unpin_remove into iop_unpin xfs: give xfs_item_ops methods the correct prototypes xfs: give li_cb callbacks the correct prototype xfs: simplify buffer pinning xfs: simplify inode to transaction joining xfs: fix the xfs_log_iovec i_addr type xfs: kill the unused xlog_debug variable xfs: remove the unused XFS_LOG_SLEEP and XFS_LOG_NOSLEEP flags xfs: remove the unused XFS_TRANS_NOSLEEP/XFS_TRANS_WAIT flags xfs: remove unused XFS_BMAPI_ flags xfs: remove unused delta tracking code in xfs_bmapi xfs: simplify xfs_vm_releasepage xfs: simplify xfs_vm_writepage xfs: avoid synchronous transaction in xfs_fs_write_inode xfs: reduce stack usage in xfs_iomap xfs: small cleanups for xfs_iomap / __xfs_get_blocks xfs: remove explicit xfs_sync_data/xfs_sync_attr calls on umount xfs: do not use emums for flags used in tracing xfs: some iget tracing cleanups / fixes xfs: remove xfs_iput_new xfs: remove xfs_iput xfs: split xfs_itrace_entry xfs: remove incorrect log write optimization xfs: allow writeback from kswapd xfs: writepage always has buffers xfs: remove a dmapi leftover xfs: fix gcc 4.6 set but not read and unused statement warnings xfs: clean up filestreams helpers xfs: remove obsolete osyncisosync mount option xfs: kill the b_strat callback in xfs_buf xfs: simplify xfs_truncate_file xfs: clean up xfs_bmap_get_bp direct-io: move aio_complete into ->end_io xfs: move aio completion after unwritten extent conversion xfs simplify and speed up direct I/O completions Dave Chinner (8): xfs: unregister inode shrinker before freeing filesystem structures xfs: move inode shrinker unregister even earlier xfs: don't block on buffer read errors xfs: simplify and remove xfs_ireclaim xfs: fix xfs_trans_add_item() lockdep warnings xfs: fix memory reclaim recursion deadlock on locked inode buffer xfs: use GFP_NOFS for page cache allocation xfs: fix big endian build Eric Sandeen (1): xfs: fix corruption case for block size < page size Kulikov Vasiliy (1): xfs: fix unsigned underflow in xfs_free_eofblocks Tony Luck (1): xfs: Fix build when CONFIG_XFS_POSIX_ACL=n Documentation/filesystems/xfs.txt | 11 - fs/direct-io.c | 26 +- fs/ext4/inode.c | 10 +- fs/ocfs2/aops.c | 7 +- fs/xfs/Makefile | 4 +- fs/xfs/linux-2.6/xfs_acl.c | 2 +- fs/xfs/linux-2.6/xfs_aops.c | 611 +++++++++++++------------------------ fs/xfs/linux-2.6/xfs_aops.h | 4 +- fs/xfs/linux-2.6/xfs_buf.c | 62 ++--- fs/xfs/linux-2.6/xfs_buf.h | 119 ++++---- fs/xfs/linux-2.6/xfs_dmapi_priv.h | 28 -- fs/xfs/linux-2.6/xfs_export.c | 8 +- fs/xfs/linux-2.6/xfs_file.c | 104 +------ fs/xfs/linux-2.6/xfs_fs_subr.c | 4 - fs/xfs/linux-2.6/xfs_fs_subr.h | 25 -- fs/xfs/linux-2.6/xfs_ioctl.c | 27 +-- fs/xfs/linux-2.6/xfs_ioctl32.c | 6 +- fs/xfs/linux-2.6/xfs_iops.c | 10 +- fs/xfs/linux-2.6/xfs_linux.h | 1 - fs/xfs/linux-2.6/xfs_quotaops.c | 1 - fs/xfs/linux-2.6/xfs_super.c | 171 ++++------- fs/xfs/linux-2.6/xfs_super.h | 7 - fs/xfs/linux-2.6/xfs_sync.c | 49 ++- fs/xfs/linux-2.6/xfs_sync.h | 3 - fs/xfs/linux-2.6/xfs_trace.c | 4 - fs/xfs/linux-2.6/xfs_trace.h | 128 ++++++-- fs/xfs/quota/xfs_dquot.c | 114 +++---- fs/xfs/quota/xfs_dquot_item.c | 301 ++++++++----------- fs/xfs/quota/xfs_qm.c | 15 +- fs/xfs/quota/xfs_qm_bhv.c | 10 - fs/xfs/quota/xfs_qm_stats.c | 10 - fs/xfs/quota/xfs_qm_syscalls.c | 89 ++++-- fs/xfs/quota/xfs_trans_dquot.c | 35 +-- fs/xfs/support/debug.c | 1 - fs/xfs/xfs_alloc.c | 15 +- fs/xfs/xfs_alloc.h | 20 +- fs/xfs/xfs_alloc_btree.c | 5 - fs/xfs/xfs_attr.c | 91 ++---- fs/xfs/xfs_attr_leaf.c | 5 +- fs/xfs/xfs_bmap.c | 327 +++----------------- fs/xfs/xfs_bmap.h | 37 +-- fs/xfs/xfs_bmap_btree.c | 5 - fs/xfs/xfs_btree.c | 5 - fs/xfs/xfs_buf_item.c | 228 +++++++-------- fs/xfs/xfs_buf_item.h | 2 +- fs/xfs/xfs_da_btree.c | 20 +- fs/xfs/xfs_dfrag.c | 16 +- fs/xfs/xfs_dir2.c | 11 +- fs/xfs/xfs_dir2_block.c | 8 +- fs/xfs/xfs_dir2_data.c | 2 - fs/xfs/xfs_dir2_leaf.c | 4 +- fs/xfs/xfs_dir2_node.c | 2 - fs/xfs/xfs_dir2_sf.c | 2 - fs/xfs/xfs_dmapi.h | 170 ---------- fs/xfs/xfs_dmops.c | 55 ---- fs/xfs/xfs_error.c | 4 - fs/xfs/xfs_extfree_item.c | 278 +++++++---------- fs/xfs/xfs_filestream.c | 84 +++++- fs/xfs/xfs_filestream.h | 82 ----- fs/xfs/xfs_fsops.c | 7 +- fs/xfs/xfs_ialloc.c | 4 - fs/xfs/xfs_ialloc_btree.c | 4 - fs/xfs/xfs_iget.c | 108 +------- fs/xfs/xfs_inode.c | 60 ++--- fs/xfs/xfs_inode.h | 4 +- fs/xfs/xfs_inode_item.c | 273 ++++++----------- fs/xfs/xfs_inode_item.h | 12 +- fs/xfs/xfs_iomap.c | 76 +++--- fs/xfs/xfs_iomap.h | 22 +- fs/xfs/xfs_itable.c | 8 +- fs/xfs/xfs_log.c | 16 +- fs/xfs/xfs_log.h | 11 +- fs/xfs/xfs_log_cil.c | 4 +- fs/xfs/xfs_log_recover.c | 42 +-- fs/xfs/xfs_mount.c | 3 - fs/xfs/xfs_mount.h | 69 ----- fs/xfs/xfs_rename.c | 63 +---- fs/xfs/xfs_rtalloc.c | 9 +- fs/xfs/xfs_rw.c | 15 - fs/xfs/xfs_trans.c | 211 ++++++++----- fs/xfs/xfs_trans.h | 117 +------- fs/xfs/xfs_trans_ail.c | 1 - fs/xfs/xfs_trans_buf.c | 75 +---- fs/xfs/xfs_trans_extfree.c | 23 +- fs/xfs/xfs_trans_inode.c | 74 ++--- fs/xfs/xfs_trans_item.c | 441 -------------------------- fs/xfs/xfs_trans_priv.h | 18 +- fs/xfs/xfs_utils.c | 87 ------ fs/xfs/xfs_utils.h | 1 - fs/xfs/xfs_vnodeops.c | 293 ++++-------------- include/linux/fs.h | 3 +- 91 files changed, 1621 insertions(+), 4018 deletions(-) delete mode 100644 fs/xfs/linux-2.6/xfs_dmapi_priv.h delete mode 100644 fs/xfs/linux-2.6/xfs_fs_subr.h delete mode 100644 fs/xfs/xfs_dmapi.h delete mode 100644 fs/xfs/xfs_dmops.c delete mode 100644 fs/xfs/xfs_trans_item.c From jack@suse.cz Mon Aug 2 13:51:05 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_33 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o72Ip5FN202770 for ; Mon, 2 Aug 2010 13:51:05 -0500 X-ASG-Debug-ID: 1280775557-6b93036c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx2.suse.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2888215D1249 for ; Mon, 2 Aug 2010 11:59:17 -0700 (PDT) Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id p66knIPt0OsD0iyS for ; Mon, 02 Aug 2010 11:59:17 -0700 (PDT) Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) by mx2.suse.de (Postfix) with ESMTP id D745587D82; Mon, 2 Aug 2010 20:51:22 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id 5C9562B1C16; Mon, 2 Aug 2010 20:50:53 +0200 (CEST) Date: Mon, 2 Aug 2010 20:50:53 +0200 From: Jan Kara To: Dave Chinner Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, sandeen@sandeen.net X-ASG-Orig-Subj: Re: [PATCH 1/2] dio: track and serialise unaligned direct IO Subject: Re: [PATCH 1/2] dio: track and serialise unaligned direct IO Message-ID: <20100802185052.GK3278@quack.suse.cz> References: <1280733945-16231-1-git-send-email-david@fromorbit.com> <1280733945-16231-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1280733945-16231-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1280775558 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36839 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon 02-08-10 17:25:44, Dave Chinner wrote: > From: Dave Chinner > > If we get two unaligned direct IO's to the same filesystem block > that is marked as a new allocation (i.e. buffer_new), then both IOs > will zero the portion of the block they are not writing data to. As > a result, when the IOs complete there will be a portion of the block > that contains zeros from the last IO to complete rather than the > data that should be there. > > This is easily manifested by qemu using aio+dio with an unaligned > guest filesystem - every IO is unaligned and fileystem corruption is > encountered in the guest filesystem. xfstest 240 (from Eric Sandeen) > is also a simple reproducer. > > To avoid this problem, track unaligned IO that triggers sub-block > zeroing and check new incoming unaligned IO that require sub-block > zeroing against that list. If we get an overlap where the start and > end of unaligned IOs hit the same filesystem block, then we need to > block the incoming IOs until the IO that is zeroing the block > completes. The blocked IO can then continue without needing to do > any zeroing and hence won't overwrite valid data with zeros. > > Signed-off-by: Dave Chinner ... > +/* > + * Add a filesystem block to the list of blocks we are tracking. > + */ > +static void > +dio_start_zero_block(struct dio *dio, sector_t zero_block) > +{ > + struct dio_zero_block *zb; > + > + zb = kmalloc(sizeof(*zb), GFP_NOIO); > + if (!zb) > + return; Ho hum, so if the allocation fails, we will just silently corrupt the data anyway? Not good I think. Honza -- Jan Kara SUSE Labs, CR From SRS0+Madt+63+fromorbit.com=david@internode.on.net Mon Aug 2 18:12:38 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o72NCbKe211016 for ; Mon, 2 Aug 2010 18:12:38 -0500 X-ASG-Debug-ID: 1280790774-1a6c01130000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C685548D7F2 for ; Mon, 2 Aug 2010 16:12:55 -0700 (PDT) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id Lx8yaKvy3R4QRDHV for ; Mon, 02 Aug 2010 16:12:55 -0700 (PDT) Received: from dastard (unverified [121.44.216.100]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 33651382-1927428 for multiple; Tue, 03 Aug 2010 08:42:53 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1Og4Bg-0006gG-FP; Tue, 03 Aug 2010 09:12:52 +1000 Date: Tue, 3 Aug 2010 09:12:52 +1000 From: Dave Chinner To: Alex Elder Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: fix depend targets Subject: Re: [PATCH] xfsprogs: fix depend targets Message-ID: <20100802231252.GD19164@dastard> References: <201007302145.o6ULjk4v008060@stout.americas.sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201007302145.o6ULjk4v008060@stout.americas.sgi.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1280790776 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0130 1.0000 -1.9362 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.94 X-Barracuda-Spam-Status: No, SCORE=-1.94 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36856 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, Jul 30, 2010 at 04:45:45PM -0500, Alex Elder wrote: > There's no need to re-make the dependency files all the time. Make > it so the "depend" target rebuilds the ".dep" file only if necessary. > Also change the name of the dependency file created for "ltdepend" > to be ".ltdep". > > Signed-off-by: Alex Elder Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+Madt+63+fromorbit.com=david@internode.on.net Mon Aug 2 18:12:56 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o72NCu7t211039 for ; Mon, 2 Aug 2010 18:12:56 -0500 X-ASG-Debug-ID: 1280791267-78d900580000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 486BF11BDBF3 for ; Mon, 2 Aug 2010 16:21:08 -0700 (PDT) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id q6Forylk70scE3OC for ; Mon, 02 Aug 2010 16:21:08 -0700 (PDT) Received: from dastard (unverified [121.44.216.100]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 22142202-1927428 for multiple; Tue, 03 Aug 2010 08:43:12 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1Og4Bz-0006gO-4O; Tue, 03 Aug 2010 09:13:11 +1000 Date: Tue, 3 Aug 2010 09:13:11 +1000 From: Dave Chinner To: Alex Elder Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfsdump: fix depend targets Subject: Re: [PATCH] xfsdump: fix depend targets Message-ID: <20100802231311.GE19164@dastard> References: <201007302148.o6ULmlpA008272@stout.americas.sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201007302148.o6ULmlpA008272@stout.americas.sgi.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1280791270 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0029 1.0000 -2.0023 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.00 X-Barracuda-Spam-Status: No, SCORE=-2.00 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36857 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, Jul 30, 2010 at 04:48:47PM -0500, Alex Elder wrote: > There's no need to re-make the dependency files all the time. Make > it so the "depend" target rebuilds the ".dep" file only if necessary. > Also change the name of the dependency file created for "ltdepend" > to be ".ltdep". > > Signed-off-by: Alex Elder Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+Bo/h+63+fromorbit.com=david@internode.on.net Mon Aug 2 18:13:13 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o72NDCmk211056 for ; Mon, 2 Aug 2010 18:13:13 -0500 X-ASG-Debug-ID: 1280791285-55ce02950000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2128B11BDBFB for ; Mon, 2 Aug 2010 16:21:25 -0700 (PDT) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id DIs15dANN4ui0TET for ; Mon, 02 Aug 2010 16:21:25 -0700 (PDT) Received: from dastard (unverified [121.44.216.100]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 33759961-1927428 for multiple; Tue, 03 Aug 2010 08:43:30 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1Og4CG-0006gW-SL; Tue, 03 Aug 2010 09:13:28 +1000 Date: Tue, 3 Aug 2010 09:13:28 +1000 From: Dave Chinner To: Alex Elder Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfstests: fix depend targets Subject: Re: [PATCH] xfstests: fix depend targets Message-ID: <20100802231328.GF19164@dastard> References: <201007302149.o6ULnmTR008330@stout.americas.sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201007302149.o6ULnmTR008330@stout.americas.sgi.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1280791287 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0017 1.0000 -2.0102 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.01 X-Barracuda-Spam-Status: No, SCORE=-2.01 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36857 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, Jul 30, 2010 at 04:49:48PM -0500, Alex Elder wrote: > There's no need to re-make the dependency files all the time. Make > it so the "depend" target rebuilds the ".dep" file only if necessary. > Also change the name of the dependency file created for "ltdepend" > to be ".ltdep". > > Signed-off-by: Alex Elder Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+Madt+63+fromorbit.com=david@internode.on.net Mon Aug 2 18:14:01 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o72NE0Nr211083 for ; Mon, 2 Aug 2010 18:14:01 -0500 X-ASG-Debug-ID: 1280790858-23c5005c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 27AAA48D7FB for ; Mon, 2 Aug 2010 16:14:18 -0700 (PDT) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id 0Pf2G1ETs728g6fz for ; Mon, 02 Aug 2010 16:14:18 -0700 (PDT) Received: from dastard (unverified [121.44.216.100]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 22142290-1927428 for multiple; Tue, 03 Aug 2010 08:44:18 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1Og4D1-0006gg-PU; Tue, 03 Aug 2010 09:14:15 +1000 Date: Tue, 3 Aug 2010 09:14:15 +1000 From: Dave Chinner To: Alex Elder Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: dmapi: fix depend targets Subject: Re: dmapi: fix depend targets Message-ID: <20100802231415.GG19164@dastard> References: <201007302151.o6ULpNLX008602@stout.americas.sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201007302151.o6ULpNLX008602@stout.americas.sgi.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1280790860 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0134 1.0000 -1.9334 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.93 X-Barracuda-Spam-Status: No, SCORE=-1.93 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36856 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, Jul 30, 2010 at 04:51:23PM -0500, Alex Elder wrote: > There's no need to re-make the dependency files all the time. Make > it so the "depend" target rebuilds the ".dep" file only if necessary. > > Signed-off-by: Alex Elder Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+k1Pl+64+fromorbit.com=dave@internode.on.net Mon Aug 2 21:07:10 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o73279ro217622 for ; Mon, 2 Aug 2010 21:07:10 -0500 X-ASG-Debug-ID: 1280801245-75d701f00000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C73991687749 for ; Mon, 2 Aug 2010 19:07:26 -0700 (PDT) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id uDyTGA8ERe480xcz for ; Mon, 02 Aug 2010 19:07:26 -0700 (PDT) Received: from dastard (unverified [121.44.216.100]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 33625746-1927428 for multiple; Tue, 03 Aug 2010 11:37:22 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1Og6uW-0006rz-Oi; Tue, 03 Aug 2010 12:07:20 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1Og6uQ-00068b-Kn; Tue, 03 Aug 2010 12:07:14 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: npiggin@kernel.de X-ASG-Orig-Subj: [PATCH] xfs: Reduce log force overhead for delayed logging Subject: [PATCH] xfs: Reduce log force overhead for delayed logging Date: Tue, 3 Aug 2010 12:07:14 +1000 Message-Id: <1280801234-23568-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1280801247 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36868 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Delayed logging adds some serialisation to the log force process to ensure that it does not deference a bad commit context structure when determining if a CIl push is necessary or not. It does this by grabing the CIl contrext lock exclusively, then dropping it before pushing the CIL if necessary. This causes serialisation of all log forces and pushes regardless of whether a force is necessary or not. As a result fsync heavy workloads (like dbench) can be significantly slower with delayed logging than without. To avoid this penalty, copy the current sequence from the context to the CIL structure when they are swapped. This allows us to do unlocked checks on the current sequence without having to worry about dereferencing context structures that may have already been freed. Hence we can remove the CIL context locking in the forcing code and only call into the push code if the current context matches the sequence we need to force. By passing the sequence into the push code, we can check the sequence again once we have the CIL lock held exclusive and abort if the sequence has already been pushed. This avoids a lock round-trip and unnecessary CIL pushes when we have racing push calls. The result is that the regression in dbench performance goes away - this change improves dbench performance on a ramdisk from ~2100MB/s to ~2500MB/s. This compares favourably to not using delayed logging which retuns ~2500MB/s for the same workload. Signed-off-by: Dave Chinner --- fs/xfs/xfs_log.c | 6 +- fs/xfs/xfs_log_cil.c | 243 ++++++++++++++++++++++++++----------------------- fs/xfs/xfs_log_priv.h | 15 +++- 3 files changed, 147 insertions(+), 117 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 925d572..88b81f2 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -3015,7 +3015,7 @@ _xfs_log_force( XFS_STATS_INC(xs_log_force); - xlog_cil_push(log, 1); + xlog_cil_force(log); spin_lock(&log->l_icloglock); @@ -3167,7 +3167,7 @@ _xfs_log_force_lsn( XFS_STATS_INC(xs_log_force); if (log->l_cilp) { - lsn = xlog_cil_push_lsn(log, lsn); + lsn = xlog_cil_force_lsn(log, lsn); if (lsn == NULLCOMMITLSN) return 0; } @@ -3724,7 +3724,7 @@ xfs_log_force_umount( * call below. */ if (!logerror && (mp->m_flags & XFS_MOUNT_DELAYLOG)) - xlog_cil_push(log, 1); + xlog_cil_force(log); /* * We must hold both the GRANT lock and the LOG lock, diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c index ef8e7d9..5650a97 100644 --- a/fs/xfs/xfs_log_cil.c +++ b/fs/xfs/xfs_log_cil.c @@ -68,6 +68,7 @@ xlog_cil_init( ctx->sequence = 1; ctx->cil = cil; cil->xc_ctx = ctx; + cil->xc_current_sequence = ctx->sequence; cil->xc_log = log; log->l_cilp = cil; @@ -321,94 +322,6 @@ xlog_cil_free_logvec( } /* - * Commit a transaction with the given vector to the Committed Item List. - * - * To do this, we need to format the item, pin it in memory if required and - * account for the space used by the transaction. Once we have done that we - * need to release the unused reservation for the transaction, attach the - * transaction to the checkpoint context so we carry the busy extents through - * to checkpoint completion, and then unlock all the items in the transaction. - * - * For more specific information about the order of operations in - * xfs_log_commit_cil() please refer to the comments in - * xfs_trans_commit_iclog(). - * - * Called with the context lock already held in read mode to lock out - * background commit, returns without it held once background commits are - * allowed again. - */ -int -xfs_log_commit_cil( - struct xfs_mount *mp, - struct xfs_trans *tp, - struct xfs_log_vec *log_vector, - xfs_lsn_t *commit_lsn, - int flags) -{ - struct log *log = mp->m_log; - int log_flags = 0; - int push = 0; - - if (flags & XFS_TRANS_RELEASE_LOG_RES) - log_flags = XFS_LOG_REL_PERM_RESERV; - - if (XLOG_FORCED_SHUTDOWN(log)) { - xlog_cil_free_logvec(log_vector); - return XFS_ERROR(EIO); - } - - /* lock out background commit */ - down_read(&log->l_cilp->xc_ctx_lock); - xlog_cil_format_items(log, log_vector, tp->t_ticket, commit_lsn); - - /* check we didn't blow the reservation */ - if (tp->t_ticket->t_curr_res < 0) - xlog_print_tic_res(log->l_mp, tp->t_ticket); - - /* attach the transaction to the CIL if it has any busy extents */ - if (!list_empty(&tp->t_busy)) { - spin_lock(&log->l_cilp->xc_cil_lock); - list_splice_init(&tp->t_busy, - &log->l_cilp->xc_ctx->busy_extents); - spin_unlock(&log->l_cilp->xc_cil_lock); - } - - tp->t_commit_lsn = *commit_lsn; - xfs_log_done(mp, tp->t_ticket, NULL, log_flags); - xfs_trans_unreserve_and_mod_sb(tp); - - /* - * Once all the items of the transaction have been copied to the CIL, - * the items can be unlocked and freed. - * - * This needs to be done before we drop the CIL context lock because we - * have to update state in the log items and unlock them before they go - * to disk. If we don't, then the CIL checkpoint can race with us and - * we can run checkpoint completion before we've updated and unlocked - * the log items. This affects (at least) processing of stale buffers, - * inodes and EFIs. - */ - xfs_trans_free_items(tp, *commit_lsn, 0); - - /* check for background commit before unlock */ - if (log->l_cilp->xc_ctx->space_used > XLOG_CIL_SPACE_LIMIT(log)) - push = 1; - - up_read(&log->l_cilp->xc_ctx_lock); - - /* - * We need to push CIL every so often so we don't cache more than we - * can fit in the log. The limit really is that a checkpoint can't be - * more than half the log (the current checkpoint is not allowed to - * overwrite the previous checkpoint), but commit latency and memory - * usage limit this to a smaller size in most cases. - */ - if (push) - xlog_cil_push(log, 0); - return 0; -} - -/* * Mark all items committed and clear busy extents. We free the log vector * chains in a separate pass so that we unpin the log items as quickly as * possible. @@ -441,13 +354,23 @@ xlog_cil_committed( } /* - * Push the Committed Item List to the log. If the push_now flag is not set, - * then it is a background flush and so we can chose to ignore it. + * Push the Committed Item List to the log. If @push_seq flag is zero, then it + * is a background flush and so we can chose to ignore it. Otherwise, if the + * current sequence is the same as @push_seq we need to do a flush. If + * @push_seq is less than the current sequence, then it has already been + * flushed and we don't need to do anything - the caller will wait for it to + * complete if necessary. + * + * @push_seq is a value rather than a flag because that allows us to do an + * unlocked check of the sequence number for a match. Hence we can allows log + * forces to run racily and not issue pushes for the same sequence twice. If we + * get a race between multiple pushes for the same sequence they will block on + * the first one and then abort, hence avoiding needless pushes. */ int xlog_cil_push( struct log *log, - int push_now) + xfs_lsn_t push_seq) { struct xfs_cil *cil = log->l_cilp; struct xfs_log_vec *lv; @@ -467,12 +390,14 @@ xlog_cil_push( if (!cil) return 0; + ASSERT(!push_seq || push_seq <= cil->xc_ctx->sequence); + new_ctx = kmem_zalloc(sizeof(*new_ctx), KM_SLEEP|KM_NOFS); new_ctx->ticket = xlog_cil_ticket_alloc(log); /* lock out transaction commit, but don't block on background push */ if (!down_write_trylock(&cil->xc_ctx_lock)) { - if (!push_now) + if (!push_seq) goto out_free_ticket; down_write(&cil->xc_ctx_lock); } @@ -483,7 +408,11 @@ xlog_cil_push( goto out_skip; /* check for spurious background flush */ - if (!push_now && cil->xc_ctx->space_used < XLOG_CIL_SPACE_LIMIT(log)) + if (!push_seq && cil->xc_ctx->space_used < XLOG_CIL_SPACE_LIMIT(log)) + goto out_skip; + + /* check for a previously pushed seqeunce */ + if (push_seq < cil->xc_ctx->sequence) goto out_skip; /* @@ -529,6 +458,13 @@ xlog_cil_push( cil->xc_ctx = new_ctx; /* + * mirror the new sequence into the cil structure so that we can do + * unlocked checks against the current sequence in log forces without + * risking deferencing a freed context pointer. + */ + cil->xc_current_sequence = new_ctx->sequence; + + /* * The switch is now done, so we can drop the context lock and move out * of a shared context. We can't just go straight to the commit record, * though - we need to synchronise with previous and future commits so @@ -640,6 +576,94 @@ out_abort: } /* + * Commit a transaction with the given vector to the Committed Item List. + * + * To do this, we need to format the item, pin it in memory if required and + * account for the space used by the transaction. Once we have done that we + * need to release the unused reservation for the transaction, attach the + * transaction to the checkpoint context so we carry the busy extents through + * to checkpoint completion, and then unlock all the items in the transaction. + * + * For more specific information about the order of operations in + * xfs_log_commit_cil() please refer to the comments in + * xfs_trans_commit_iclog(). + * + * Called with the context lock already held in read mode to lock out + * background commit, returns without it held once background commits are + * allowed again. + */ +int +xfs_log_commit_cil( + struct xfs_mount *mp, + struct xfs_trans *tp, + struct xfs_log_vec *log_vector, + xfs_lsn_t *commit_lsn, + int flags) +{ + struct log *log = mp->m_log; + int log_flags = 0; + int push = 0; + + if (flags & XFS_TRANS_RELEASE_LOG_RES) + log_flags = XFS_LOG_REL_PERM_RESERV; + + if (XLOG_FORCED_SHUTDOWN(log)) { + xlog_cil_free_logvec(log_vector); + return XFS_ERROR(EIO); + } + + /* lock out background commit */ + down_read(&log->l_cilp->xc_ctx_lock); + xlog_cil_format_items(log, log_vector, tp->t_ticket, commit_lsn); + + /* check we didn't blow the reservation */ + if (tp->t_ticket->t_curr_res < 0) + xlog_print_tic_res(log->l_mp, tp->t_ticket); + + /* attach the transaction to the CIL if it has any busy extents */ + if (!list_empty(&tp->t_busy)) { + spin_lock(&log->l_cilp->xc_cil_lock); + list_splice_init(&tp->t_busy, + &log->l_cilp->xc_ctx->busy_extents); + spin_unlock(&log->l_cilp->xc_cil_lock); + } + + tp->t_commit_lsn = *commit_lsn; + xfs_log_done(mp, tp->t_ticket, NULL, log_flags); + xfs_trans_unreserve_and_mod_sb(tp); + + /* + * Once all the items of the transaction have been copied to the CIL, + * the items can be unlocked and freed. + * + * This needs to be done before we drop the CIL context lock because we + * have to update state in the log items and unlock them before they go + * to disk. If we don't, then the CIL checkpoint can race with us and + * we can run checkpoint completion before we've updated and unlocked + * the log items. This affects (at least) processing of stale buffers, + * inodes and EFIs. + */ + xfs_trans_free_items(tp, *commit_lsn, 0); + + /* check for background commit before unlock */ + if (log->l_cilp->xc_ctx->space_used > XLOG_CIL_SPACE_LIMIT(log)) + push = 1; + + up_read(&log->l_cilp->xc_ctx_lock); + + /* + * We need to push CIL every so often so we don't cache more than we + * can fit in the log. The limit really is that a checkpoint can't be + * more than half the log (the current checkpoint is not allowed to + * overwrite the previous checkpoint), but commit latency and memory + * usage limit this to a smaller size in most cases. + */ + if (push) + xlog_cil_push(log, 0); + return 0; +} + +/* * Conditionally push the CIL based on the sequence passed in. * * We only need to push if we haven't already pushed the sequence @@ -653,39 +677,34 @@ out_abort: * commit lsn is there. It'll be empty, so this is broken for now. */ xfs_lsn_t -xlog_cil_push_lsn( +xlog_cil_force_lsn( struct log *log, - xfs_lsn_t push_seq) + xfs_lsn_t sequence) { struct xfs_cil *cil = log->l_cilp; struct xfs_cil_ctx *ctx; xfs_lsn_t commit_lsn = NULLCOMMITLSN; -restart: - down_write(&cil->xc_ctx_lock); - ASSERT(push_seq <= cil->xc_ctx->sequence); - - /* check to see if we need to force out the current context */ - if (push_seq == cil->xc_ctx->sequence) { - up_write(&cil->xc_ctx_lock); - xlog_cil_push(log, 1); - goto restart; - } + ASSERT(sequence <= cil->xc_current_sequence); + + /* + * check to see if we need to force out the current context. + * xlog_cil_push() handles racing pushes for the same sequence, + * so no need to deal with it here. + */ + if (sequence == cil->xc_current_sequence) + xlog_cil_push(log, sequence); /* * See if we can find a previous sequence still committing. - * We can drop the flush lock as soon as we have the cil lock - * because we are now only comparing contexts protected by - * the cil lock. - * * We need to wait for all previous sequence commits to complete * before allowing the force of push_seq to go ahead. Hence block * on commits for those as well. */ +restart: spin_lock(&cil->xc_cil_lock); - up_write(&cil->xc_ctx_lock); list_for_each_entry(ctx, &cil->xc_committing, committing) { - if (ctx->sequence > push_seq) + if (ctx->sequence > sequence) continue; if (!ctx->commit_lsn) { /* @@ -695,7 +714,7 @@ restart: sv_wait(&cil->xc_commit_wait, 0, &cil->xc_cil_lock, 0); goto restart; } - if (ctx->sequence != push_seq) + if (ctx->sequence != sequence) continue; /* found it! */ commit_lsn = ctx->commit_lsn; diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h index 8c07261..750334d 100644 --- a/fs/xfs/xfs_log_priv.h +++ b/fs/xfs/xfs_log_priv.h @@ -422,6 +422,7 @@ struct xfs_cil { struct rw_semaphore xc_ctx_lock; struct list_head xc_committing; sv_t xc_commit_wait; + xfs_lsn_t xc_current_sequence; }; /* @@ -562,8 +563,18 @@ int xlog_cil_init(struct log *log); void xlog_cil_init_post_recovery(struct log *log); void xlog_cil_destroy(struct log *log); -int xlog_cil_push(struct log *log, int push_now); -xfs_lsn_t xlog_cil_push_lsn(struct log *log, xfs_lsn_t push_sequence); +/* + * CIL force routines + */ +xfs_lsn_t xlog_cil_force_lsn(struct log *log, xfs_lsn_t sequence); + +static inline void +xlog_cil_force(struct log *log) +{ + if (log->l_cilp) + xlog_cil_force_lsn(log, log->l_cilp->xc_current_sequence); +} + /* * Unmount record type is used as a pseudo transaction type for the ticket. -- 1.7.1 From upgrade@webmaster.org Mon Aug 2 21:11:47 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_50, FILL_THIS_FORM_FRAUD_PHISH,T_FILL_THIS_FORM autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o732BkrM217801 for ; Mon, 2 Aug 2010 21:11:47 -0500 X-ASG-Debug-ID: 1280801525-612d03320000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp.lwhs.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 267081D6F338 for ; Mon, 2 Aug 2010 19:12:05 -0700 (PDT) Received: from smtp.lwhs.org (oslo.lwhs.org [65.205.197.1]) by cuda.sgi.com with ESMTP id U4DpqVIgTsoOCykk for ; Mon, 02 Aug 2010 19:12:05 -0700 (PDT) Received: from localhost ([127.0.0.1]) by smtp.lwhs.org; Mon, 2 Aug 2010 19:07:19 -0700 From: "Dale Allender" Reply-To: forms@mailsystemupdate.com Organization: Web Administrator X-ASG-Orig-Subj: Database Maintenance Update Subject: Database Maintenance Update To: undisclosed-recipients:; Message-ID: <20100802190719.284f56ea@smtp.lwhs.org> Date: Mon, 02 Aug 2010 19:07:19 -0700 X-User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; OfficeLiveConnector.1.3; OfficeLivePatch.0.0; Crazy Browser 3.0.0 Beta2) MIME-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: oslo.lwhs.org[65.205.197.1] X-Barracuda-Start-Time: 1280801526 X-Barracuda-Bayes: INNOCENT GLOBAL 0.5706 1.0000 0.7500 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.75 X-Barracuda-Spam-Status: No, SCORE=0.75 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36868 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean A Computer Database Maintenance is currently going on our Web mail=20 Message Center Our Message Center needs to be re-set because of the high amount of spam mails we receive daily. A=20 Quarantine Maintenance will help us prevent this everyday dilemma. The new Hanover Web mail Software provide a pop - off block of some=20 Restricted words spam terms.a To revalidate your mailbox Please click the reply button and submit the = below information=E2=80=99s: Full Name: Email Address: User Name/ID Password: Confirm Password: The Hanover Web mail Software is a fast and light weight application=20 to quickly and easily access your e-mail. Failure to revalidate your mailbox will render your e-mail in-active=20 from our database. Thanks System Administrator The new Hanover Web mail Software CONFIDENTIALITY NOTICEA Computer Database Maintenance is currently going= on our Web mail=20 Message Center Our Message Center needs to be re-set because of the high amount of spam mails we receive daily. A=20 Quarantine Maintenance will help us prevent this everyday dilemma. The new Hanover Web mail Software provide a pop - off block of some=20 Restricted words spam terms.a To revalidate your mailbox Please click the reply button and submit the = below information=E2=80=99s: Full Name: Email Address: User Name/ID Password: Confirm Password: The Hanover Web mail Software is a fast and light weight application=20 to quickly and easily access your e-mail. Failure to revalidate your mailbox will render your e-mail in-active=20 from our database. Thanks System Administrator The new Hanover Web mail Software CONFIDENTIALITY NOTICE From SRS0+k1Pl+64+fromorbit.com=dave@internode.on.net Tue Aug 3 01:17:49 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o736HmYr227950 for ; Tue, 3 Aug 2010 01:17:49 -0500 X-ASG-Debug-ID: 1280816285-42e801960000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id AB06148E3D6 for ; Mon, 2 Aug 2010 23:18:06 -0700 (PDT) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id 0ECpHzKeHjLuQCZa for ; Mon, 02 Aug 2010 23:18:06 -0700 (PDT) Received: from dastard (unverified [121.44.216.100]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 33661580-1927428 for ; Tue, 03 Aug 2010 15:48:05 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OgAp9-00078v-AU for xfs@oss.sgi.com; Tue, 03 Aug 2010 16:18:03 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OgAp3-0007fp-7h for xfs@oss.sgi.com; Tue, 03 Aug 2010 16:17:57 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfstests: add a test for XFS_IOC_ZERO_RANGE Subject: [PATCH] xfstests: add a test for XFS_IOC_ZERO_RANGE Date: Tue, 3 Aug 2010 16:17:57 +1000 Message-Id: <1280816277-29473-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1280816287 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36884 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Signed-off-by: Dave Chinner --- 241 | 192 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 241.out | 57 +++++++++++++++++++ group | 1 + 3 files changed, 250 insertions(+), 0 deletions(-) create mode 100644 241 create mode 100644 241.out diff --git a/241 b/241 new file mode 100644 index 0000000..b627438 --- /dev/null +++ b/241 @@ -0,0 +1,192 @@ +#! /bin/bash +# FS QA Test No. 241 +# +# Test XFS_IOC_ZERO_RANGE +# +#----------------------------------------------------------------------- +# Copyright (c) 2010 Red Hat. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# +# creator +owner=dchinner@redhat.com + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! + +_cleanup() +{ + rm -f $tmp.* +} + +trap "_cleanup ; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +die_now() +{ + status=1 + exit +} + +_filter_bmap() +{ + awk '$3 ~ /hole/ { print $1, $2, $3; next } + $7 ~ /10000/ { print $1, $2, "unwritten"; next } + $7 ~ /00000/ {print $1, $2, "data" }' +} + +# test the different corner cases for zeroing a range: +# +# 1. into a hole +# 2. into allocated space +# 3. into unwritten space +# 4. hole -> data +# 5. hole -> unwritten +# 6. data -> hole +# 7. data -> unwritten +# 8. unwritten -> hole +# 9. unwritten -> data +# 10. hole -> data -> hole +# 11. data -> hole -> data +# 12. unwritten -> data -> unwritten +# 13. data -> unwritten -> data + +testfile=$TEST_DIR/241.$$ + +echo " 1. into a hole" +rm -f $testfile +$XFS_IO_PROG -f -c "truncate 20k" \ + -c "zero 4k 8k" \ + -c "bmap -vp" $testfile | _filter_bmap +[ $? -ne 0 ] && die_now + +echo " 2. into allocated space" +rm -f $testfile +$XFS_IO_PROG -f -c "truncate 20k" \ + -c "pwrite 0 20k" -c "fsync" \ + -c "zero 4k 8k" \ + -c "bmap -vp" $testfile | _filter_bmap +[ $? -ne 0 ] && die_now + +echo " 3. into unwritten space" +rm -f $testfile +$XFS_IO_PROG -f -c "truncate 20k" \ + -c "resvsp 0 20k" \ + -c "zero 4k 8k" \ + -c "bmap -vp" $testfile | _filter_bmap +[ $? -ne 0 ] && die_now + +echo " 4. hole -> data" +rm -f $testfile +$XFS_IO_PROG -f -c "truncate 20k" \ + -c "pwrite 8k 8k" -c "fsync" \ + -c "zero 4k 8k" \ + -c "bmap -vp" $testfile | _filter_bmap +[ $? -ne 0 ] && die_now + +echo " 5. hole -> unwritten" +rm -f $testfile +$XFS_IO_PROG -f -c "truncate 20k" \ + -c "resvsp 8k 8k" \ + -c "zero 4k 8k" \ + -c "bmap -vp" $testfile | _filter_bmap +[ $? -ne 0 ] && die_now + +echo " 6. data -> hole" +rm -f $testfile +$XFS_IO_PROG -f -c "truncate 20k" \ + -c "pwrite 0 8k" -c "fsync" \ + -c "zero 4k 8k" \ + -c "bmap -vp" $testfile | _filter_bmap +[ $? -ne 0 ] && die_now + +echo " 7. data -> unwritten" +rm -f $testfile +$XFS_IO_PROG -f -c "truncate 20k" \ + -c "pwrite 0 8k" -c "fsync" \ + -c "resvsp 8k 8k" \ + -c "zero 4k 8k" \ + -c "bmap -vp" $testfile | _filter_bmap +[ $? -ne 0 ] && die_now + +echo " 8. unwritten -> hole" +rm -f $testfile +$XFS_IO_PROG -f -c "truncate 20k" \ + -c "resvsp 0 8k" \ + -c "zero 4k 8k" \ + -c "bmap -vp" $testfile | _filter_bmap +[ $? -ne 0 ] && die_now + +echo " 9. unwritten -> data" +rm -f $testfile +$XFS_IO_PROG -f -c "truncate 20k" \ + -c "resvsp 0 8k" \ + -c "pwrite 8k 8k" -c "fsync" \ + -c "zero 4k 8k" \ + -c "bmap -vp" $testfile | _filter_bmap +[ $? -ne 0 ] && die_now + +echo " 10. hole -> data -> hole" +rm -f $testfile +$XFS_IO_PROG -f -c "truncate 20k" \ + -c "pwrite 8k 4k" -c "fsync" \ + -c "zero 4k 12k" \ + -c "bmap -vp" $testfile | _filter_bmap +[ $? -ne 0 ] && die_now + +echo " 11. data -> hole -> data" +rm -f $testfile +$XFS_IO_PROG -f -c "truncate 20k" \ + -c "resvsp 0 20k" \ + -c "pwrite 0 8k" \ + -c "pwrite 12k 8k" -c "fsync" \ + -c "unresvsp 8k 4k" \ + -c "zero 4k 12k" \ + -c "bmap -vp" $testfile | _filter_bmap +[ $? -ne 0 ] && die_now + +echo " 12. unwritten -> data -> unwritten" +rm -f $testfile +$XFS_IO_PROG -f -c "truncate 20k" \ + -c "resvsp 0 20k" \ + -c "pwrite 8k 4k" -c "fsync" \ + -c "zero 4k 12k" \ + -c "bmap -vp" $testfile | _filter_bmap +[ $? -ne 0 ] && die_now + + +echo " 13. data -> unwritten -> data" +rm -f $testfile +$XFS_IO_PROG -f -c "truncate 20k" \ + -c "resvsp 0 20k" \ + -c "pwrite 0k 8k" -c "fsync" \ + -c "pwrite 12k 8k" -c "fsync" \ + -c "zero 4k 12k" \ + -c "bmap -vp" $testfile | _filter_bmap +[ $? -ne 0 ] && die_now + +status=0 ; exit diff --git a/241.out b/241.out new file mode 100644 index 0000000..7b3481f --- /dev/null +++ b/241.out @@ -0,0 +1,57 @@ +QA output created by 241 + 1. into a hole +0: [0..7]: hole +1: [8..23]: unwritten +2: [24..39]: hole + 2. into allocated space +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data + 3. into unwritten space +0: [0..39]: unwritten + 4. hole -> data +0: [0..7]: hole +1: [8..15]: unwritten +2: [16..23]: unwritten +3: [24..31]: data +4: [32..39]: hole + 5. hole -> unwritten +0: [0..7]: hole +1: [8..15]: unwritten +2: [16..31]: unwritten +3: [32..39]: hole + 6. data -> hole +0: [0..7]: data +1: [8..15]: unwritten +2: [16..23]: unwritten +3: [24..39]: hole + 7. data -> unwritten +0: [0..7]: data +1: [8..15]: unwritten +2: [16..31]: unwritten +3: [32..39]: hole + 8. unwritten -> hole +0: [0..15]: unwritten +1: [16..23]: unwritten +2: [24..39]: hole + 9. unwritten -> data +0: [0..15]: unwritten +1: [16..23]: unwritten +2: [24..31]: data +3: [32..39]: hole + 10. hole -> data -> hole +0: [0..7]: hole +1: [8..15]: unwritten +2: [16..23]: unwritten +3: [24..31]: unwritten +4: [32..39]: hole + 11. data -> hole -> data +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data + 12. unwritten -> data -> unwritten +0: [0..39]: unwritten + 13. data -> unwritten -> data +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data diff --git a/group b/group index afe7614..f6e8d7b 100644 --- a/group +++ b/group @@ -354,3 +354,4 @@ deprecated 238 auto quick metadata ioctl 239 auto aio rw 240 auto aio quick rw +241 auto quick prealloc -- 1.7.1 From SRS0+qmhr+64+fromorbit.com=dave@internode.on.net Tue Aug 3 01:18:36 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=unavailable version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o736IZD9227980 for ; Tue, 3 Aug 2010 01:18:36 -0500 X-ASG-Debug-ID: 1280816332-36ed02df0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B31441D6FCA6 for ; Mon, 2 Aug 2010 23:18:53 -0700 (PDT) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id b3otcOfNeziUCa6V for ; Mon, 02 Aug 2010 23:18:53 -0700 (PDT) Received: from dastard (unverified [121.44.216.100]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 33894427-1927428 for ; Tue, 03 Aug 2010 15:48:52 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OgApu-000797-ND for xfs@oss.sgi.com; Tue, 03 Aug 2010 16:18:50 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OgApo-0007o4-Lh for xfs@oss.sgi.com; Tue, 03 Aug 2010 16:18:44 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfsprogs: Add support for XFS_IOC_ZERO_RANGE Subject: [PATCH] xfsprogs: Add support for XFS_IOC_ZERO_RANGE Date: Tue, 3 Aug 2010 16:18:44 +1000 Message-Id: <1280816324-29984-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1280816334 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36884 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Add xfs_io support for XFS_IOC_ZERO_RANGE and document the ioctl parameter in the xfsctl(3) man page. Signed-off-by: Dave Chinner --- include/xfs_fs.h | 1 + io/prealloc.c | 29 +++++++++++++++++++++++++++++ man/man3/xfsctl.3 | 18 ++++++++++++++++++ 3 files changed, 48 insertions(+), 0 deletions(-) diff --git a/include/xfs_fs.h b/include/xfs_fs.h index 2376abb..74e7274 100644 --- a/include/xfs_fs.h +++ b/include/xfs_fs.h @@ -458,6 +458,7 @@ typedef struct xfs_handle { /* XFS_IOC_SETBIOSIZE ---- deprecated 46 */ /* XFS_IOC_GETBIOSIZE ---- deprecated 47 */ #define XFS_IOC_GETBMAPX _IOWR('X', 56, struct getbmap) +#define XFS_IOC_ZERO_RANGE _IOW ('X', 57, struct xfs_flock64) /* * ioctl commands that replace IRIX syssgi()'s diff --git a/io/prealloc.c b/io/prealloc.c index 5f6b029..c8b7df6 100644 --- a/io/prealloc.c +++ b/io/prealloc.c @@ -29,6 +29,7 @@ static cmdinfo_t allocsp_cmd; static cmdinfo_t freesp_cmd; static cmdinfo_t resvsp_cmd; static cmdinfo_t unresvsp_cmd; +static cmdinfo_t zero_cmd; #if defined(HAVE_FALLOCATE) static cmdinfo_t falloc_cmd; #endif @@ -125,6 +126,24 @@ unresvsp_f( return 0; } +static int +zero_f( + int argc, + char **argv) +{ + xfs_flock64_t segment; + + if (!offset_length(argv[1], argv[2], &segment)) + return 0; + + if (xfsctl(file->name, file->fd, XFS_IOC_ZERO_RANGE, &segment) < 0) { + perror("XFS_IOC_ZERO_RANGE"); + return 0; + } + return 0; +} + + #if defined (HAVE_FALLOCATE) static int fallocate_f( @@ -196,10 +215,20 @@ prealloc_init(void) unresvsp_cmd.oneline = _("frees reserved space associated with part of a file"); + zero_cmd.name = _("zero"); + zero_cmd.cfunc = zero_f; + zero_cmd.argmin = 2; + zero_cmd.argmax = 2; + zero_cmd.flags = CMD_NOMAP_OK; + zero_cmd.args = _("off len"); + zero_cmd.oneline = + _("Converts the given range of a file to allocated zeros"); + add_command(&allocsp_cmd); add_command(&freesp_cmd); add_command(&resvsp_cmd); add_command(&unresvsp_cmd); + add_command(&zero_cmd); #if defined (HAVE_FALLOCATE) falloc_cmd.name = _("falloc"); diff --git a/man/man3/xfsctl.3 b/man/man3/xfsctl.3 index 64e18df..784b3e0 100644 --- a/man/man3/xfsctl.3 +++ b/man/man3/xfsctl.3 @@ -338,6 +338,24 @@ in the final argument. Partial filesystem blocks are zeroed, and whole filesystem blocks are removed from the file. The file size does not change. +.TP +.B XFS_IOC_ZERO_RANGE +This command is used to convert a range of a file to zeros without issuing data +IO. +A range of bytes is specified using a pointer to a variable of type +.B xfs_flock64_t +in the final argument. +Blocks are preallocated for regions that span holes in the file, and the entire +range is converted to unwritten extents. +This operation is a fast method of overwriting any from the range specified +with zeros without removing any blocks or having to write zeros to disk. +Any subsequent read in the given range will return zeros until new data is +written. +This functionality requires filesystems to support unwritten extents. +If +.BR xfs_info (8) +reports unwritten=1, then the filesystem was made to flag unwritten extents. + .\" .TP .\" .B XFS_IOC_GETBIOSIZE .\" This command gets information about the preferred buffered I/O -- 1.7.1 From SRS0+of0x+64+fromorbit.com=dave@internode.on.net Tue Aug 3 01:22:10 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o736M9jC228094 for ; Tue, 3 Aug 2010 01:22:10 -0500 X-ASG-Debug-ID: 1280816547-3b9e02a00000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 04DAB1D6B5AF for ; Mon, 2 Aug 2010 23:22:28 -0700 (PDT) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id l7z6cvo6qxyNDYIw for ; Mon, 02 Aug 2010 23:22:28 -0700 (PDT) Received: from dastard (unverified [121.44.216.100]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 33712022-1927428 for ; Tue, 03 Aug 2010 15:52:27 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OgAtN-00079F-U3 for xfs@oss.sgi.com; Tue, 03 Aug 2010 16:22:25 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OgAtH-0007q7-Sa for xfs@oss.sgi.com; Tue, 03 Aug 2010 16:22:19 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 0/2] xfs: Fast zeroing of allocated space Subject: [PATCH 0/2] xfs: Fast zeroing of allocated space Date: Tue, 3 Aug 2010 16:22:04 +1000 Message-Id: <1280816526-30100-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1280816549 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36886 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean These two patches allow conversion of a written range of a file into back into unwritten state. The first patch converts page cache helper functions to use the correct range primitives as we need to be able to toss (invalidate) pages only within the range specified, not to to the end of the file as it currently uses. The actual conversion also preallocates any holes in the range, so it turns the entire range requested into allocated, unwritten extents. Version 2: o removed stray debugging printks o truncate_inode_pages_range doesn't handle partial tail pages, so the range needs to be tossed appropriately. From SRS0+qmhr+64+fromorbit.com=dave@internode.on.net Tue Aug 3 01:22:12 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o736MBG8228105 for ; Tue, 3 Aug 2010 01:22:11 -0500 X-ASG-Debug-ID: 1280817024-755e03a30000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 11EF134AEE3 for ; Mon, 2 Aug 2010 23:30:25 -0700 (PDT) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id uQsWNf4ZrVFfkLhd for ; Mon, 02 Aug 2010 23:30:25 -0700 (PDT) Received: from dastard (unverified [121.44.216.100]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 33894936-1927428 for ; Tue, 03 Aug 2010 15:52:27 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OgAtO-00079H-0x for xfs@oss.sgi.com; Tue, 03 Aug 2010 16:22:26 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OgAtI-0007qB-0K for xfs@oss.sgi.com; Tue, 03 Aug 2010 16:22:20 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 2/2] xfs: Introduce XFS_IOC_ZERO_RANGE Subject: [PATCH 2/2] xfs: Introduce XFS_IOC_ZERO_RANGE Date: Tue, 3 Aug 2010 16:22:06 +1000 Message-Id: <1280816526-30100-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1280816526-30100-1-git-send-email-david@fromorbit.com> References: <1280816526-30100-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1280817027 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36885 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner XFS_IOC_ZERO_RANGE is the equivalent of an atomic XFS_IOC_UNRESVSP/ XFS_IOC_RESVSP call pair. It enabled ranges of written data to be turned into zeroes without requiring IO or having to free and reallocate the extents in the range given as would occur if we had to punch and then preallocate them separately. This enables applications to zero parts of files very quickly without changing the layout of the files in any way. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_ioctl.c | 3 ++- fs/xfs/linux-2.6/xfs_ioctl32.c | 1 + fs/xfs/xfs_bmap.c | 12 +++++++++--- fs/xfs/xfs_bmap.h | 9 ++++++--- fs/xfs/xfs_fs.h | 1 + fs/xfs/xfs_vnodeops.c | 10 ++++++++-- 6 files changed, 27 insertions(+), 9 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_ioctl.c b/fs/xfs/linux-2.6/xfs_ioctl.c index 237f5ff..a9c4810 100644 --- a/fs/xfs/linux-2.6/xfs_ioctl.c +++ b/fs/xfs/linux-2.6/xfs_ioctl.c @@ -1292,7 +1292,8 @@ xfs_file_ioctl( case XFS_IOC_ALLOCSP64: case XFS_IOC_FREESP64: case XFS_IOC_RESVSP64: - case XFS_IOC_UNRESVSP64: { + case XFS_IOC_UNRESVSP64: + case XFS_IOC_ZERO_RANGE: { xfs_flock64_t bf; if (copy_from_user(&bf, arg, sizeof(bf))) diff --git a/fs/xfs/linux-2.6/xfs_ioctl32.c b/fs/xfs/linux-2.6/xfs_ioctl32.c index 6c83f7f..464bcc7 100644 --- a/fs/xfs/linux-2.6/xfs_ioctl32.c +++ b/fs/xfs/linux-2.6/xfs_ioctl32.c @@ -574,6 +574,7 @@ xfs_file_compat_ioctl( case XFS_IOC_FSGEOMETRY_V1: case XFS_IOC_FSGROWFSDATA: case XFS_IOC_FSGROWFSRT: + case XFS_IOC_ZERO_RANGE: return xfs_file_ioctl(filp, cmd, p); #else case XFS_IOC_ALLOCSP_32: diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 23f14e5..d36770f 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -4744,8 +4744,12 @@ xfs_bmapi( * Check if writing previously allocated but * unwritten extents. */ - if (wr && mval->br_state == XFS_EXT_UNWRITTEN && - ((flags & (XFS_BMAPI_PREALLOC|XFS_BMAPI_DELAY)) == 0)) { + if (wr && + ((mval->br_state == XFS_EXT_UNWRITTEN && + ((flags & (XFS_BMAPI_PREALLOC|XFS_BMAPI_DELAY)) == 0)) || + (mval->br_state == XFS_EXT_NORM && + ((flags & (XFS_BMAPI_PREALLOC|XFS_BMAPI_CONVERT)) == + (XFS_BMAPI_PREALLOC|XFS_BMAPI_CONVERT))))) { /* * Modify (by adding) the state flag, if writing. */ @@ -4757,7 +4761,9 @@ xfs_bmapi( *firstblock; cur->bc_private.b.flist = flist; } - mval->br_state = XFS_EXT_NORM; + mval->br_state = (mval->br_state == XFS_EXT_UNWRITTEN) + ? XFS_EXT_NORM + : XFS_EXT_UNWRITTEN; error = xfs_bmap_add_extent(ip, lastx, &cur, mval, firstblock, flist, &tmp_logflags, whichfork, (flags & XFS_BMAPI_RSVBLOCKS)); diff --git a/fs/xfs/xfs_bmap.h b/fs/xfs/xfs_bmap.h index b13569a..71ec9b6 100644 --- a/fs/xfs/xfs_bmap.h +++ b/fs/xfs/xfs_bmap.h @@ -74,9 +74,12 @@ typedef struct xfs_bmap_free #define XFS_BMAPI_IGSTATE 0x080 /* Ignore state - */ /* combine contig. space */ #define XFS_BMAPI_CONTIG 0x100 /* must allocate only one extent */ -#define XFS_BMAPI_CONVERT 0x200 /* unwritten extent conversion - */ - /* need write cache flushing and no */ - /* additional allocation alignments */ +/* + * unwritten extent conversion - this needs write cache flushing and no additional + * allocation alignments. When specified with XFS_BMAPI_PREALLOC it converts + * from written to unwritten, otherwise convert from unwritten to written. + */ +#define XFS_BMAPI_CONVERT 0x200 #define XFS_BMAPI_FLAGS \ { XFS_BMAPI_WRITE, "WRITE" }, \ diff --git a/fs/xfs/xfs_fs.h b/fs/xfs/xfs_fs.h index 7cf7220..6af6518 100644 --- a/fs/xfs/xfs_fs.h +++ b/fs/xfs/xfs_fs.h @@ -446,6 +446,7 @@ typedef struct xfs_handle { /* XFS_IOC_SETBIOSIZE ---- deprecated 46 */ /* XFS_IOC_GETBIOSIZE ---- deprecated 47 */ #define XFS_IOC_GETBMAPX _IOWR('X', 56, struct getbmap) +#define XFS_IOC_ZERO_RANGE _IOW ('X', 57, struct xfs_flock64) /* * ioctl commands that replace IRIX syssgi()'s diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index 3ac137d..9e0ebd3 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -2270,7 +2270,7 @@ xfs_alloc_file_space( count = len; imapp = &imaps[0]; nimaps = 1; - bmapi_flag = XFS_BMAPI_WRITE | (alloc_type ? XFS_BMAPI_PREALLOC : 0); + bmapi_flag = XFS_BMAPI_WRITE | alloc_type; startoffset_fsb = XFS_B_TO_FSBT(mp, offset); allocatesize_fsb = XFS_B_TO_FSB(mp, count); @@ -2702,6 +2702,7 @@ xfs_change_file_space( xfs_off_t llen; xfs_trans_t *tp; struct iattr iattr; + int prealloc_type; if (!S_ISREG(ip->i_d.di_mode)) return XFS_ERROR(EINVAL); @@ -2744,12 +2745,17 @@ xfs_change_file_space( * size to be changed. */ setprealloc = clrprealloc = 0; + prealloc_type = XFS_BMAPI_PREALLOC; switch (cmd) { + case XFS_IOC_ZERO_RANGE: + prealloc_type |= XFS_BMAPI_CONVERT; + xfs_tosspages(ip, startoffset, startoffset + bf->l_len, 0); + /* FALLTHRU */ case XFS_IOC_RESVSP: case XFS_IOC_RESVSP64: error = xfs_alloc_file_space(ip, startoffset, bf->l_len, - 1, attr_flags); + prealloc_type, attr_flags); if (error) return error; setprealloc = 1; -- 1.7.1 From SRS0+3YsL+64+fromorbit.com=dave@internode.on.net Tue Aug 3 01:22:14 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o736MEv6228118 for ; Tue, 3 Aug 2010 01:22:14 -0500 X-ASG-Debug-ID: 1280816551-3b9a02c40000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 58D591D6B5B1 for ; Mon, 2 Aug 2010 23:22:32 -0700 (PDT) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id 3OisF2kIhVnSSEwk for ; Mon, 02 Aug 2010 23:22:32 -0700 (PDT) Received: from dastard (unverified [121.44.216.100]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 33614927-1927428 for ; Tue, 03 Aug 2010 15:52:31 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OgAtN-00079G-Vi for xfs@oss.sgi.com; Tue, 03 Aug 2010 16:22:26 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OgAtH-0007q9-UL for xfs@oss.sgi.com; Tue, 03 Aug 2010 16:22:19 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 1/2] xfs: use range primitives for xfs page cache operations Subject: [PATCH 1/2] xfs: use range primitives for xfs page cache operations Date: Tue, 3 Aug 2010 16:22:05 +1000 Message-Id: <1280816526-30100-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1280816526-30100-1-git-send-email-david@fromorbit.com> References: <1280816526-30100-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1280816553 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36886 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner While XFS passes ranges to operate on from the core code, the functions being called ignore the either the entire range or the end of the range. This is historical because when the function were written linux didn't have the necessary range operations. Update the functions to use the correct operations. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_fs_subr.c | 31 +++++++++++++++---------------- 1 files changed, 15 insertions(+), 16 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_fs_subr.c b/fs/xfs/linux-2.6/xfs_fs_subr.c index 1f279b0..24f0b0a 100644 --- a/fs/xfs/linux-2.6/xfs_fs_subr.c +++ b/fs/xfs/linux-2.6/xfs_fs_subr.c @@ -32,10 +32,9 @@ xfs_tosspages( xfs_off_t last, int fiopt) { - struct address_space *mapping = VFS_I(ip)->i_mapping; - - if (mapping->nrpages) - truncate_inode_pages(mapping, first); + /* can't toss partial tail pages, so mask them out */ + last &= ~(PAGE_SIZE - 1); + truncate_inode_pages_range(VFS_I(ip)->i_mapping, first, last); } int @@ -50,12 +49,11 @@ xfs_flushinval_pages( trace_xfs_pagecache_inval(ip, first, last); - if (mapping->nrpages) { - xfs_iflags_clear(ip, XFS_ITRUNCATED); - ret = filemap_write_and_wait(mapping); - if (!ret) - truncate_inode_pages(mapping, first); - } + xfs_iflags_clear(ip, XFS_ITRUNCATED); + ret = filemap_write_and_wait_range(mapping, first, + last == -1 ? LLONG_MAX : last); + if (!ret) + truncate_inode_pages_range(mapping, first, last); return -ret; } @@ -71,10 +69,9 @@ xfs_flush_pages( int ret = 0; int ret2; - if (mapping_tagged(mapping, PAGECACHE_TAG_DIRTY)) { - xfs_iflags_clear(ip, XFS_ITRUNCATED); - ret = -filemap_fdatawrite(mapping); - } + xfs_iflags_clear(ip, XFS_ITRUNCATED); + ret = -filemap_fdatawrite_range(mapping, first, + last == -1 ? LLONG_MAX : last); if (flags & XBF_ASYNC) return ret; ret2 = xfs_wait_on_pages(ip, first, last); @@ -91,7 +88,9 @@ xfs_wait_on_pages( { struct address_space *mapping = VFS_I(ip)->i_mapping; - if (mapping_tagged(mapping, PAGECACHE_TAG_WRITEBACK)) - return -filemap_fdatawait(mapping); + if (mapping_tagged(mapping, PAGECACHE_TAG_WRITEBACK)) { + return -filemap_fdatawait_range(mapping, first, + last == -1 ? ip->i_size - 1 : last); + } return 0; } -- 1.7.1 From SRS0+k1Pl+64+fromorbit.com=dave@internode.on.net Tue Aug 3 02:23:13 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_66 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o737NCks230198 for ; Tue, 3 Aug 2010 02:23:13 -0500 X-ASG-Debug-ID: 1280820210-6278029b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2185048E473 for ; Tue, 3 Aug 2010 00:23:30 -0700 (PDT) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id wATLig4HIX6m103Z for ; Tue, 03 Aug 2010 00:23:30 -0700 (PDT) Received: from dastard (unverified [121.44.216.100]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 33671163-1927428 for multiple; Tue, 03 Aug 2010 16:53:30 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OgBqS-0007DK-Jw; Tue, 03 Aug 2010 17:23:28 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OgBqS-0000Nc-Bw; Tue, 03 Aug 2010 17:23:28 +1000 From: Dave Chinner To: linux-fsdevel@vger.kernel.org Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 3/3] dio: add a mempool for the unaligned block structures Subject: [PATCH 3/3] dio: add a mempool for the unaligned block structures Date: Tue, 3 Aug 2010 17:23:24 +1000 Message-Id: <1280820204-1418-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1280820204-1418-1-git-send-email-david@fromorbit.com> References: <1280820204-1418-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1280820212 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36890 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner We need the zero block tracking structure allocation to succeed. Silently failing and potentially allowing data corruption is not an option. Add a mempool to ensure this allocation will always succeed. Signed-off-by: Dave Chinner --- fs/direct-io.c | 14 +++++++++++--- 1 files changed, 11 insertions(+), 3 deletions(-) diff --git a/fs/direct-io.c b/fs/direct-io.c index 368abec..dfc5d9a 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c @@ -161,12 +161,22 @@ struct dio_zero_block_head { static struct dio_zero_block_head dio_zero_blocks[DIO_ZERO_BLOCK_NR]; #define to_dio_zero_head(zb) (&dio_zero_blocks[zb % DIO_ZERO_BLOCK_NR]) +/* a small mempool just to guarantee progress. */ +#define DIO_ZERO_BLOCK_ENTRIES 2 +static mempool_t *dio_zero_block_pool; + static int __init dio_init_zero_block(void) { int i; + dio_zero_block_pool = mempool_create_kmalloc_pool( + DIO_ZERO_BLOCK_ENTRIES, + sizeof(struct dio_zero_block)); + if (!dio_zero_block_pool) + panic("dio: can't create zero block pool"); + for (i = 0; i < DIO_ZERO_BLOCK_NR; i++) { spin_lock_init(&dio_zero_blocks[i].lock); INIT_LIST_HEAD(&dio_zero_blocks[i].list); @@ -184,9 +194,7 @@ dio_start_zero_block(struct dio *dio, sector_t zero_block) struct dio_zero_block_head *zbh = to_dio_zero_head(zero_block); struct dio_zero_block *zb; - zb = kmalloc(sizeof(*zb), GFP_NOIO); - if (!zb) - return; + zb = mempool_alloc(dio_zero_block_pool, GFP_NOIO); INIT_LIST_HEAD(&zb->dio_list); init_waitqueue_head(&zb->wq); zb->zero_block = zero_block; -- 1.7.1 From SRS0+of0x+64+fromorbit.com=dave@internode.on.net Tue Aug 3 02:23:13 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o737NDcW230200 for ; Tue, 3 Aug 2010 02:23:13 -0500 X-ASG-Debug-ID: 1280820210-094e01b10000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7BA2F168935F for ; Tue, 3 Aug 2010 00:23:31 -0700 (PDT) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id lP1Te4ZG83M0BJpE for ; Tue, 03 Aug 2010 00:23:31 -0700 (PDT) Received: from dastard (unverified [121.44.216.100]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 34114754-1927428 for multiple; Tue, 03 Aug 2010 16:53:29 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OgBqS-0007DJ-Hv; Tue, 03 Aug 2010 17:23:28 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OgBqS-0000Na-A0; Tue, 03 Aug 2010 17:23:28 +1000 From: Dave Chinner To: linux-fsdevel@vger.kernel.org Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 2/3] dio: scale unaligned IO tracking via multiple lists Subject: [PATCH 2/3] dio: scale unaligned IO tracking via multiple lists Date: Tue, 3 Aug 2010 17:23:23 +1000 Message-Id: <1280820204-1418-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1280820204-1418-1-git-send-email-david@fromorbit.com> References: <1280820204-1418-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1280820212 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36890 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner To avoid concerns that a single list and lock tracking the unaligned IOs will not scale appropriately, create multiple lists and locks and chose them by hashing the unaligned block being zeroed. Signed-off-by: Dave Chinner --- fs/direct-io.c | 49 ++++++++++++++++++++++++++++++++++++------------- 1 files changed, 36 insertions(+), 13 deletions(-) diff --git a/fs/direct-io.c b/fs/direct-io.c index 865749e..368abec 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c @@ -152,8 +152,28 @@ struct dio_zero_block { atomic_t ref; /* reference count */ }; -static DEFINE_SPINLOCK(dio_zero_block_lock); -static LIST_HEAD(dio_zero_block_list); +#define DIO_ZERO_BLOCK_NR 37LL +struct dio_zero_block_head { + struct list_head list; + spinlock_t lock; +}; + +static struct dio_zero_block_head dio_zero_blocks[DIO_ZERO_BLOCK_NR]; +#define to_dio_zero_head(zb) (&dio_zero_blocks[zb % DIO_ZERO_BLOCK_NR]) + + +static int __init +dio_init_zero_block(void) +{ + int i; + + for (i = 0; i < DIO_ZERO_BLOCK_NR; i++) { + spin_lock_init(&dio_zero_blocks[i].lock); + INIT_LIST_HEAD(&dio_zero_blocks[i].list); + } + return 0; +} +subsys_initcall(dio_init_zero_block); /* * Add a filesystem block to the list of blocks we are tracking. @@ -161,6 +181,7 @@ static LIST_HEAD(dio_zero_block_list); static void dio_start_zero_block(struct dio *dio, sector_t zero_block) { + struct dio_zero_block_head *zbh = to_dio_zero_head(zero_block); struct dio_zero_block *zb; zb = kmalloc(sizeof(*zb), GFP_NOIO); @@ -172,9 +193,9 @@ dio_start_zero_block(struct dio *dio, sector_t zero_block) zb->dio = dio; atomic_set(&zb->ref, 1); - spin_lock(&dio_zero_block_lock); - list_add(&zb->dio_list, &dio_zero_block_list); - spin_unlock(&dio_zero_block_lock); + spin_lock(&zbh->lock); + list_add(&zb->dio_list, &zbh->list); + spin_unlock(&zbh->lock); } static void @@ -193,21 +214,22 @@ dio_drop_zero_block(struct dio_zero_block *zb) static int dio_wait_zero_block(struct dio *dio, sector_t zero_block) { + struct dio_zero_block_head *zbh = to_dio_zero_head(zero_block); struct dio_zero_block *zb; - spin_lock(&dio_zero_block_lock); - list_for_each_entry(zb, &dio_zero_block_list, dio_list) { + spin_lock(&zbh->lock); + list_for_each_entry(zb, &zbh->list, dio_list) { if (zb->dio->inode != dio->inode) continue; if (zb->zero_block != zero_block) continue; atomic_inc(&zb->ref); - spin_unlock(&dio_zero_block_lock); + spin_unlock(&zbh->lock); wait_event(zb->wq, (list_empty(&zb->dio_list))); dio_drop_zero_block(zb); return 1; } - spin_unlock(&dio_zero_block_lock); + spin_unlock(&zbh->lock); return 0; } @@ -216,21 +238,22 @@ dio_wait_zero_block(struct dio *dio, sector_t zero_block) */ static void dio_end_zero_block(struct dio *dio, sector_t zero_block) { + struct dio_zero_block_head *zbh = to_dio_zero_head(zero_block); struct dio_zero_block *zb; - spin_lock(&dio_zero_block_lock); - list_for_each_entry(zb, &dio_zero_block_list, dio_list) { + spin_lock(&zbh->lock); + list_for_each_entry(zb, &zbh->list, dio_list) { if (zb->dio->inode != dio->inode) continue; if (zb->zero_block != zero_block) continue; list_del_init(&zb->dio_list); - spin_unlock(&dio_zero_block_lock); + spin_unlock(&zbh->lock); wake_up(&zb->wq); dio_drop_zero_block(zb); return; } - spin_unlock(&dio_zero_block_lock); + spin_unlock(&zbh->lock); } /* -- 1.7.1 From SRS0+of0x+64+fromorbit.com=dave@internode.on.net Tue Aug 3 02:23:13 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_33, J_CHICKENPOX_63 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o737NDaO230202 for ; Tue, 3 Aug 2010 02:23:13 -0500 X-ASG-Debug-ID: 1280820211-68d801db0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E447748E47D for ; Tue, 3 Aug 2010 00:23:31 -0700 (PDT) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id QuAHAyD2G1ZYexTC for ; Tue, 03 Aug 2010 00:23:31 -0700 (PDT) Received: from dastard (unverified [121.44.216.100]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 33720684-1927428 for multiple; Tue, 03 Aug 2010 16:53:30 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OgBqS-0007DI-G9; Tue, 03 Aug 2010 17:23:28 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OgBqS-0000NY-86; Tue, 03 Aug 2010 17:23:28 +1000 From: Dave Chinner To: linux-fsdevel@vger.kernel.org Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 1/3] dio: track and serialise unaligned direct IO Subject: [PATCH 1/3] dio: track and serialise unaligned direct IO Date: Tue, 3 Aug 2010 17:23:22 +1000 Message-Id: <1280820204-1418-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1280820204-1418-1-git-send-email-david@fromorbit.com> References: <1280820204-1418-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1280820212 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36890 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner If we get two unaligned direct IO's to the same filesystem block that is marked as a new allocation (i.e. buffer_new), then both IOs will zero the portion of the block they are not writing data to. As a result, when the IOs complete there will be a portion of the block that contains zeros from the last IO to complete rather than the data that should be there. This is easily manifested by qemu using aio+dio with an unaligned guest filesystem - every IO is unaligned and fileystem corruption is encountered in the guest filesystem. xfstest 240 (from Eric Sandeen) is also a simple reproducer. To avoid this problem, track unaligned IO that triggers sub-block zeroing and check new incoming unaligned IO that require sub-block zeroing against that list. If we get an overlap where the start and end of unaligned IOs hit the same filesystem block, then we need to block the incoming IOs until the IO that is zeroing the block completes. The blocked IO can then continue without needing to do any zeroing and hence won't overwrite valid data with zeros. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/direct-io.c | 152 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 146 insertions(+), 6 deletions(-) diff --git a/fs/direct-io.c b/fs/direct-io.c index a10cb91..865749e 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c @@ -71,6 +71,9 @@ struct dio { unsigned start_zero_done; /* flag: sub-blocksize zeroing has been performed at the start of a write */ +#define LAST_SECTOR ((sector_t)-1LL) + sector_t zero_block_front; /* fs block we are zeroing at front */ + sector_t zero_block_rear; /* fs block we are zeroing at rear */ int pages_in_io; /* approximate total IO pages */ size_t size; /* total request size (doesn't change)*/ sector_t block_in_file; /* Current offset into the underlying @@ -135,6 +138,101 @@ struct dio { struct page *pages[DIO_PAGES]; /* page buffer */ }; + +/* + * record fs blocks we are doing zeroing on in a zero block list. + * unaligned IO is not very performant and so is relatively uncommon, + * so a global list should be sufficent to track them. + */ +struct dio_zero_block { + struct list_head dio_list; /* list of io in progress */ + sector_t zero_block; /* block being zeroed */ + struct dio *dio; /* owner dio */ + wait_queue_head_t wq; /* New IO block here */ + atomic_t ref; /* reference count */ +}; + +static DEFINE_SPINLOCK(dio_zero_block_lock); +static LIST_HEAD(dio_zero_block_list); + +/* + * Add a filesystem block to the list of blocks we are tracking. + */ +static void +dio_start_zero_block(struct dio *dio, sector_t zero_block) +{ + struct dio_zero_block *zb; + + zb = kmalloc(sizeof(*zb), GFP_NOIO); + if (!zb) + return; + INIT_LIST_HEAD(&zb->dio_list); + init_waitqueue_head(&zb->wq); + zb->zero_block = zero_block; + zb->dio = dio; + atomic_set(&zb->ref, 1); + + spin_lock(&dio_zero_block_lock); + list_add(&zb->dio_list, &dio_zero_block_list); + spin_unlock(&dio_zero_block_lock); +} + +static void +dio_drop_zero_block(struct dio_zero_block *zb) +{ + if (atomic_dec_and_test(&zb->ref)) + kfree(zb); +} + +/* + * Check whether a filesystem block is currently being zeroed, and if it is + * wait for it to complete before returning. If we waited for a block being + * zeroed, return 1 to indicate that the block is already initialised, + * otherwise return 0 to indicate that it needs zeroing. + */ +static int +dio_wait_zero_block(struct dio *dio, sector_t zero_block) +{ + struct dio_zero_block *zb; + + spin_lock(&dio_zero_block_lock); + list_for_each_entry(zb, &dio_zero_block_list, dio_list) { + if (zb->dio->inode != dio->inode) + continue; + if (zb->zero_block != zero_block) + continue; + atomic_inc(&zb->ref); + spin_unlock(&dio_zero_block_lock); + wait_event(zb->wq, (list_empty(&zb->dio_list))); + dio_drop_zero_block(zb); + return 1; + } + spin_unlock(&dio_zero_block_lock); + return 0; +} + +/* + * Complete a block zeroing and wake up anyone waiting for it. + */ +static void dio_end_zero_block(struct dio *dio, sector_t zero_block) +{ + struct dio_zero_block *zb; + + spin_lock(&dio_zero_block_lock); + list_for_each_entry(zb, &dio_zero_block_list, dio_list) { + if (zb->dio->inode != dio->inode) + continue; + if (zb->zero_block != zero_block) + continue; + list_del_init(&zb->dio_list); + spin_unlock(&dio_zero_block_lock); + wake_up(&zb->wq); + dio_drop_zero_block(zb); + return; + } + spin_unlock(&dio_zero_block_lock); +} + /* * How many pages are in the queue? */ @@ -253,6 +351,11 @@ static int dio_complete(struct dio *dio, loff_t offset, int ret, bool is_async) aio_complete(dio->iocb, ret, 0); } + if (dio->zero_block_front != LAST_SECTOR) + dio_end_zero_block(dio, dio->zero_block_front); + if (dio->zero_block_rear != LAST_SECTOR) + dio_end_zero_block(dio, dio->zero_block_rear); + if (dio->flags & DIO_LOCKING) /* lockdep: non-owner release */ up_read_non_owner(&dio->inode->i_alloc_sem); @@ -777,6 +880,12 @@ static void clean_blockdev_aliases(struct dio *dio) * block with zeros. This happens only if user-buffer, fileoffset or * io length is not filesystem block-size multiple. * + * We need to track the blocks we are zeroing. If we have concurrent IOs that hit + * the same start or end block, we do not want all the IOs to zero the portion + * they are not writing data to as that will overwrite data from the other IOs. + * Hence we need to block until the first unaligned IO completes before we can + * continue (without executing any zeroing). + * * `end' is zero if we're doing the start of the IO, 1 at the end of the * IO. */ @@ -784,8 +893,8 @@ static void dio_zero_block(struct dio *dio, int end) { unsigned dio_blocks_per_fs_block; unsigned this_chunk_blocks; /* In dio_blocks */ - unsigned this_chunk_bytes; struct page *page; + sector_t fsblock; dio->start_zero_done = 1; if (!dio->blkfactor || !buffer_new(&dio->map_bh)) @@ -797,17 +906,41 @@ static void dio_zero_block(struct dio *dio, int end) if (!this_chunk_blocks) return; + if (end) + this_chunk_blocks = dio_blocks_per_fs_block - this_chunk_blocks; + /* * We need to zero out part of an fs block. It is either at the - * beginning or the end of the fs block. + * beginning or the end of the fs block, but first we need to check if + * there is already a zeroing being run on this block. + * + * If we are doing a sub-block IO (i.e. zeroing both front and rear of + * the same block) we don't need to wait or set a gaurd for the rear of + * the block as we already have one set. */ - if (end) - this_chunk_blocks = dio_blocks_per_fs_block - this_chunk_blocks; + fsblock = dio->block_in_file >> dio->blkfactor; + if (!end || dio->zero_block_front != fsblock) { - this_chunk_bytes = this_chunk_blocks << dio->blkbits; + /* wait for any zeroing already in progress */ + if (dio_wait_zero_block(dio, fsblock)) { + /* skip the range we would have zeroed. */ + dio->next_block_for_io += this_chunk_blocks; + return; + } + + /* + * we are going to zero stuff now, so set a guard to catch + * others that might want to zero the same block. + */ + dio_start_zero_block(dio, fsblock); + if (end) + dio->zero_block_rear = fsblock; + else + dio->zero_block_front = fsblock; + } page = ZERO_PAGE(0); - if (submit_page_section(dio, page, 0, this_chunk_bytes, + if (submit_page_section(dio, page, 0, this_chunk_blocks << dio->blkbits, dio->next_block_for_io)) return; @@ -1191,6 +1324,13 @@ __blockdev_direct_IO_newtrunc(int rw, struct kiocb *iocb, struct inode *inode, */ memset(dio, 0, offsetof(struct dio, pages)); + /* + * zero_blocks need to initialised to largeŃ•t value to avoid + * matching the zero block accidentally. + */ + dio->zero_block_front = LAST_SECTOR; + dio->zero_block_rear = LAST_SECTOR; + dio->flags = flags; if (dio->flags & DIO_LOCKING) { /* watch out for a 0 len io from a tricksy fs */ -- 1.7.1 From SRS0+of0x+64+fromorbit.com=dave@internode.on.net Tue Aug 3 02:23:22 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o737NM7D230244 for ; Tue, 3 Aug 2010 02:23:22 -0500 X-ASG-Debug-ID: 1280820220-0e5b017d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A4D721681BBB for ; Tue, 3 Aug 2010 00:23:40 -0700 (PDT) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id tLDl2NTUHUNZ5Aua for ; Tue, 03 Aug 2010 00:23:40 -0700 (PDT) Received: from dastard (unverified [121.44.216.100]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 34114774-1927428 for multiple; Tue, 03 Aug 2010 16:53:39 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OgBqc-0007DH-Db; Tue, 03 Aug 2010 17:23:38 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OgBqS-0000NW-68; Tue, 03 Aug 2010 17:23:28 +1000 From: Dave Chinner To: linux-fsdevel@vger.kernel.org Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 0/3] dio: serialise unaligned direct IO V3 Subject: [PATCH 0/3] dio: serialise unaligned direct IO V3 Date: Tue, 3 Aug 2010 17:23:21 +1000 Message-Id: <1280820204-1418-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1280820221 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0001 1.0000 -2.0205 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36890 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Updated version of the unaligned direct IO tracking bug fixes. Version 3: - address Christoph's review comments - add a mempool to avoid memory allocation failures to address Jan's comment. Version 2: - address scalability concerns From SRS0+3YsL+64+fromorbit.com=dave@internode.on.net Tue Aug 3 04:09:52 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.9 required=5.0 tests=BAYES_00,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o7399p8R233905 for ; Tue, 3 Aug 2010 04:09:52 -0500 X-ASG-Debug-ID: 1280827085-744403840000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id BC73D11C5A1E for ; Tue, 3 Aug 2010 02:18:05 -0700 (PDT) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id peCoWVGH5sOnz9Oc for ; Tue, 03 Aug 2010 02:18:05 -0700 (PDT) Received: from dastard (unverified [121.44.216.100]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 33637054-1927428 for ; Tue, 03 Aug 2010 18:40:07 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OgDVe-0007Li-0r for xfs@oss.sgi.com; Tue, 03 Aug 2010 19:10:06 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OgDVd-0000v2-OF for xfs@oss.sgi.com; Tue, 03 Aug 2010 19:10:05 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: dummy transactions should not dirty VFS state Subject: [PATCH] xfs: dummy transactions should not dirty VFS state Date: Tue, 3 Aug 2010 19:10:05 +1000 Message-Id: <1280826605-3506-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1280827087 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36897 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner When we need to cover the log, we issue dummy transactions to ensure the current log tail is on disk. Unfortunately we currently use the root inode in the dummy transaction, and the act of committing the transaction dirties the inode at the VFS level. As a result, the VFS writeback of the dirty inode will prevent the filesystem from idling long enough for the log covering state machine to complete. The state machine gets stuck in a loop issuing new dummy transactions to cover the log and never makes progress. To avoid this problem, the dummy transactions should not cause externally visible state changes. To ensure this occurs, make sure that dummy transactions log an unchanging field in the superblock as it's state is never propagated outside the filesystem. This allows the log covering state machine to complete successfully and the filesystem now correctly enters a fully idle state about 90s after the last modification was made. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_sync.c | 37 +++---------------------------------- fs/xfs/xfs_fsops.c | 24 ++++++++++++++---------- 2 files changed, 17 insertions(+), 44 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c index dfcbd98..bec6539 100644 --- a/fs/xfs/linux-2.6/xfs_sync.c +++ b/fs/xfs/linux-2.6/xfs_sync.c @@ -34,6 +34,7 @@ #include "xfs_inode_item.h" #include "xfs_quota.h" #include "xfs_trace.h" +#include "xfs_fsops.h" #include #include @@ -341,38 +342,6 @@ xfs_sync_attr( } STATIC int -xfs_commit_dummy_trans( - struct xfs_mount *mp, - uint flags) -{ - struct xfs_inode *ip = mp->m_rootip; - struct xfs_trans *tp; - int error; - - /* - * Put a dummy transaction in the log to tell recovery - * that all others are OK. - */ - tp = xfs_trans_alloc(mp, XFS_TRANS_DUMMY1); - error = xfs_trans_reserve(tp, 0, XFS_ICHANGE_LOG_RES(mp), 0, 0, 0); - if (error) { - xfs_trans_cancel(tp, 0); - return error; - } - - xfs_ilock(ip, XFS_ILOCK_EXCL); - - xfs_trans_ijoin(tp, ip); - xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); - error = xfs_trans_commit(tp, 0); - xfs_iunlock(ip, XFS_ILOCK_EXCL); - - /* the log force ensures this transaction is pushed to disk */ - xfs_log_force(mp, (flags & SYNC_WAIT) ? XFS_LOG_SYNC : 0); - return error; -} - -STATIC int xfs_sync_fsdata( struct xfs_mount *mp) { @@ -432,7 +401,7 @@ xfs_quiesce_data( /* mark the log as covered if needed */ if (xfs_log_need_covered(mp)) - error2 = xfs_commit_dummy_trans(mp, SYNC_WAIT); + error2 = xfs_fs_log_dummy(mp); /* flush data-only devices */ if (mp->m_rtdev_targp) @@ -578,7 +547,7 @@ xfs_sync_worker( /* dgc: errors ignored here */ error = xfs_qm_sync(mp, SYNC_TRYLOCK); if (xfs_log_need_covered(mp)) - error = xfs_commit_dummy_trans(mp, 0); + error = xfs_fs_log_dummy(mp); } mp->m_sync_seq++; wake_up(&mp->m_wait_single_sync_task); diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index dbca5f5..9e15623 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -604,6 +604,15 @@ out: return 0; } +/* + * Dump a transaction into the log that contains no real change. This is needed + * to be able to make the log dirty or stamp the current tail LSN into the log + * during the covering operation. + * + * We cannot use an inode here for this - that will push dirty state back up + * into the VFS and then periodic inode flushing will prevent log covering from + * making progress. Hence we log a field in the superblock instead. + */ int xfs_fs_log_dummy( xfs_mount_t *mp) @@ -613,22 +622,17 @@ xfs_fs_log_dummy( int error; tp = _xfs_trans_alloc(mp, XFS_TRANS_DUMMY1, KM_SLEEP); - error = xfs_trans_reserve(tp, 0, XFS_ICHANGE_LOG_RES(mp), 0, 0, 0); + error = xfs_trans_reserve(tp, 0, mp->m_sb.sb_sectsize + 128, 0, 0, + XFS_DEFAULT_LOG_COUNT); if (error) { xfs_trans_cancel(tp, 0); return error; } - ip = mp->m_rootip; - xfs_ilock(ip, XFS_ILOCK_EXCL); - - xfs_trans_ijoin(tp, ip); - xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); + /* log the UUID because it is an unchanging field */ + xfs_mod_sb(tp, XFS_SB_UUID); xfs_trans_set_sync(tp); - error = xfs_trans_commit(tp, 0); - - xfs_iunlock(ip, XFS_ILOCK_EXCL); - return error; + return xfs_trans_commit(tp, 0); } int -- 1.7.1 From BATV+ff76fabf3a6dc660cd64+2536+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 3 04:55:01 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o739t0Hs235261 for ; Tue, 3 Aug 2010 04:55:01 -0500 X-ASG-Debug-ID: 1280829319-788c029e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id BEB11168928D for ; Tue, 3 Aug 2010 02:55:19 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id DTTCpjsIuTQ6K2WK for ; Tue, 03 Aug 2010 02:55:19 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OgEDO-0007oc-51; Tue, 03 Aug 2010 09:55:18 +0000 Date: Tue, 3 Aug 2010 05:55:18 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: dummy transactions should not dirty VFS state Subject: Re: [PATCH] xfs: dummy transactions should not dirty VFS state Message-ID: <20100803095518.GA27470@infradead.org> References: <1280826605-3506-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1280826605-3506-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-08-17) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1280829319 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean I looks good to me, but there are two subtile differences between xfs_commit_dummy_trans and xfs_fs_log_dummy that get lost. For one xfs_commit_dummy_trans doesn't actually commit a synchronous transaction (or rather forces out the log) unless SYNC_WAIT is set, in addition to that xfs_fs_log_dummy uses _xfs_trans_alloc, which doesn't get blocked by the filesystem freezing. From SRS0+mH0S+64+fromorbit.com=david@internode.on.net Tue Aug 3 07:07:15 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o73C7FdD238873 for ; Tue, 3 Aug 2010 07:07:15 -0500 X-ASG-Debug-ID: 1280837252-1d5f001d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5BCC21688327 for ; Tue, 3 Aug 2010 05:07:32 -0700 (PDT) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id 8xrC3ZkBc2eBn8Z9 for ; Tue, 03 Aug 2010 05:07:32 -0700 (PDT) Received: from dastard (unverified [121.44.216.100]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 33654241-1927428 for multiple; Tue, 03 Aug 2010 21:37:31 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OgGHI-0007YS-UW; Tue, 03 Aug 2010 22:07:28 +1000 Date: Tue, 3 Aug 2010 22:07:28 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: dummy transactions should not dirty VFS state Subject: Re: [PATCH] xfs: dummy transactions should not dirty VFS state Message-ID: <20100803120728.GA26402@dastard> References: <1280826605-3506-1-git-send-email-david@fromorbit.com> <20100803095518.GA27470@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100803095518.GA27470@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1280837254 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36908 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Aug 03, 2010 at 05:55:18AM -0400, Christoph Hellwig wrote: > I looks good to me, but there are two subtile differences between > xfs_commit_dummy_trans and xfs_fs_log_dummy that get lost. Yes, I noticed those things. Especially as I modified the wrong one in the first place and realised both need fixing and the duplication of code seems completely unnecessary. We should have only one copy of this code, not two copies that do slightly different things. > For one > xfs_commit_dummy_trans doesn't actually commit a synchronous transaction > (or rather forces out the log) unless SYNC_WAIT is set, I don't think that we really _need_ a non-blocking version - waiting for a single sync transaction in xfssyncd once every 36s is hardly going to kill performance. > in addition > to that xfs_fs_log_dummy uses _xfs_trans_alloc, which doesn't get > blocked by the filesystem freezing. Everything will be clean on a frozen filesystem, so all the current code does is block the xfssyncd until the filesytem is unfrozen. Given that we can still read everything on the frozen filesystem, inode caches can still grow and hence we still need to run regular reclaiming. If the xfssyncd is blocked then only memory pressure can free up inodes. If we want to keep all these little differences, then we still need to kill one of the two versions. Let me know which you prefer... Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+ff76fabf3a6dc660cd64+2536+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 3 08:50:32 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o73DoVrP242327 for ; Tue, 3 Aug 2010 08:50:32 -0500 X-ASG-Debug-ID: 1280843451-14d802490000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3E94248F4AC for ; Tue, 3 Aug 2010 06:50:51 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id PPy8NPUwsTphBblw for ; Tue, 03 Aug 2010 06:50:51 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OgHtJ-0001G4-Ic; Tue, 03 Aug 2010 13:50:49 +0000 Date: Tue, 3 Aug 2010 09:50:49 -0400 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: dummy transactions should not dirty VFS state Subject: Re: [PATCH] xfs: dummy transactions should not dirty VFS state Message-ID: <20100803135049.GA32679@infradead.org> References: <1280826605-3506-1-git-send-email-david@fromorbit.com> <20100803095518.GA27470@infradead.org> <20100803120728.GA26402@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100803120728.GA26402@dastard> User-Agent: Mutt/1.5.20 (2009-08-17) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1280843451 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Aug 03, 2010 at 10:07:28PM +1000, Dave Chinner wrote: > Yes, I noticed those things. Especially as I modified the wrong > one in the first place and realised both need fixing and the > duplication of code seems completely unnecessary. We should have > only one copy of this code, not two copies that do slightly > different things. Yes, having one copy is much better. > > For one > > xfs_commit_dummy_trans doesn't actually commit a synchronous transaction > > (or rather forces out the log) unless SYNC_WAIT is set, > > I don't think that we really _need_ a non-blocking version - waiting > for a single sync transaction in xfssyncd once every 36s is hardly > going to kill performance. Sounds fair, but it needs documentation in the changelog, and possibly in the source code as well. > > in addition > > to that xfs_fs_log_dummy uses _xfs_trans_alloc, which doesn't get > > blocked by the filesystem freezing. > > Everything will be clean on a frozen filesystem, so all the current > code does is block the xfssyncd until the filesytem is > unfrozen. Given that we can still read everything on the frozen > filesystem, inode caches can still grow and hence we still need to > run regular reclaiming. If the xfssyncd is blocked then only memory > pressure can free up inodes. That's a reason not to wait. But given the bugs we had in this area I'd rather not blindly start the transaction here. Instead we could check s_frozen manually to no bother even doing the calls to write the dummy record, plus maybe an assert so that it trips up for debug builds. From cmm@us.ibm.com Tue Aug 3 12:34:25 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_33 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o73HYOW5249711 for ; Tue, 3 Aug 2010 12:34:25 -0500 X-ASG-Debug-ID: 1280856884-4cfd02f80000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from e2.ny.us.ibm.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8E79D490530 for ; Tue, 3 Aug 2010 10:34:44 -0700 (PDT) Received: from e2.ny.us.ibm.com (e2.ny.us.ibm.com [32.97.182.142]) by cuda.sgi.com with ESMTP id FYxTfRUEkrMIoHlz for ; Tue, 03 Aug 2010 10:34:44 -0700 (PDT) Received: from d01relay07.pok.ibm.com (d01relay07.pok.ibm.com [9.56.227.147]) by e2.ny.us.ibm.com (8.14.4/8.13.1) with ESMTP id o73HKsPT018430 for ; Tue, 3 Aug 2010 13:20:54 -0400 Received: from d01av01.pok.ibm.com (d01av01.pok.ibm.com [9.56.224.215]) by d01relay07.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id o73HYTAM1569006 for ; Tue, 3 Aug 2010 13:34:29 -0400 Received: from d01av01.pok.ibm.com (loopback [127.0.0.1]) by d01av01.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id o73HYTbv032137 for ; Tue, 3 Aug 2010 13:34:29 -0400 Received: from [9.47.17.72] (mingming-laptop.beaverton.ibm.com [9.47.17.72]) by d01av01.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id o73HYSDC031731; Tue, 3 Aug 2010 13:34:28 -0400 X-ASG-Orig-Subj: Re: [PATCH] dio: track and serialise unaligned direct IO Subject: Re: [PATCH] dio: track and serialise unaligned direct IO From: Mingming Cao To: Dave Chinner Cc: Matthew Wilcox , linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, sandeen@sandeen.net In-Reply-To: <20100730045331.GA2126@dastard> References: <1280443516-14448-1-git-send-email-david@fromorbit.com> <20100730025324.GO25774@parisc-linux.org> <20100730045331.GA2126@dastard> Content-Type: text/plain; charset="UTF-8" Date: Tue, 03 Aug 2010 10:34:25 -0700 Message-ID: <1280856865.2436.31.camel@mingming-laptop> Mime-Version: 1.0 X-Mailer: Evolution 2.28.1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: e2.ny.us.ibm.com[32.97.182.142] X-Barracuda-Start-Time: 1280856884 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36930 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, 2010-07-30 at 14:53 +1000, Dave Chinner wrote: > On Thu, Jul 29, 2010 at 08:53:24PM -0600, Matthew Wilcox wrote: > > On Fri, Jul 30, 2010 at 08:45:16AM +1000, Dave Chinner wrote: > > > If we get two unaligned direct IO's to the same filesystem block > > > that is marked as a new allocation (i.e. buffer_new), then both IOs will > > > zero the portion of the block they are not writing data to. As a > > > result, when the IOs complete there will be a portion of the block > > > that contains zeros from the last IO to complete rather than the > > > data that should be there. > > > > Urgh. Yuck. > > > > > This is easily manifested by qemu using aio+dio with an unaligned > > > guest filesystem - every IO is unaligned and fileystem corruption is > > > encountered in the guest filesystem. xfstest 240 (from Eric Sandeen) > > > is also a simple reproducer. > > > > > > To avoid this problem, track unaligned IO that triggers sub-block zeroing and > > > check new incoming unaligned IO that require sub-block zeroing against that > > > list. If we get an overlap where the start and end of unaligned IOs hit the > > > same filesystem block, then we need to block the incoming IOs until the IO that > > > is zeroing the block completes. The blocked IO can then continue without > > > needing to do any zeroing and hence won't overwrite valid data with zeros. > > > > Urgh. Yuck. > > It's better than silent data corruption. > > > Could we perhaps handle this by making an IO instantiate a page cache > > page for partial writes, and forcing that portion of the IO through the > > page cache? The second IO would hit the same page and use the existing > > O_DIRECT vs page cache paths. > > I don't want any direct IO for XFS to go through the page cache - > unaligned or not. using the page cache for the unaligned blocks > would also be much worse for performance that this method because it > turns unaligned direct IO into 3 IOs - the unaligned head block, the > aligned body and the unaligned tail block. It would also be a > performance hit you take on every single dio, whereas this way the > hit is only taken when an overlap is detected. > Does this problem also possible for DIO and non AIO case? (Ext4 case this only happy with AIO+DIO+unaligned). If not, could we simply force unaligned AIO+DIO to be synchronous? Still direct IO... > And besides, such decisions on whether to use buffered IO have to be > made high up in the filesystem when we are deciding how to lock the > inode for the dio - buffered IO requires exclusive locking, not the > shared locking we do for dio writes. That further reduces the > performance of unaligned direct IO even when there are no overlaps, > and it's a solution that every filesystem needs to implement > themselves in some way. > > I've looked at a couple of different ways to fix this (e.g. passing > the unaligned state to get_blocks() to allow the filesystem to > serialise there) but they've all died a horrible death of dodgy > locking and hacky IO completion detection. not to mention > requiring a different solution in every filesystem. > I also have been thinking other ways to fix this, initial thoughts about this but concerned about the scalability. I was looking at ways to use buffer head state to indicate any unaligned AIO DIO write to buffer_new buffers(do_direct_IO set the state), then for any futhur unaligned IO need to wait for the AIO+DIO complete on that buffer. but the buffer head passed from do_direct_IO to get_blocks() is a dummy buffer, have to get the buffer head from device...this would only impact to all IOs that are really conflict with pending AIO DIOs... it should work for ext4 case...would this something usable for XFS? I have got the approach started last week but not very far. Thanks, Mingming > This way may be a bit ugly, but it works, is isolated and seems to > me to be the least-worst way of solving the problem. It could be > made to scale better by making the tracking per-inode, but I don't > think that growing the struct inode for this corner case is a good > tradeoff, either... > > Cheers, > > Dave. From BATV+ff76fabf3a6dc660cd64+2536+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 3 13:54:44 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o73IsfgN252351 for ; Tue, 3 Aug 2010 13:54:44 -0500 X-ASG-Debug-ID: 1280861700-10a902fa0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id EF28D490BAF for ; Tue, 3 Aug 2010 11:55:00 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id NxlAsdcR2ONI6FcP for ; Tue, 03 Aug 2010 11:55:00 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OgMdc-0000o4-Vj; Tue, 03 Aug 2010 18:54:56 +0000 Date: Tue, 3 Aug 2010 14:54:56 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfstests: add a test for XFS_IOC_ZERO_RANGE Subject: Re: [PATCH] xfstests: add a test for XFS_IOC_ZERO_RANGE Message-ID: <20100803185456.GA2824@infradead.org> References: <1280816277-29473-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1280816277-29473-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-08-17) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1280861701 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Aug 03, 2010 at 04:17:57PM +1000, Dave Chinner wrote: > From: Dave Chinner > > Signed-off-by: Dave Chinner Looks good, Reviewed-by: Christoph Hellwig From BATV+ff76fabf3a6dc660cd64+2536+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 3 13:55:15 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o73ItFBS252390 for ; Tue, 3 Aug 2010 13:55:15 -0500 X-ASG-Debug-ID: 1280861734-273c00d90000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 66264169074A for ; Tue, 3 Aug 2010 11:55:34 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id EVTIOzto3pup6Lg3 for ; Tue, 03 Aug 2010 11:55:34 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OgMeE-0001Tn-E6; Tue, 03 Aug 2010 18:55:34 +0000 Date: Tue, 3 Aug 2010 14:55:34 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: Add support for XFS_IOC_ZERO_RANGE Subject: Re: [PATCH] xfsprogs: Add support for XFS_IOC_ZERO_RANGE Message-ID: <20100803185534.GB2824@infradead.org> References: <1280816324-29984-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1280816324-29984-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-08-17) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1280861735 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Aug 03, 2010 at 04:18:44PM +1000, Dave Chinner wrote: > From: Dave Chinner > > Add xfs_io support for XFS_IOC_ZERO_RANGE and document the ioctl > parameter in the xfsctl(3) man page. Looks good, Reviewed-by: Christoph Hellwig From BATV+ff76fabf3a6dc660cd64+2536+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 3 13:55:43 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o73Ith9H252418 for ; Tue, 3 Aug 2010 13:55:43 -0500 X-ASG-Debug-ID: 1280861763-079303810000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 528DC490BC0 for ; Tue, 3 Aug 2010 11:56:03 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id hcNcYoSSc86d1Og5 for ; Tue, 03 Aug 2010 11:56:03 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OgMeg-0001Xv-WF; Tue, 03 Aug 2010 18:56:03 +0000 Date: Tue, 3 Aug 2010 14:56:02 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs: use range primitives for xfs page cache operations Subject: Re: [PATCH 1/2] xfs: use range primitives for xfs page cache operations Message-ID: <20100803185602.GC2824@infradead.org> References: <1280816526-30100-1-git-send-email-david@fromorbit.com> <1280816526-30100-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1280816526-30100-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-08-17) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1280861763 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Aug 03, 2010 at 04:22:05PM +1000, Dave Chinner wrote: > From: Dave Chinner > > While XFS passes ranges to operate on from the core code, the > functions being called ignore the either the entire range or the end > of the range. This is historical because when the function were > written linux didn't have the necessary range operations. Update the > functions to use the correct operations. Looks good, Reviewed-by: Christoph Hellwig From BATV+ff76fabf3a6dc660cd64+2536+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 3 13:56:33 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o73IuWl4252454 for ; Tue, 3 Aug 2010 13:56:32 -0500 X-ASG-Debug-ID: 1280861812-17a102dd0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B35FF490BD6 for ; Tue, 3 Aug 2010 11:56:52 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id qE8yL51HRFQi6GtK for ; Tue, 03 Aug 2010 11:56:52 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OgMfU-0001tH-BF; Tue, 03 Aug 2010 18:56:52 +0000 Date: Tue, 3 Aug 2010 14:56:52 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: Introduce XFS_IOC_ZERO_RANGE Subject: Re: [PATCH 2/2] xfs: Introduce XFS_IOC_ZERO_RANGE Message-ID: <20100803185652.GD2824@infradead.org> References: <1280816526-30100-1-git-send-email-david@fromorbit.com> <1280816526-30100-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1280816526-30100-3-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-08-17) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1280861812 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Aug 03, 2010 at 04:22:06PM +1000, Dave Chinner wrote: > From: Dave Chinner > > XFS_IOC_ZERO_RANGE is the equivalent of an atomic XFS_IOC_UNRESVSP/ > XFS_IOC_RESVSP call pair. It enabled ranges of written data to be > turned into zeroes without requiring IO or having to free and > reallocate the extents in the range given as would occur if we had > to punch and then preallocate them separately. This enables > applications to zero parts of files very quickly without changing > the layout of the files in any way. Looks good, Reviewed-by: Christoph Hellwig From shawn.bohrer@gmail.com Tue Aug 3 17:03:43 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o73M3hZh258401 for ; Tue, 3 Aug 2010 17:03:43 -0500 X-ASG-Debug-ID: 1280873521-53a701280000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-vw0-f53.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B033511C9331 for ; Tue, 3 Aug 2010 15:12:01 -0700 (PDT) Received: from mail-vw0-f53.google.com (mail-vw0-f53.google.com [209.85.212.53]) by cuda.sgi.com with ESMTP id hXxs3nB5nvCBAzJp for ; Tue, 03 Aug 2010 15:12:01 -0700 (PDT) Received: by vws15 with SMTP id 15so3488604vws.26 for ; Tue, 03 Aug 2010 15:04:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:date:from:to:cc:subject :message-id:references:mime-version:content-type:content-disposition :in-reply-to:user-agent; bh=NRJ7EA3S1aKYeDfXm0rM+9qyUUW5lmaQck+74Inw0WU=; b=FxeYRP3Pct4gpYwxrqmIbIsiXijAU3YFMbbp7T12z2TtD8j0a+Alw4iJ+xKsFvqgB3 nPK/KOUhHn+5nxLmp3zoiMzecUW70N7d7bGAOguJZCJwQ7iFWTvRw0gXgsGAc4jgEOBh kTtnBjqWQhis5cTR+HcxuF8XytZGpqQ20rj/0= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=date:from:to:cc:subject:message-id:references:mime-version :content-type:content-disposition:in-reply-to:user-agent; b=er00otA+ohIZ2DemXULPO59NJrwl2bNawxGoTc77phsZ2nvxpST8TwVDWVV3+toLrG u5/jHK772MjAWBPqlLV8l22GqmcNORP1oSYbgUBiwdZF0reC9jLRgvnCqPrdC1oW+tls BdY6OiRZQfzN1/HBRG5v6ari3+LkkeiFta+YA= Received: by 10.220.76.200 with SMTP id d8mr5643159vck.261.1280873040924; Tue, 03 Aug 2010 15:04:00 -0700 (PDT) Received: from BohrerMBP.rgmadvisors.com (rgmadvisors.com [207.71.26.250]) by mx.google.com with ESMTPS id v11sm7144786vbb.14.2010.08.03.15.03.58 (version=SSLv3 cipher=RC4-MD5); Tue, 03 Aug 2010 15:03:59 -0700 (PDT) Date: Tue, 3 Aug 2010 17:03:53 -0500 From: Shawn Bohrer To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: High latencies writing to a memory mapped file Subject: Re: High latencies writing to a memory mapped file Message-ID: <20100803220336.GA7282@BohrerMBP.rgmadvisors.com> References: <20100722144706.GA2840@BohrerMBP.rgmadvisors.com> <20100722232846.GC32635@dastard> <20100726220909.GA3017@BohrerMBP.rgmadvisors.com> <20100726232224.GJ7362@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100726232224.GJ7362@dastard> User-Agent: Mutt/1.5.20 (2009-12-10) X-Barracuda-Connect: mail-vw0-f53.google.com[209.85.212.53] X-Barracuda-Start-Time: 1280873522 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36949 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hey Dave, Thanks for the suggestions. On Tue, Jul 27, 2010 at 09:22:24AM +1000, Dave Chinner wrote: > On Mon, Jul 26, 2010 at 05:09:09PM -0500, Shawn Bohrer wrote: > > On Fri, Jul 23, 2010 at 09:28:46AM +1000, Dave Chinner wrote: > > > On Thu, Jul 22, 2010 at 09:47:06AM -0500, Shawn Bohrer wrote: > > > > Hello, > > > > > > > > We have an application that receives data over the network, and then > > > > writes data out to a shared memory mapped file on xfs. Previously > > > > everything worked great when we were running a CentOS 5.3 kernel > > > > (2.6.18-128.7.1.el5), but when we upgraded to the newer CentOS 5.4 or > > > > 5.5 kernels we started to see occasional spikes (up to 1 second) in > > > > the time it takes to write the data to the memory mapped file. I > > > > noticed that between the CentOS 5.3 and 5.4 kernels the upstream xfs > > > > changes were backported. Testing on 2.6.32.16 shows the same > > > > occasional latency spikes. > > > > > > > > After doing some debugging on 2.6.32.16 I have found the cause of the > > > > latency spikes. The spikes occur every time pdflush runs to flush the > > > > dirty pages. Note our app only writes data at about 1.5 MB/s and we > > > > are well below both the dirty_background_ratio and the dirty_ratio so > > > > these flushes are only of pages that are dirty_expire_centisecs old. > > > > Capturing one of the spikes with ftrace shows: > > > > > > > > ... > > > > flush-8:0-601 [011] 1291592.127590: funcgraph_entry: | xfs_ilock() { > > > > flush-8:0-601 [011] 1291592.127590: funcgraph_entry: | down_write() { > > > > flush-8:0-601 [011] 1291592.127590: funcgraph_entry: 0.213 us | _cond_resched(); > > > > flush-8:0-601 [011] 1291592.127591: funcgraph_exit: 0.657 us | } > > > > flush-8:0-601 [011] 1291592.127591: funcgraph_exit: 1.174 us | } > > > > flush-8:0-601 [011] 1291592.127764: sched_switch: task flush-8:0:601 [120] (D) ==> swapper:0 [120] > > > > ... > > > > > > what is the lead-in context to this hunk? i.e. how does xfs_ilock() > > > get called? That will tell me if it is blocking on the iolock or the > > > ilock... > > > > I don't have the lead-in context here. I'm using the function_graph > > tracer and with stalls up to a second in length it easily overflowed > > the ftrace ring buffer. Once I found I my process was blocking on the > > xfs_ilock(), I limited my traces to include xfs_ilock, xfs_iunlock, > > handle_mm_fault, and the scheduler events. If you are still > > interested in seeing some more detail here I can try to collect some > > more captures. > > I'm not sure isthe tracepoint buffer is the same as the ftrace > buffer, but if it is you can increase the size by doing this sort of > thing: > > # echo 32768 > /sys/kernel/debug/tracing/buffer_size_kb > > I often do that to capture long XFS traces during testing.... > > [snip] > > > > Hmmm - perhaps the issue is that the transaction commit has not been > > > able to get a iclog buffer to write the transaction into and so is > > > sleeping waiting for an iclog IO to complete. That would be woken by > > > the xfslogd, and then the transaction would write into the > > > now-available iclog and unlock the inode. > > > > > > So, I'd say that in this case your application is waiting for log IO > > > completion to occur. Nothing you can do to avoid that, but you can > > > minimise the impact - increase the log buffer size via the mount > > > option logbsize (i.e. -o logbsize=262144) to reduce the frequency of > > > iclog buffer IOs and make it less likely the system will run stall > > > having run out of iclog space. > > > > > > The other possibility is that the log IO is being slowed by barriers > > > being issued with the log writes. If you've got non-volatile caches > > > on your storage, you can turn off barriers and that should help > > > reduce log IO latency significantly. > > > > I've tried mounting with "noatime,nobarrier,logbufs=8,logbsize=262144" > > but I don't notice much difference and still see the stalls. > > Ok. One other possibility came to mind - the transaction commit is > blocking while locking the superblock buffer to apply free block > count changes. Do you have the "lazy-count" option set (xfs_info > will tell you). If it isn't set, then transaction commit > latency can be quite high if the sb buffer is being written to disk > when the transaction tries to lock it. If it is not set, you can use > xfs_admin to set that bit (mkfs has defaulted to lazy-count=1 for > some time now). Setting lazy-count=1 looks like it has helped quite a bit to reduce the frequency that I was seeing the spikes. I am still seeing spikes of up to a second, but I haven't had time to capture any more traces to verify if they are the same issue. Overall though this may be good enough. Thanks, Shawn From ibmirkin@gmail.com Tue Aug 3 17:30:24 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.4 required=5.0 tests=BAYES_00,J_CHICKENPOX_42, J_CHICKENPOX_43,J_CHICKENPOX_44,J_CHICKENPOX_52,J_CHICKENPOX_61, T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o73MUNTs259244 for ; Tue, 3 Aug 2010 17:30:23 -0500 X-ASG-Debug-ID: 1280875117-5f1501de0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-vw0-f53.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 91D0511C8C68 for ; Tue, 3 Aug 2010 15:38:37 -0700 (PDT) Received: from mail-vw0-f53.google.com (mail-vw0-f53.google.com [209.85.212.53]) by cuda.sgi.com with ESMTP id joksoM09ZZvtUTQW for ; Tue, 03 Aug 2010 15:38:37 -0700 (PDT) Received: by vws15 with SMTP id 15so3511359vws.26 for ; Tue, 03 Aug 2010 15:30:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:sender:received :in-reply-to:references:date:x-google-sender-auth:message-id:subject :from:to:cc:content-type:content-transfer-encoding; bh=4wIbxi7WflBXdVaAt3mDIcIKqUVACsesYW8NECvbBfw=; b=EZAauJdU0nlNllDT1sijykT4Wy4XzV4wZxIZwU33Hu/9PE8+vHmDnj6eX2Q8pkchDj tp/3Tw3BuorqhP4auQhjpP1AYSfoCQzbOGXjpBWLclSr4iBftT4MTBkmRrseSl72oquD 6sx+ffX6iSsvtBOls36wPUli4vOLvH9ey6RGs= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:sender:in-reply-to:references:date :x-google-sender-auth:message-id:subject:from:to:cc:content-type :content-transfer-encoding; b=o4mArbTEIhqa/JB9GlDVOydbwpkh2QFKMLUdvwV/i2D6KWw8xdsQ/LbafdJArKy0gm v2pjyOy1vqLGdWeQXofD8JIax7yyv+eFPxV0fAdIESXFya0xBEtFRG/MWKu7u3ghlIbw 35sDj7NMAqZMHHnQx5PL5CaCTU9/hxSF8aVSY= MIME-Version: 1.0 Received: by 10.220.61.199 with SMTP id u7mr5689407vch.140.1280874636832; Tue, 03 Aug 2010 15:30:36 -0700 (PDT) Sender: ibmirkin@gmail.com Received: by 10.220.166.76 with HTTP; Tue, 3 Aug 2010 15:30:36 -0700 (PDT) In-Reply-To: <20100718235036.GC32635@dastard> References: <20100718012033.GA18888@dastard> <20100718235036.GC32635@dastard> Date: Tue, 3 Aug 2010 18:30:36 -0400 X-Google-Sender-Auth: _HBnrX4fI8dFHXF4hORwS_sXIiU Message-ID: X-ASG-Orig-Subj: Re: XFS hung on 2.6.33.3 kernel Subject: Re: XFS hung on 2.6.33.3 kernel From: Ilia Mirkin To: Dave Chinner Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail-vw0-f53.google.com[209.85.212.53] X-Barracuda-Start-Time: 1280875118 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.02 X-Barracuda-Spam-Status: No, SCORE=-1.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M, BSF_RULE_7582B, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36951 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.50 BSF_RULE7568M Custom Rule 7568M 0.50 BSF_RULE_7582B Custom Rule 7582B X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sun, Jul 18, 2010 at 7:50 PM, Dave Chinner wrote: > On Sat, Jul 17, 2010 at 09:35:33PM -0400, Ilia Mirkin wrote: >> On Sat, Jul 17, 2010 at 9:20 PM, Dave Chinner wrot= e: >> > On Sat, Jul 17, 2010 at 12:01:11AM -0400, Ilia Mirkin wrote: >> > I can't find a thread that holds the XFS inode lock that everything >> > is waiting on. I think it is the ILOCK, but none of the threads in >> > this trace should be holding it where they are blocked. IOWs, the >> > output does not give me enough information to get to the root cause. >> >> In case this happens again, was there something more useful I could >> have collected? Should I have grabbed all task states? > > All the task states, including the running tasks, is probably a good > start. Also, if the kernel you are running has tracing events > enabled and has the necessary XFS tracepoints (I can't remember off > the top of my head whether they are in 2.6.33), you might want to > enable tracing of: > > =A0 =A0 =A0 =A0xfs_ilock > =A0 =A0 =A0 =A0xfs_ilock_nowait > =A0 =A0 =A0 =A0xfs_ilock_demote > =A0 =A0 =A0 =A0xfs_iunlock > > via: > > # echo 1 > /sys/kernel/debug/tracing/events/xfs//enable > > and when the problem is hit dumping the trace via: > > # cat /sys/kernel/debug/tracing/trace > trace.log > > You may also want to bump up the trace buffer size to capture more > events: > > # echo 32768 > /sys/kernel/debug/tracing/buffer_size_kb Sad. Nothing in /sys/kernel/debug, I tried turning on some config options at random before doing this run (including lockdep), but I still don't have these. Guess it's time to read some docs :) > > Though I suspect the only way to get to the bottom of it will > be to work out a reproducable test case.... I felt a little bothered by this issue, so I dug in a little further. I basically created a sample mysql, tar, and it seemed that having memory pressure helped, so I created an allocator as well. The "mysql" program basically just has 10 threads, each with their own O_DIRECT-opened fd, reading/writing to random locations in a large file. The "tar" program opens the file, reads it in sequentially with plain read(= ). The "malloc" program allocates a configured amount of memory in the system and then exits. Ideally this should be the amount of RAM in the system. I ran all this in a VM (kvm) with 4 VCPUs (the machine itself is 4S, 8C/S), 512M ram, 512M swap, and a dedicated lvm-backed volume for the test XFS partition (3G). The warnings were no problem to trigger, coming off at around one per second on average, the hang took about 4-5h to appear [although in the previous 8+ hour run, nothing happened, and then I added lockdep]. Basically I was running in three separate shells: ./test-mysqld /mnt/tmp/test ./test-tar /mnt/tmp/test while true; do ./test-malloc; done (oh, and /mnt/tmp/test is a 3G file on a newish XFS; the fs was created/used in prior boots as well, so not completely brand new) test-tar ended up eventually stuck in a D state, as well as one of the mysql threads. I could still create/delete files on the filesystem (although I didn't try writing anything substantial). The system is still up and running in this state, let me know if you'd like me to try doing something in particular to it. Below I have the program source code, as well as output from echo t > /proc/sysrq-trigger. The programs [this is not the cleanest code I've written, but it apparently does the trick... probably left over unnecessary stuff from earlier debugging in there]: test-malloc.c ------------- // gcc -Wall -o test-malloc -pthread test-malloc.c #include #include #include #define BLKSIZE 4096 int main(int argc, char *argv[]) { int i; for (i =3D 0; i < 512 * 1024 * 1024 / BLKSIZE; i++) { void *x =3D malloc(BLKSIZE); memset(x, 0, BLKSIZE); usleep(1); } return 0; } ------------- test-mysqld.c ------------- // gcc -Wall -o test-mysqld -pthread test-mysqld.c #define _GNU_SOURCE #include #include #include #include #include #include #include #define THREADS 10 #define BLKSIZE 4096 void *thread(void *arg) { struct stat s; int fd =3D *(int *)arg; fstat(fd, &s); struct random_data rnd; char state[128]; initstate_r(fd, state, 128, &rnd); char *buf =3D mmap(NULL, BLKSIZE, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); int t; while (1) { random_r(&rnd, &t); off_t block =3D (t % s.st_size) / BLKSIZE; lseek(fd, block * BLKSIZE, SEEK_SET); random_r(&rnd, &t); int r =3D t % 2; if (r) { read(fd, buf, BLKSIZE); } else { int i; for (i =3D 0; i < BLKSIZE; i++) { random_r(&rnd, &t); buf[i] =3D (char)t; } write(fd, buf, BLKSIZE); } } close(fd); return NULL; } void *datasync(void *arg) { int *iarg =3D arg; int i; while (1) { for (i =3D 0; i < THREADS; i++) { fsync(iarg[i]); } sleep(1); } } int main(int argc, char *argv[]) { pthread_t threads[THREADS]; int fds[THREADS]; int i; for (i =3D 0; i < THREADS; i++) { fds[i] =3D open(argv[1], O_RDWR | O_DIRECT); pthread_create(&threads[i], NULL, thread, &fds[i]); } pthread_t sync_thread; pthread_create(&sync_thread, NULL, datasync, fds); for (i =3D 0; i < THREADS; i++) { pthread_join(threads[i], NULL); } return 0; } ------------- test-tar.c ------------- // gcc -Wall -o test-tar -pthread test-tar.c #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include int main(int argc, char *argv[]) { while (1) { int fd =3D open(argv[1], O_RDWR); char buf[4096]; lseek(fd, 0, SEEK_SET); while (read(fd, buf, 4096) !=3D 0); close(fd); } } ------------------- The output of echo t > /proc/sysrq-trigger [apologies for line-wrapping] [16087.359042] SysRq : Show State [16087.359872] task PC stack pid father [16087.359872] init S 0000000000000000 3296 1 0 0x000000= 00 [16087.359872] ffff88001f8ff908 0000000000000046 ffff88001f8ff868 0000000000000286 [16087.359872] 0000000000000040 000000000000def8 ffff88001f8fffd8 0000000000014180 [16087.359872] ffff88001f8fffd8 0000000000014180 ffff88001f910000 ffff88001fa542c0 [16087.359872] Call Trace: [16087.359872] [] schedule_hrtimeout_range+0xc2/0xf7 [16087.359872] [] ? hrtimer_wakeup+0x0/0x21 [16087.359872] [] ? hrtimer_start_range_ns+0xf/0x11 [16087.359872] [] poll_schedule_timeout+0x46/0x69 [16087.359872] [] do_select+0x5c1/0x605 [16087.359872] [] ? do_select+0x0/0x605 [16087.359872] [] ? register_lock_class+0x20/0x327 [16087.359872] [] ? __pollwait+0x0/0xcf [16087.359872] [] ? pollwake+0x0/0x5c [16087.359872] [] ? mark_lock+0x22/0x225 [16087.359872] [] ? lock_release_non_nested+0x97/0x20d [16087.359872] [] ? might_fault+0x57/0xa4 [16087.359872] [] ? might_fault+0x57/0xa4 [16087.359872] [] ? might_fault+0xa0/0xa4 [16087.359872] [] ? might_fault+0x57/0xa4 [16087.359872] [] core_sys_select+0x1b9/0x255 [16087.359872] [] ? core_sys_select+0x41/0x255 [16087.359872] [] ? lock_release_non_nested+0x97/0x20d [16087.359872] [] ? might_fault+0xa0/0xa4 [16087.359872] [] ? might_fault+0x57/0xa4 [16087.359872] [] ? might_fault+0x57/0xa4 [16087.359872] [] ? ktime_get_ts+0xb1/0xbe [16087.359872] [] sys_select+0x94/0xbc [16087.359872] [] system_call_fastpath+0x16/0x1b [16087.359872] kthreadd S 0000000000000000 4096 2 0 0x000000= 00 [16087.359872] ffff88001f91df00 0000000000000046 0000000000000000 ffff88001f91decc [16087.359872] 0000000000000000 000000000000def8 ffff88001f91dfd8 0000000000014180 [16087.359872] ffff88001f91dfd8 0000000000014180 ffff88001f9110b0 ffff88001f152160 [16087.359872] Call Trace: [16087.359872] [] kthreadd+0x83/0x109 [16087.359872] [] ? trace_hardirqs_on_caller+0x10b/0x12f [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthreadd+0x0/0x109 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] migration/0 S 0000000000000000 6496 3 2 0x000000= 00 [16087.359872] ffff88001f91fe50 0000000000000046 0000000000000000 ffffffff81039a5e [16087.359872] ffff880000000000 000000000000def8 ffff88001f91ffd8 0000000000014180 [16087.359872] ffff88001f91ffd8 0000000000014180 ffff88001f912160 ffff88001f0b5370 [16087.359872] Call Trace: [16087.359872] [] ? migration_thread+0x76/0x297 [16087.359872] [] ? trace_hardirqs_on_caller+0x10b/0x12f [16087.359872] [] migration_thread+0x19c/0x297 [16087.359872] [] ? migration_thread+0x0/0x297 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] ksoftirqd/0 S 0000000000000000 6600 4 2 0x000000= 00 [16087.359872] ffff88001f931e80 0000000000000046 ffffffff8104ad59 0000000000000000 [16087.359872] ffff88001f930000 000000000000def8 ffff88001f931fd8 0000000000014180 [16087.359872] ffff88001f931fd8 0000000000014180 ffff88001f913210 ffff88001e622160 [16087.359872] Call Trace: [16087.359872] [] ? run_timer_softirq+0x28a/0x2d3 [16087.359872] [] ? trace_hardirqs_on_caller+0x10b/0x12f [16087.359872] [] run_ksoftirqd+0x52/0x121 [16087.359872] [] ? run_ksoftirqd+0x0/0x121 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] migration/1 S 0000000000000001 6552 5 2 0x000000= 00 [16087.359872] ffff88001f933e50 0000000000000046 0000000000000000 ffffffff81039a5e [16087.359872] ffff880000000000 000000000000def8 ffff88001f933fd8 0000000000014180 [16087.359872] ffff88001f933fd8 0000000000014180 ffff88001f9142c0 ffff88001f980000 [16087.359872] Call Trace: [16087.359872] [] ? migration_thread+0x76/0x297 [16087.359872] [] ? trace_hardirqs_on_caller+0x10b/0x12f [16087.359872] [] migration_thread+0x19c/0x297 [16087.359872] [] ? migration_thread+0x0/0x297 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] ksoftirqd/1 S 0000000000000000 6600 6 2 0x000000= 00 [16087.359872] ffff88001f939e80 0000000000000046 0000000000000000 0000000000000000 [16087.359872] ffff88001f938000 000000000000def8 ffff88001f939fd8 0000000000014180 [16087.359872] ffff88001f939fd8 0000000000014180 ffff88001f915370 ffff88001dcb5370 [16087.359872] Call Trace: [16087.359872] [] ? trace_hardirqs_on_caller+0x10b/0x12f [16087.359872] [] run_ksoftirqd+0x52/0x121 [16087.359872] [] ? run_ksoftirqd+0x0/0x121 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] migration/2 S 0000000000000002 6552 7 2 0x000000= 00 [16087.359872] ffff88001f95be50 0000000000000046 0000000000000000 ffffffff81039a5e [16087.359872] ffff880000000000 000000000000def8 ffff88001f95bfd8 0000000000014180 [16087.359872] ffff88001f95bfd8 0000000000014180 ffff88001f960000 ffff88001f152160 [16087.359872] Call Trace: [16087.359872] [] ? migration_thread+0x76/0x297 [16087.359872] [] ? trace_hardirqs_on_caller+0x10b/0x12f [16087.359872] [] migration_thread+0x19c/0x297 [16087.359872] [] ? migration_thread+0x0/0x297 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] ksoftirqd/2 S 0000000000000000 6600 8 2 0x000000= 00 [16087.359872] ffff88001f969e80 0000000000000046 ffffffff814903d9 ffff88001e7f9ea8 [16087.359872] ffff880002714b40 000000000000def8 ffff88001f969fd8 0000000000014180 [16087.359872] ffff88001f969fd8 0000000000014180 ffff88001f9610b0 ffff88001fa542c0 [16087.359872] Call Trace: [16087.359872] [] ? trace_hardirqs_on_thunk+0x3a/0x3f [16087.359872] [] ? trace_hardirqs_on_caller+0x10b/0x12f [16087.359872] [] run_ksoftirqd+0x52/0x121 [16087.359872] [] ? run_ksoftirqd+0x0/0x121 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] migration/3 S 0000000000000003 6552 9 2 0x000000= 00 [16087.359872] ffff88001f96de50 0000000000000046 0000000000000000 0000000000000046 [16087.359872] 0000000000000000 000000000000def8 ffff88001f96dfd8 0000000000014180 [16087.359872] ffff88001f96dfd8 0000000000014180 ffff88001f963210 ffff88001f965370 [16087.359872] Call Trace: [16087.359872] [] ? trace_hardirqs_on_caller+0x10b/0x12f [16087.359872] [] migration_thread+0x19c/0x297 [16087.359872] [] ? migration_thread+0x0/0x297 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] ksoftirqd/3 S 0000000000000000 6600 10 2 0x000000= 00 [16087.359872] ffff88001f96fe80 0000000000000046 0000000000000000 0000000000000000 [16087.359872] ffff88001f96e000 000000000000def8 ffff88001f96ffd8 0000000000014180 [16087.359872] ffff88001f96ffd8 0000000000014180 ffff88001f9642c0 ffff88001e622160 [16087.359872] Call Trace: [16087.359872] [] ? trace_hardirqs_on_caller+0x10b/0x12f [16087.359872] [] run_ksoftirqd+0x52/0x121 [16087.359872] [] ? run_ksoftirqd+0x0/0x121 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] events/0 S ffff88001f966420 6152 11 2 0x000000= 00 [16087.359872] ffff88001f977dc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001f966420 000000000000def8 ffff88001f977fd8 0000000000014180 [16087.359872] ffff88001f977fd8 0000000000014180 ffff88001f966420 ffff88001f0b5370 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? worker_thread+0x1d5/0x332 [16087.359872] [] ? vmstat_update+0x0/0x3a [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] events/1 S ffff88001f980000 5776 12 2 0x000000= 00 [16087.359872] ffff88001f989dc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001f980000 000000000000def8 ffff88001f989fd8 0000000000014180 [16087.359872] ffff88001f989fd8 0000000000014180 ffff88001f980000 ffff88001dcb5370 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? worker_thread+0x1d5/0x332 [16087.359872] [] ? vmstat_update+0x0/0x3a [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] events/2 S ffff88001f9810b0 5704 13 2 0x000000= 00 [16087.359872] ffff88001f98bdc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001f9810b0 000000000000def8 ffff88001f98bfd8 0000000000014180 [16087.359872] ffff88001f98bfd8 0000000000014180 ffff88001f9810b0 ffff88001f152160 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? worker_thread+0x1d5/0x332 [16087.359872] [] ? flush_to_ldisc+0x0/0x1a0 [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] events/3 S ffff88001f982160 5328 14 2 0x000000= 00 [16087.359872] ffff88001f98ddc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001f982160 000000000000def8 ffff88001f98dfd8 0000000000014180 [16087.359872] ffff88001f98dfd8 0000000000014180 ffff88001f982160 ffff88001f965370 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? worker_thread+0x1d5/0x332 [16087.359872] [] ? neigh_periodic_work+0x0/0x185 [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] cpuset S 0000000000000000 6712 15 2 0x000000= 00 [16087.359872] ffff88001f98fdc0 0000000000000046 ffff88001f98fd90 ffff88001f98fd8c [16087.359872] ffff88001f983210 000000000000def8 ffff88001f98ffd8 0000000000014180 [16087.359872] ffff88001f98ffd8 0000000000014180 ffff88001f983210 ffff88001f916420 [16087.359872] Call Trace: [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] khelper S ffff88001f9842c0 5232 16 2 0x000000= 00 [16087.359872] ffff88001f999dc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001f9842c0 000000000000def8 ffff88001f999fd8 0000000000014180 [16087.359872] ffff88001f999fd8 0000000000014180 ffff88001f9842c0 ffff88001f962160 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? worker_thread+0x1d5/0x332 [16087.359872] [] ? __call_usermodehelper+0x0/0x6c [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] netns S 0000000000000000 6816 19 2 0x000000= 00 [16087.359872] ffff88001fa35dc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001f985370 000000000000def8 ffff88001fa35fd8 0000000000014180 [16087.359872] ffff88001fa35fd8 0000000000014180 ffff88001f985370 ffff88001f916420 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] async/mgr S 0000000000000000 6152 22 2 0x000000= 00 [16087.359872] ffff88001fa3de60 0000000000000046 ffff880002714180 0000000000000001 [16087.359872] ffff88001fa3ddd0 000000000000def8 ffff88001fa3dfd8 0000000000014180 [16087.359872] ffff88001fa3dfd8 0000000000014180 ffff88001f986420 ffff88001f9842c0 [16087.359872] Call Trace: [16087.359872] [] ? try_to_wake_up+0x2d5/0x2e7 [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] ? async_manager_thread+0x0/0xe8 [16087.359872] [] async_manager_thread+0xbe/0xe8 [16087.359872] [] ? default_wake_function+0x0/0xf [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] sync_supers S 0000000000000000 6616 155 2 0x000000= 00 [16087.359872] ffff88001fa41e90 0000000000000046 ffff88001fa50000 0000000000000000 [16087.359872] 0000000000000002 000000000000def8 ffff88001fa41fd8 0000000000014180 [16087.359872] ffff88001fa41fd8 0000000000014180 ffff88001fa50000 ffff88001f966420 [16087.359872] Call Trace: [16087.359872] [] ? bdi_sync_supers+0x0/0x51 [16087.359872] [] ? _raw_spin_unlock+0x26/0x2b [16087.359872] [] ? sync_supers+0x13/0xa5 [16087.359872] [] ? bdi_sync_supers+0x0/0x51 [16087.359872] [] bdi_sync_supers+0x3a/0x51 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] bdi-default S ffff88001f9abe40 5816 157 2 0x000000= 00 [16087.359872] ffff88001f9abd80 0000000000000046 ffff88001fa510b0 ffffffff81490baf [16087.359872] ffffffff81b71f00 000000000000def8 ffff88001f9abfd8 0000000000014180 [16087.359872] ffff88001f9abfd8 0000000000014180 ffff88001fa510b0 ffff88001f0b5370 [16087.359872] Call Trace: [16087.359872] [] ? _raw_spin_unlock_irqrestore+0x3f/0x4= 7 [16087.359872] [] ? __mod_timer+0x141/0x153 [16087.359872] [] ? init_timer_key+0x8d/0x99 [16087.359872] [] schedule_timeout+0xa2/0xc9 [16087.359872] [] ? process_timeout+0x0/0xb [16087.359872] [] ? _raw_spin_unlock_bh+0x2f/0x33 [16087.359872] [] bdi_forker_task+0x1a8/0x2da [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] ? bdi_forker_task+0x0/0x2da [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] kblockd/0 S ffff88001fa52160 5856 159 2 0x000000= 00 [16087.359872] ffff88001fa37dc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001fa52160 000000000000def8 ffff88001fa37fd8 0000000000014180 [16087.359872] ffff88001fa37fd8 0000000000014180 ffff88001fa52160 ffff88001f0b5370 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? worker_thread+0x1d5/0x332 [16087.359872] [] ? blk_unplug_work+0x0/0x4d [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] kblockd/1 S ffff88001fa53210 5624 160 2 0x000000= 00 [16087.359872] ffff88001fa3fdc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001fa53210 000000000000def8 ffff88001fa3ffd8 0000000000014180 [16087.359872] ffff88001fa3ffd8 0000000000014180 ffff88001fa53210 ffff88001dcb5370 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? worker_thread+0x1d5/0x332 [16087.359872] [] ? cfq_kick_queue+0x0/0x3c [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] kblockd/2 S ffff88001fa542c0 5856 161 2 0x000000= 00 [16087.359872] ffff88001fa3bdc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001fa542c0 000000000000def8 ffff88001fa3bfd8 0000000000014180 [16087.359872] ffff88001fa3bfd8 0000000000014180 ffff88001fa542c0 ffff88001f152160 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? worker_thread+0x1d5/0x332 [16087.359872] [] ? cfq_kick_queue+0x0/0x3c [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] kblockd/3 S ffff88001fa55370 5576 162 2 0x000000= 00 [16087.359872] ffff88001fa47dc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001fa55370 000000000000def8 ffff88001fa47fd8 0000000000014180 [16087.359872] ffff88001fa47fd8 0000000000014180 ffff88001fa55370 ffff88001f155370 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? worker_thread+0x1d5/0x332 [16087.359872] [] ? cfq_kick_queue+0x0/0x3c [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] kacpid S ffff88001fa56420 6232 165 2 0x000000= 00 [16087.359872] ffff88001f9afdc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001fa56420 000000000000def8 ffff88001f9affd8 0000000000014180 [16087.359872] ffff88001f9affd8 0000000000014180 ffff88001fa56420 ffff88001f910000 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? worker_thread+0x1d5/0x332 [16087.359872] [] ? bind_to_cpu0+0x0/0x2f [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] kacpi_notify S ffff88001fa65370 6232 166 2 0x000000= 00 [16087.359872] ffff88001fa69dc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001fa65370 000000000000def8 ffff88001fa69fd8 0000000000014180 [16087.359872] ffff88001fa69fd8 0000000000014180 ffff88001fa65370 ffff88001fa642c0 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? worker_thread+0x1d5/0x332 [16087.359872] [] ? bind_to_cpu0+0x0/0x2f [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] kacpi_hotplug S ffff88001fa642c0 6232 167 2 0x000000= 00 [16087.359872] ffff88001fa6bdc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001fa642c0 000000000000def8 ffff88001fa6bfd8 0000000000014180 [16087.359872] ffff88001fa6bfd8 0000000000014180 ffff88001fa642c0 ffff88001f910000 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? worker_thread+0x1d5/0x332 [16087.359872] [] ? bind_to_cpu0+0x0/0x2f [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] kseriod S ffff88001fa87e78 5352 239 2 0x000000= 00 [16087.359872] ffff88001fa87e40 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001fa63210 000000000000def8 ffff88001fa87fd8 0000000000014180 [16087.359872] ffff88001fa87fd8 0000000000014180 ffff88001fa63210 ffff88001f910000 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] serio_thread+0x2cd/0x30a [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? serio_thread+0x0/0x30a [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] rpciod/0 S 0000000000000000 6664 269 2 0x000000= 00 [16087.359872] ffff88001f08ddc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001fa62160 000000000000def8 ffff88001f08dfd8 0000000000014180 [16087.359872] ffff88001f08dfd8 0000000000014180 ffff88001fa62160 ffffffff81a0e020 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] rpciod/1 S 0000000000000000 6664 270 2 0x000000= 00 [16087.359872] ffff88001f08fdc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001fa60000 000000000000def8 ffff88001f08ffd8 0000000000014180 [16087.359872] ffff88001f08ffd8 0000000000014180 ffff88001fa60000 ffff88001f916420 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] rpciod/2 S 0000000000000000 6664 271 2 0x000000= 00 [16087.359872] ffff88001fa7fdc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001fa610b0 000000000000def8 ffff88001fa7ffd8 0000000000014180 [16087.359872] ffff88001fa7ffd8 0000000000014180 ffff88001fa610b0 ffff88001f962160 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] rpciod/3 S 0000000000000000 6664 272 2 0x000000= 00 [16087.359872] ffff88001f091dc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001fa66420 000000000000def8 ffff88001f091fd8 0000000000014180 [16087.359872] ffff88001f091fd8 0000000000014180 ffff88001fa66420 ffff88001f910000 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] kswapd0 S 00000000ffffffff 4352 319 2 0x000000= 00 [16087.359872] ffff88001f0bdd60 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001fb58000 000000000000def8 ffff88001f0bdfd8 0000000000014180 [16087.359872] ffff88001f0bdfd8 0000000000014180 ffff88001fb58000 ffff88001f152160 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] kswapd+0x853/0x867 [16087.359872] [] ? isolate_pages_global+0x0/0x1f2 [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] ? kswapd+0x0/0x867 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] aio/0 S 0000000000000000 6664 375 2 0x000000= 00 [16087.359872] ffff88001f0bfdc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001fb590b0 000000000000def8 ffff88001f0bffd8 0000000000014180 [16087.359872] ffff88001f0bffd8 0000000000014180 ffff88001fb590b0 ffffffff81a0e020 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] aio/1 S 0000000000000000 6664 376 2 0x000000= 00 [16087.359872] ffff88001f107dc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001fb5a160 000000000000def8 ffff88001f107fd8 0000000000014180 [16087.359872] ffff88001f107fd8 0000000000014180 ffff88001fb5a160 ffff88001f916420 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] aio/2 S 0000000000000000 6664 377 2 0x000000= 00 [16087.359872] ffff88001f143dc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001fb5b210 000000000000def8 ffff88001f143fd8 0000000000014180 [16087.359872] ffff88001f143fd8 0000000000014180 ffff88001fb5b210 ffff88001f962160 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] aio/3 S 0000000000000000 6664 378 2 0x000000= 00 [16087.359872] ffff88001f105dc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001fb5c2c0 000000000000def8 ffff88001f105fd8 0000000000014180 [16087.359872] ffff88001f105fd8 0000000000014180 ffff88001fb5c2c0 ffff88001f965370 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] nfsiod S 0000000000000000 6664 390 2 0x000000= 00 [16087.359872] ffff88001f0ffdc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001fb5d370 000000000000def8 ffff88001f0fffd8 0000000000014180 [16087.359872] ffff88001f0fffd8 0000000000014180 ffff88001fb5d370 ffff88001f916420 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] kslowd000 S ffff88001fb5e420 6768 399 2 0x000000= 00 [16087.359872] ffff88001f0fbe40 0000000000000046 0000000000000000 ffffffff81057e21 [16087.359872] ffff88001fb5e420 000000000000def8 ffff88001f0fbfd8 0000000000014180 [16087.359872] ffff88001f0fbfd8 0000000000014180 ffff88001fb5e420 ffff88001f916420 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait_exclusive+0x1e/0x7a [16087.359872] [] ? prepare_to_wait_exclusive+0x6f/0x7a [16087.359872] [] slow_work_thread+0x140/0x2da [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? slow_work_thread+0x0/0x2da [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] kslowd001 S ffff88001f0b42c0 6792 400 2 0x000000= 00 [16087.359872] ffff88001f16fe40 0000000000000046 0000000000000000 ffffffff81057e21 [16087.359872] ffff88001f0b42c0 000000000000def8 ffff88001f16ffd8 0000000000014180 [16087.359872] ffff88001f16ffd8 0000000000014180 ffff88001f0b42c0 ffff88001f962160 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait_exclusive+0x1e/0x7a [16087.359872] [] ? prepare_to_wait_exclusive+0x6f/0x7a [16087.359872] [] slow_work_thread+0x140/0x2da [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? slow_work_thread+0x0/0x2da [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] xfs_mru_cache S 0000000000000000 6664 409 2 0x000000= 00 [16087.359872] ffff88001f195dc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001f0b3210 000000000000def8 ffff88001f195fd8 0000000000014180 [16087.359872] ffff88001f195fd8 0000000000014180 ffff88001f0b3210 ffff88001f916420 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] xfslogd/0 S 0000000000000000 6664 410 2 0x000000= 00 [16087.359872] ffff88001f197dc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001f0b2160 000000000000def8 ffff88001f197fd8 0000000000014180 [16087.359872] ffff88001f197fd8 0000000000014180 ffff88001f0b2160 ffffffff81a0e020 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] xfslogd/1 S ffff88001f0b10b0 6376 411 2 0x000000= 00 [16087.359872] ffff88001f1a1dc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001f0b10b0 000000000000def8 ffff88001f1a1fd8 0000000000014180 [16087.359872] ffff88001f1a1fd8 0000000000014180 ffff88001f0b10b0 ffff88001fa53210 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? worker_thread+0x1d5/0x332 [16087.359872] [] ? xfs_buf_iodone_work+0x0/0xa1 [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] xfslogd/2 S ffff88001f0b0000 5952 412 2 0x000000= 00 [16087.359872] ffff88001f1a3dc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001f0b0000 000000000000def8 ffff88001f1a3fd8 0000000000014180 [16087.359872] ffff88001f1a3fd8 0000000000014180 ffff88001f0b0000 ffff88001fa542c0 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? worker_thread+0x1d5/0x332 [16087.359872] [] ? xfs_buf_iodone_work+0x0/0xa1 [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] xfslogd/3 S ffff88001f0b6420 6256 413 2 0x000000= 00 [16087.359872] ffff88001f1a5dc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001f0b6420 000000000000def8 ffff88001f1a5fd8 0000000000014180 [16087.359872] ffff88001f1a5fd8 0000000000014180 ffff88001f0b6420 ffff88001fa55370 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? worker_thread+0x1d5/0x332 [16087.359872] [] ? xfs_buf_iodone_work+0x0/0xa1 [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] xfsdatad/0 D ffff88001f0b5370 6216 414 2 0x000000= 00 [16087.359872] ffff88001f1a7d00 0000000000000046 0000000000000000 ffffffff81490baf [16087.359872] ffffffff81b71f00 000000000000def8 ffff88001f1a7fd8 0000000000014180 [16087.359872] ffff88001f1a7fd8 0000000000014180 ffff88001f0b5370 ffffffff81a0e020 [16087.359872] Call Trace: [16087.359872] [] ? _raw_spin_unlock_irqrestore+0x3f/0x4= 7 [16087.359872] [] ? __mod_timer+0x141/0x153 [16087.359872] [] ? init_timer_key+0x8d/0x99 [16087.359872] [] schedule_timeout+0xa2/0xc9 [16087.359872] [] ? process_timeout+0x0/0xb [16087.359872] [] ? queue_work+0x1a/0x1c [16087.359872] [] schedule_timeout_uninterruptible+0x19/= 0x1b [16087.359872] [] xfs_end_io+0x7d/0x8c [16087.359872] [] worker_thread+0x22c/0x332 [16087.359872] [] ? worker_thread+0x1d5/0x332 [16087.359872] [] ? xfs_end_io+0x0/0x8c [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] xfsdatad/1 S ffff88001f153210 6216 415 2 0x000000= 00 [16087.359872] ffff88001f1b1dc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001f153210 000000000000def8 ffff88001f1b1fd8 0000000000014180 [16087.359872] ffff88001f1b1fd8 0000000000014180 ffff88001f153210 ffff88001e5e42c0 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? worker_thread+0x1d5/0x332 [16087.359872] [] ? xfs_end_io+0x0/0x8c [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] xfsdatad/2 D ffff88001f152160 6112 416 2 0x000000= 00 [16087.359872] ffff88001f1b3d00 0000000000000046 0000000000000000 ffffffff81490baf [16087.359872] ffff88001f95c000 000000000000def8 ffff88001f1b3fd8 0000000000014180 [16087.359872] ffff88001f1b3fd8 0000000000014180 ffff88001f152160 ffff88001f962160 [16087.359872] Call Trace: [16087.359872] [] ? _raw_spin_unlock_irqrestore+0x3f/0x4= 7 [16087.359872] [] ? __mod_timer+0x141/0x153 [16087.359872] [] ? init_timer_key+0x8d/0x99 [16087.359872] [] schedule_timeout+0xa2/0xc9 [16087.359872] [] ? process_timeout+0x0/0xb [16087.359872] [] ? queue_work+0x1a/0x1c [16087.359872] [] schedule_timeout_uninterruptible+0x19/= 0x1b [16087.359872] [] xfs_end_io+0x7d/0x8c [16087.359872] [] worker_thread+0x22c/0x332 [16087.359872] [] ? worker_thread+0x1d5/0x332 [16087.359872] [] ? xfs_end_io+0x0/0x8c [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] xfsdatad/3 S ffff88001f1510b0 6176 417 2 0x000000= 00 [16087.359872] ffff88001f1b5dc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001f1510b0 000000000000def8 ffff88001f1b5fd8 0000000000014180 [16087.359872] ffff88001f1b5fd8 0000000000014180 ffff88001f1510b0 ffff88001fb58000 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? worker_thread+0x1d5/0x332 [16087.359872] [] ? xfs_end_io+0x0/0x8c [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] xfsconvertd/0 S 0000000000000000 6664 418 2 0x000000= 00 [16087.359872] ffff88001f1b7dc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001f1b8000 000000000000def8 ffff88001f1b7fd8 0000000000014180 [16087.359872] ffff88001f1b7fd8 0000000000014180 ffff88001f1b8000 ffffffff81a0e020 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] xfsconvertd/1 S 0000000000000000 6664 419 2 0x000000= 00 [16087.359872] ffff88001f1c1dc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001f1b90b0 000000000000def8 ffff88001f1c1fd8 0000000000014180 [16087.359872] ffff88001f1c1fd8 0000000000014180 ffff88001f1b90b0 ffff88001f916420 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] xfsconvertd/2 S 0000000000000000 6664 420 2 0x000000= 00 [16087.359872] ffff88001f1c3dc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001f1ba160 000000000000def8 ffff88001f1c3fd8 0000000000014180 [16087.359872] ffff88001f1c3fd8 0000000000014180 ffff88001f1ba160 ffff88001f962160 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] xfsconvertd/3 S 0000000000000000 6664 421 2 0x000000= 00 [16087.359872] ffff88001f1c5dc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001f1bb210 000000000000def8 ffff88001f1c5fd8 0000000000014180 [16087.359872] ffff88001f1c5fd8 0000000000014180 ffff88001f1bb210 ffff88001f965370 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] crypto/0 S 0000000000000000 6664 423 2 0x000000= 00 [16087.359872] ffff88001f135dc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001f1bc2c0 000000000000def8 ffff88001f135fd8 0000000000014180 [16087.359872] ffff88001f135fd8 0000000000014180 ffff88001f1bc2c0 ffffffff81a0e020 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] crypto/1 S 0000000000000000 6664 424 2 0x000000= 00 [16087.359872] ffff88001fa07dc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001f1bd370 000000000000def8 ffff88001fa07fd8 0000000000014180 [16087.359872] ffff88001fa07fd8 0000000000014180 ffff88001f1bd370 ffff88001f916420 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] crypto/2 S 0000000000000000 6664 425 2 0x000000= 00 [16087.359872] ffff88001f191dc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001f1be420 000000000000def8 ffff88001f191fd8 0000000000014180 [16087.359872] ffff88001f191fd8 0000000000014180 ffff88001f1be420 ffff88001f962160 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] crypto/3 S 0000000000000000 6664 426 2 0x000000= 00 [16087.359872] ffff88001f1c7dc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001f150000 000000000000def8 ffff88001f1c7fd8 0000000000014180 [16087.359872] ffff88001f1c7fd8 0000000000014180 ffff88001f150000 ffff88001f965370 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] kpsmoused S 0000000000000000 6664 575 2 0x000000= 00 [16087.359872] ffff88001f22ddc0 0000000000000046 ffff88001f22dd90 ffff88001f22dd8c [16087.359872] ffff88001f1e6420 000000000000def8 ffff88001f22dfd8 0000000000014180 [16087.359872] ffff88001f22dfd8 0000000000014180 ffff88001f1e6420 ffff88001f962160 [16087.359872] Call Trace: [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] edac-poller S 0000000000000000 6664 583 2 0x000000= 00 [16087.359872] ffff88001f283dc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001f1e5370 000000000000def8 ffff88001f283fd8 0000000000014180 [16087.359872] ffff88001f283fd8 0000000000014180 ffff88001f1e5370 ffff88001f916420 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] kondemand/0 S 0000000000000000 6664 586 2 0x000000= 00 [16087.359872] ffff88001f289dc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001f1e3210 000000000000def8 ffff88001f289fd8 0000000000014180 [16087.359872] ffff88001f289fd8 0000000000014180 ffff88001f1e3210 ffffffff81a0e020 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] kondemand/1 S 0000000000000000 6664 587 2 0x000000= 00 [16087.359872] ffff88001f28bdc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001f1e2160 000000000000def8 ffff88001f28bfd8 0000000000014180 [16087.359872] ffff88001f28bfd8 0000000000014180 ffff88001f1e2160 ffff88001f916420 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] kondemand/2 S 0000000000000000 6664 588 2 0x000000= 00 [16087.359872] ffff88001f28ddc0 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001f1e10b0 000000000000def8 ffff88001f28dfd8 0000000000014180 [16087.359872] ffff88001f28dfd8 0000000000014180 ffff88001f1e10b0 ffff88001f962160 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] kondemand/3 S 0000000000000000 6664 589 2 0x000000= 00 [16087.359872] ffff88001f28fdc0 0000000000000046 ffff88001f28fd90 ffff88001f28fd8c [16087.359872] ffff88001f1e0000 000000000000def8 ffff88001f28ffd8 0000000000014180 [16087.359872] ffff88001f28ffd8 0000000000014180 ffff88001f1e0000 ffff88001f965370 [16087.359872] Call Trace: [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] worker_thread+0xfd/0x332 [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] ? worker_thread+0x0/0x332 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] vballoon S ffff88001ec37e60 6736 605 2 0x000000= 00 [16087.359872] ffff88001ec37e20 0000000000000046 0000000000000000 ffffffff81057e9b [16087.359872] ffff88001ec38000 000000000000def8 ffff88001ec37fd8 0000000000014180 [16087.359872] ffff88001ec37fd8 0000000000014180 ffff88001ec38000 ffff88001f916420 [16087.359872] Call Trace: [16087.359872] [] ? prepare_to_wait+0x1e/0x7b [16087.359872] [] ? vp_get+0x48/0x5d [16087.359872] [] balloon+0x143/0x2c0 [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? balloon+0x0/0x2c0 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] kjournald S ffff88001f09e970 3984 620 2 0x000000= 00 [16087.359872] ffff88001ec4de20 0000000000000046 ffff88001ec4dd90 ffffffff81067901 [16087.359872] ffff88001ec390b0 000000000000def8 ffff88001ec4dfd8 0000000000014180 [16087.359872] ffff88001ec4dfd8 0000000000014180 ffff88001ec390b0 ffff88001f0b5370 [16087.359872] Call Trace: [16087.359872] [] ? mark_held_locks+0x4d/0x6b [16087.359872] [] kjournald+0x1cf/0x25a [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? kjournald+0x0/0x25a [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] udevd S 0000000000000000 5616 711 1 0x000000= 00 [16087.359872] ffff88001ed73a58 0000000000000046 0000000000000000 000000000000004c [16087.359872] ffff88001ed73a88 000000000000def8 ffff88001ed73fd8 0000000000014180 [16087.359872] ffff88001ed73fd8 0000000000014180 ffff88001edb2160 ffffffff81a0e020 [16087.359872] Call Trace: [16087.359872] [] schedule_hrtimeout_range+0x3f/0xf7 [16087.359872] [] ? _raw_spin_unlock+0x26/0x2b [16087.359872] [] ? unix_peer_get+0x19/0x3d [16087.359872] [] ? unix_peer_get+0x35/0x3d [16087.359872] [] poll_schedule_timeout+0x46/0x69 [16087.359872] [] do_sys_poll+0x36a/0x40b [16087.359872] [] ? __pollwait+0x0/0xcf [16087.359872] [] ? pollwake+0x0/0x5c [16087.359872] [] ? pollwake+0x0/0x5c [16087.359872] [] ? pollwake+0x0/0x5c [16087.359872] [] ? pollwake+0x0/0x5c [16087.359872] [] ? pollwake+0x0/0x5c [16087.359872] [] ? __pagevec_free+0x70/0x85 [16087.359872] [] ? release_pages+0x1aa/0x1bc [16087.359872] [] ? anon_vma_unlink+0x1b/0x71 [16087.359872] [] ? mark_held_locks+0x4d/0x6b [16087.359872] [] ? kmem_cache_free+0x99/0xd3 [16087.359872] [] ? trace_hardirqs_on_caller+0x10b/0x12f [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] ? remove_vma+0x7f/0x87 [16087.359872] [] ? remove_vma+0x7f/0x87 [16087.359872] [] ? sysret_check+0x27/0x62 [16087.359872] [] sys_poll+0x50/0xba [16087.359872] [] system_call_fastpath+0x16/0x1b [16087.359872] dhcpcd S 0000000000000000 3536 2636 1 0x000000= 00 [16087.359872] ffff88001e785a58 0000000000000046 0000000000000000 0000000000000282 [16087.359872] 0000000000000040 000000000000def8 ffff88001e785fd8 0000000000014180 [16087.359872] ffff88001e785fd8 0000000000014180 ffff88001ec3c2c0 ffff88001f965370 [16087.359872] Call Trace: [16087.359872] [] schedule_hrtimeout_range+0xc2/0xf7 [16087.359872] [] ? hrtimer_wakeup+0x0/0x21 [16087.359872] [] ? hrtimer_start_range_ns+0xf/0x11 [16087.359872] [] ? __pollwait+0xc6/0xcf [16087.359872] [] poll_schedule_timeout+0x46/0x69 [16087.359872] [] do_sys_poll+0x36a/0x40b [16087.359872] [] ? __pollwait+0x0/0xcf [16087.359872] [] ? pollwake+0x0/0x5c [16087.359872] [] ? pollwake+0x0/0x5c [16087.359872] [] ? mark_lock+0x22/0x225 [16087.359872] [] ? fsnotify_clear_marks_by_inode+0x2b/0= xe0 [16087.359872] [] ? kmem_cache_free+0x99/0xd3 [16087.359872] [] ? trace_hardirqs_on_caller+0x10b/0x12f [16087.359872] [] ? kmem_cache_free+0x99/0xd3 [16087.359872] [] ? trace_hardirqs_on_caller+0x10b/0x12f [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] ? __d_free+0x51/0x55 [16087.359872] [] ? d_free+0x32/0x4b [16087.359872] [] ? mntput_no_expire+0x24/0xf8 [16087.359872] [] ? ktime_get_ts+0xb1/0xbe [16087.359872] [] ? poll_select_set_timeout+0x5c/0x77 [16087.359872] [] sys_poll+0x50/0xba [16087.359872] [] system_call_fastpath+0x16/0x1b [16087.359872] login S ffff88001edb42c0 4896 2847 1 0x000000= 00 [16087.359872] ffff88001dc61e58 0000000000000046 0000000000000000 0000000000000000 [16087.359872] ffff88001dc61e08 000000000000def8 ffff88001dc61fd8 0000000000014180 [16087.359872] ffff88001dc61fd8 0000000000014180 ffff88001edb42c0 ffff88001f916420 [16087.359872] Call Trace: [16087.359872] [] do_wait+0x1bd/0x22b [16087.359872] [] sys_wait4+0xa6/0xc3 [16087.359872] [] ? child_wait_callback+0x0/0x53 [16087.359872] [] system_call_fastpath+0x16/0x1b [16087.359872] agetty S ffff88001f9ec290 5784 2848 1 0x000000= 00 [16087.359872] ffff88001dcddd08 0000000000000046 0000000000000000 0000000000000000 [16087.359872] ffff88001edb6420 000000000000def8 ffff88001dcddfd8 0000000000014180 [16087.359872] ffff88001dcddfd8 0000000000014180 ffff88001edb6420 ffff88001f962160 [16087.359872] Call Trace: [16087.359872] [] ? flush_work+0x2b/0xf2 [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] schedule_timeout+0x22/0xc9 [16087.359872] [] ? del_timer_sync+0x73/0x84 [16087.359872] [] ? del_timer_sync+0x0/0x84 [16087.359872] [] ? flush_delayed_work+0x50/0x55 [16087.359872] [] n_tty_read+0x517/0x7f3 [16087.359872] [] ? default_wake_function+0x0/0xf [16087.359872] [] tty_read+0x7d/0xba [16087.359872] [] vfs_read+0xa8/0x102 [16087.359872] [] sys_read+0x47/0x70 [16087.359872] [] system_call_fastpath+0x16/0x1b [16087.359872] agetty S ffff88001f9bd350 5320 2849 1 0x000000= 00 [16087.359872] ffff88001f231d08 0000000000000046 0000000000000000 0000000000000000 [16087.359872] ffff88001edb3210 000000000000def8 ffff88001f231fd8 0000000000014180 [16087.359872] ffff88001f231fd8 0000000000014180 ffff88001edb3210 ffff88001f962160 [16087.359872] Call Trace: [16087.359872] [] ? flush_work+0x2b/0xf2 [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] schedule_timeout+0x22/0xc9 [16087.359872] [] ? del_timer_sync+0x73/0x84 [16087.359872] [] ? del_timer_sync+0x0/0x84 [16087.359872] [] ? flush_delayed_work+0x50/0x55 [16087.359872] [] n_tty_read+0x517/0x7f3 [16087.359872] [] ? default_wake_function+0x0/0xf [16087.359872] [] tty_read+0x7d/0xba [16087.359872] [] vfs_read+0xa8/0x102 [16087.359872] [] sys_read+0x47/0x70 [16087.359872] [] system_call_fastpath+0x16/0x1b [16087.359872] agetty S ffff88001f9bd360 5224 2850 1 0x000000= 00 [16087.359872] ffff88001ed71d08 0000000000000046 0000000000000000 0000000000000000 [16087.359872] ffff88001edb0000 000000000000def8 ffff88001ed71fd8 0000000000014180 [16087.359872] ffff88001ed71fd8 0000000000014180 ffff88001edb0000 ffff88001f916420 [16087.359872] Call Trace: [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] schedule_timeout+0x22/0xc9 [16087.359872] [] ? del_timer_sync+0x73/0x84 [16087.359872] [] ? del_timer_sync+0x0/0x84 [16087.359872] [] ? flush_delayed_work+0x50/0x55 [16087.359872] [] n_tty_read+0x517/0x7f3 [16087.359872] [] ? default_wake_function+0x0/0xf [16087.359872] [] tty_read+0x7d/0xba [16087.359872] [] vfs_read+0xa8/0x102 [16087.359872] [] sys_read+0x47/0x70 [16087.359872] [] system_call_fastpath+0x16/0x1b [16087.359872] agetty S ffff88001f21c5e0 5224 2851 1 0x000000= 00 [16087.359872] ffff88001e425d08 0000000000000046 0000000000000000 0000000000000000 [16087.359872] ffff88001edb10b0 000000000000def8 ffff88001e425fd8 0000000000014180 [16087.359872] ffff88001e425fd8 0000000000014180 ffff88001edb10b0 ffff88001f965370 [16087.359872] Call Trace: [16087.359872] [] ? flush_work+0x2b/0xf2 [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] schedule_timeout+0x22/0xc9 [16087.359872] [] ? del_timer_sync+0x73/0x84 [16087.359872] [] ? del_timer_sync+0x0/0x84 [16087.359872] [] ? flush_delayed_work+0x50/0x55 [16087.359872] [] n_tty_read+0x517/0x7f3 [16087.359872] [] ? default_wake_function+0x0/0xf [16087.359872] [] tty_read+0x7d/0xba [16087.359872] [] vfs_read+0xa8/0x102 [16087.359872] [] sys_read+0x47/0x70 [16087.359872] [] system_call_fastpath+0x16/0x1b [16087.359872] agetty S ffff88001fa78a80 5784 2852 1 0x000000= 00 [16087.359872] ffff88001dd1bd08 0000000000000046 0000000000000000 0000000000000000 [16087.359872] ffff88001edb5370 000000000000def8 ffff88001dd1bfd8 0000000000014180 [16087.359872] ffff88001dd1bfd8 0000000000014180 ffff88001edb5370 ffffffff81a0e020 [16087.359872] Call Trace: [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] schedule_timeout+0x22/0xc9 [16087.359872] [] ? del_timer_sync+0x73/0x84 [16087.359872] [] ? del_timer_sync+0x0/0x84 [16087.359872] [] ? flush_delayed_work+0x50/0x55 [16087.359872] [] n_tty_read+0x517/0x7f3 [16087.359872] [] ? default_wake_function+0x0/0xf [16087.359872] [] tty_read+0x7d/0xba [16087.359872] [] vfs_read+0xa8/0x102 [16087.359872] [] sys_read+0x47/0x70 [16087.359872] [] system_call_fastpath+0x16/0x1b [16087.359872] bash R running task 3968 2853 2847 0x000000= 00 [16087.359872] 332e37383036315b ffffffff8148e017 0000003000000010 ffff88001eda3d98 [16087.359872] ffff88001eda3cd8 0000000137383935 ffff88001eda2000 ffff88001eda2000 [16087.359872] ffff880002780000 0000000000000000 0000000000000082 0000000000000004 [16087.359872] Call Trace: [16087.359872] [] ? dump_trace+0x2fe/0x30f [16087.359872] [] show_trace_log_lvl+0x4c/0x58 [16087.359872] [] show_stack_log_lvl+0xff/0x10e [16087.359872] [] show_stack+0x17/0x19 [16087.359872] [] sched_show_task+0xc0/0xc5 [16087.359872] [] show_state_filter+0x50/0x9b [16087.359872] [] sysrq_handle_showstate+0xb/0xd [16087.359872] [] __handle_sysrq+0xbb/0x158 [16087.359872] [] ? write_sysrq_trigger+0x0/0x44 [16087.359872] [] write_sysrq_trigger+0x39/0x44 [16087.359872] [] proc_reg_write+0x84/0xa1 [16087.359872] [] vfs_write+0xab/0x105 [16087.359872] [] sys_write+0x47/0x70 [16087.359872] [] system_call_fastpath+0x16/0x1b [16087.359872] xfsbufd S ffff88001eecde80 6208 2861 2 0x000000= 00 [16087.359872] ffff88001eecddd0 0000000000000046 0000000000000000 ffffffff81490baf [16087.359872] ffff88001f970000 000000000000def8 ffff88001eecdfd8 0000000000014180 [16087.359872] ffff88001eecdfd8 0000000000014180 ffff88001e5890b0 ffff88001f965370 [16087.359872] Call Trace: [16087.359872] [] ? _raw_spin_unlock_irqrestore+0x3f/0x4= 7 [16087.359872] [] ? __mod_timer+0x141/0x153 [16087.359872] [] ? init_timer_key+0x8d/0x99 [16087.359872] [] schedule_timeout+0xa2/0xc9 [16087.359872] [] ? process_timeout+0x0/0xb [16087.359872] [] schedule_timeout_interruptible+0x19/0x= 1b [16087.359872] [] xfsbufd+0x73/0x10d [16087.359872] [] ? xfsbufd+0x0/0x10d [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] xfsaild S 0000000000000000 6440 2862 2 0x000000= 00 [16087.359872] ffff88001dc81de0 0000000000000046 ffff88001e58c2c0 ffffffff81490baf [16087.359872] ffffffff81b71f00 000000000000def8 ffff88001dc81fd8 0000000000014180 [16087.359872] ffff88001dc81fd8 0000000000014180 ffff88001e58c2c0 ffff88001f0b5370 [16087.359872] Call Trace: [16087.359872] [] ? _raw_spin_unlock_irqrestore+0x3f/0x4= 7 [16087.359872] [] ? __mod_timer+0x141/0x153 [16087.359872] [] ? init_timer_key+0x8d/0x99 [16087.359872] [] schedule_timeout+0xa2/0xc9 [16087.359872] [] ? process_timeout+0x0/0xb [16087.359872] [] schedule_timeout_interruptible+0x19/0x= 1b [16087.359872] [] xfsaild+0x3f/0x84 [16087.359872] [] ? xfsaild+0x0/0x84 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] xfssyncd S 0000000000007530 5664 2863 2 0x000000= 00 [16087.359872] ffff88001ef3dda0 0000000000000046 0000000000000000 ffffffff81490baf [16087.359872] ffff88001f934000 000000000000def8 ffff88001ef3dfd8 0000000000014180 [16087.359872] ffff88001ef3dfd8 0000000000014180 ffff88001e58e420 ffff88001f916420 [16087.359872] Call Trace: [16087.359872] [] ? _raw_spin_unlock_irqrestore+0x3f/0x4= 7 [16087.359872] [] ? __mod_timer+0x141/0x153 [16087.359872] [] ? init_timer_key+0x8d/0x99 [16087.359872] [] schedule_timeout+0xa2/0xc9 [16087.359872] [] ? process_timeout+0x0/0xb [16087.359872] [] schedule_timeout_interruptible+0x19/0x= 1b [16087.359872] [] xfssyncd+0x80/0x1bd [16087.359872] [] ? xfssyncd+0x0/0x1bd [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] screen S 0000000000000000 5008 2876 1 0x000000= 00 [16087.359872] ffff88001f2d1908 0000000000000046 0000000000000000 ffffffff81067b93 [16087.359872] ffff88001f2d1878 000000000000def8 ffff88001f2d1fd8 0000000000014180 [16087.359872] ffff88001f2d1fd8 0000000000014180 ffff88001e58d370 ffff88001f965370 [16087.359872] Call Trace: [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] ? try_to_del_timer_sync+0x66/0x74 [16087.359872] [] schedule_hrtimeout_range+0x3f/0xf7 [16087.359872] [] ? put_ldisc+0x91/0x98 [16087.359872] [] ? trace_hardirqs_on_caller+0x10b/0x12f [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] poll_schedule_timeout+0x46/0x69 [16087.359872] [] do_select+0x5c1/0x605 [16087.359872] [] ? do_select+0x0/0x605 [16087.359872] [] ? __pollwait+0x0/0xcf [16087.359872] [] ? pollwake+0x0/0x5c [16087.359872] [] ? pollwake+0x0/0x5c [16087.359872] [] ? pollwake+0x0/0x5c [16087.359872] [] ? pollwake+0x0/0x5c [16087.359872] [] ? pollwake+0x0/0x5c [16087.359872] [] ? pollwake+0x0/0x5c [16087.359872] [] ? pollwake+0x0/0x5c [16087.359872] [] ? pollwake+0x0/0x5c [16087.359872] [] ? pollwake+0x0/0x5c [16087.359872] [] core_sys_select+0x1b9/0x255 [16087.359872] [] ? core_sys_select+0x41/0x255 [16087.359872] [] ? lock_release_non_nested+0x97/0x20d [16087.359872] [] ? lock_release_non_nested+0x97/0x20d [16087.359872] [] ? _raw_spin_unlock_irq+0x2b/0x31 [16087.359872] [] ? might_fault+0x57/0xa4 [16087.359872] [] ? might_fault+0x57/0xa4 [16087.359872] [] sys_select+0x94/0xbc [16087.359872] [] ? trace_hardirqs_on_thunk+0x3a/0x3f [16087.359872] [] system_call_fastpath+0x16/0x1b [16087.359872] bash S ffff88001f1542c0 5384 2877 2876 0x000000= 00 [16087.359872] ffff88001dc17e58 0000000000000046 0000000000000000 0000000000000000 [16087.359872] ffff88001dc17e08 000000000000def8 ffff88001dc17fd8 0000000000014180 [16087.359872] ffff88001dc17fd8 0000000000014180 ffff88001f1542c0 ffff88001f965370 [16087.359872] Call Trace: [16087.359872] [] do_wait+0x1bd/0x22b [16087.359872] [] ? might_fault+0x57/0xa4 [16087.359872] [] sys_wait4+0xa6/0xc3 [16087.359872] [] ? child_wait_callback+0x0/0x53 [16087.359872] [] system_call_fastpath+0x16/0x1b [16087.359872] test-mysqld S 0000000000000000 5096 2881 2877 0x000000= 00 [16087.359872] ffff88001ee51bf8 0000000000000046 0000000000000000 ffffffff8106a8a6 [16087.359872] 0000000100000000 000000000000def8 ffff88001ee51fd8 0000000000014180 [16087.359872] ffff88001ee51fd8 0000000000014180 ffff88001dcb42c0 ffff88001f962160 [16087.359872] Call Trace: [16087.359872] [] ? queue_lock+0x57/0x5f [16087.359872] [] ? _raw_spin_unlock+0x26/0x2b [16087.359872] [] futex_wait_queue_me+0x82/0x9a [16087.359872] [] futex_wait+0x143/0x2b1 [16087.359872] [] ? select_task_rq_fair+0x7a7/0x81e [16087.359872] [] do_futex+0x98/0x9a2 [16087.359872] [] ? trace_hardirqs_off+0xd/0xf [16087.359872] [] ? _raw_spin_unlock_irqrestore+0x3f/0x4= 7 [16087.359872] [] ? trace_hardirqs_on_caller+0x10b/0x12f [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] ? wake_up_new_task+0xd4/0xe2 [16087.359872] [] ? do_fork+0x279/0x33e [16087.359872] [] ? call_rwsem_wake+0x18/0x30 [16087.359872] [] sys_futex+0x113/0x131 [16087.359872] [] ? trace_hardirqs_on_thunk+0x3a/0x3f [16087.359872] [] system_call_fastpath+0x16/0x1b [16087.359872] test-mysqld D 0000000000000002 3440 2882 2877 0x000000= 00 [16087.359872] ffff88001edfba88 0000000000000046 ffff88001edfba08 ffffffff810676b1 [16087.359872] ffff88001ec1e420 000000000000def8 ffff88001edfbfd8 0000000000014180 [16087.359872] ffff88001edfbfd8 0000000000014180 ffff88001ec1e420 ffff88001f152160 [16087.359872] Call Trace: [16087.359872] [] ? mark_lock+0x22/0x225 [16087.359872] [] ? ktime_get_ts+0xb1/0xbe [16087.359872] [] io_schedule+0x7b/0xc2 [16087.359872] [] sync_page+0x44/0x48 [16087.359872] [] __wait_on_bit_lock+0x45/0x8c [16087.359872] [] ? sync_page+0x0/0x48 [16087.359872] [] __lock_page+0x63/0x6a [16087.359872] [] ? wake_bit_function+0x0/0x2a [16087.359872] [] lock_page+0x37/0x3b [16087.359872] [] invalidate_inode_pages2_range+0x82/0x2= cb [16087.359872] [] ? xfs_vm_direct_IO+0x90/0xbb [16087.359872] [] ? xfs_get_blocks_direct+0x0/0x17 [16087.359872] [] ? xfs_end_io_direct+0x0/0x4e [16087.359872] [] generic_file_direct_write+0x102/0x158 [16087.359872] [] xfs_write+0x4a5/0x793 [16087.359872] [] ? cpuacct_charge+0x8e/0x97 [16087.359872] [] ? mark_lock+0x22/0x225 [16087.359872] [] xfs_file_aio_write+0x5a/0x5c [16087.359872] [] do_sync_write+0xc0/0x106 [16087.359872] [] ? fget_light+0x4f/0xfb [16087.359872] [] ? security_file_permission+0x11/0x13 [16087.359872] [] vfs_write+0xab/0x105 [16087.359872] [] sys_write+0x47/0x70 [16087.359872] [] system_call_fastpath+0x16/0x1b [16087.359872] test-mysqld D ffff88001ec190b0 3152 2883 2877 0x000000= 00 [16087.359872] ffff88001e4bde28 0000000000000046 ffff88001e4bdda8 ffffffff810676b1 [16087.359872] ffff88001ec190b0 000000000000def8 ffff88001e4bdfd8 0000000000014180 [16087.359872] ffff88001e4bdfd8 0000000000014180 ffff88001ec190b0 ffff88001ec3b210 [16087.359872] Call Trace: [16087.359872] [] ? mark_lock+0x22/0x225 [16087.359872] [] ? mark_held_locks+0x4d/0x6b [16087.359872] [] ? __mutex_lock_common+0x216/0x330 [16087.359872] [] __mutex_lock_common+0x21e/0x330 [16087.359872] [] ? generic_file_llseek+0x2c/0x5e [16087.359872] [] ? generic_file_llseek+0x2c/0x5e [16087.359872] [] ? fget_light+0x4f/0xfb [16087.359872] [] mutex_lock_nested+0x37/0x3c [16087.359872] [] generic_file_llseek+0x2c/0x5e [16087.359872] [] vfs_llseek+0x35/0x37 [16087.359872] [] sys_lseek+0x48/0x67 [16087.359872] [] system_call_fastpath+0x16/0x1b [16087.359872] test-mysqld D 0000000000000000 3360 2884 2877 0x000000= 00 [16087.359872] ffff88001ece7e28 0000000000000046 ffff88001ece7df8 ffff88001ece7df4 [16087.359872] ffff88001e9e0000 000000000000def8 ffff88001ece7fd8 0000000000014180 [16087.359872] ffff88001ece7fd8 0000000000014180 ffff88001ec1a160 ffffffff81a0e020 [16087.359872] Call Trace: [16087.359872] [] ? __mutex_lock_common+0x216/0x330 [16087.359872] [] __mutex_lock_common+0x21e/0x330 [16087.359872] [] ? generic_file_llseek+0x2c/0x5e [16087.359872] [] ? generic_file_llseek+0x2c/0x5e [16087.359872] [] ? fget_light+0x4f/0xfb [16087.359872] [] mutex_lock_nested+0x37/0x3c [16087.359872] [] generic_file_llseek+0x2c/0x5e [16087.359872] [] vfs_llseek+0x35/0x37 [16087.359872] [] sys_lseek+0x48/0x67 [16087.359872] [] system_call_fastpath+0x16/0x1b [16087.359872] test-mysqld D 0000000000000000 2664 2885 2877 0x000000= 00 [16087.359872] ffff88001ecc9bb8 0000000000000046 ffff88001ecc9b38 ffffffff810676b1 [16087.359872] ffff880002614180 000000000000def8 ffff88001ecc9fd8 0000000000014180 [16087.359872] ffff88001ecc9fd8 0000000000014180 ffff88001ec1c2c0 ffff88001ec3b210 [16087.359872] Call Trace: [16087.359872] [] ? mark_lock+0x22/0x225 [16087.359872] [] ? trace_hardirqs_on_caller+0x10b/0x12f [16087.359872] [] rwsem_down_failed_common+0x9a/0xcc [16087.359872] [] rwsem_down_write_failed+0x20/0x2a [16087.359872] [] call_rwsem_down_write_failed+0x13/0x20 [16087.359872] [] ? down_write_nested+0x66/0x6d [16087.359872] [] ? xfs_ilock+0x2c/0xb2 [16087.359872] [] xfs_ilock+0x2c/0xb2 [16087.359872] [] xfs_write+0x2cc/0x793 [16087.359872] [] ? mark_lock+0x22/0x225 [16087.359872] [] xfs_file_aio_write+0x5a/0x5c [16087.359872] [] do_sync_write+0xc0/0x106 [16087.359872] [] ? fget_light+0x4f/0xfb [16087.359872] [] ? security_file_permission+0x11/0x13 [16087.359872] [] vfs_write+0xab/0x105 [16087.359872] [] sys_write+0x47/0x70 [16087.359872] [] system_call_fastpath+0x16/0x1b [16087.359872] test-mysqld D ffff88001ec1d370 2664 2886 2877 0x000000= 00 [16087.359872] ffff88001eea1e28 0000000000000046 ffff88001eea1da8 ffffffff810676b1 [16087.359872] 000000000000000d 000000000000def8 ffff88001eea1fd8 0000000000014180 [16087.359872] ffff88001eea1fd8 0000000000014180 ffff88001ec1d370 ffff88001fa53210 [16087.359872] Call Trace: [16087.359872] [] ? mark_lock+0x22/0x225 [16087.359872] [] ? mark_held_locks+0x4d/0x6b [16087.359872] [] ? __mutex_lock_common+0x216/0x330 [16087.359872] [] __mutex_lock_common+0x21e/0x330 [16087.359872] [] ? generic_file_llseek+0x2c/0x5e [16087.359872] [] ? generic_file_llseek+0x2c/0x5e [16087.359872] [] ? fget_light+0x4f/0xfb [16087.359872] [] mutex_lock_nested+0x37/0x3c [16087.359872] [] generic_file_llseek+0x2c/0x5e [16087.359872] [] vfs_llseek+0x35/0x37 [16087.359872] [] sys_lseek+0x48/0x67 [16087.359872] [] system_call_fastpath+0x16/0x1b [16087.359872] test-mysqld D 0000000000000002 3440 2887 2877 0x000000= 00 [16087.359872] ffff88001ee87a88 0000000000000046 0000000000000000 ffff88000240a980 [16087.359872] 0000000046e48524 000000000000def8 ffff88001ee87fd8 0000000000014180 [16087.359872] ffff88001ee87fd8 0000000000014180 ffff88001ec1b210 ffffffff81a0e020 [16087.359872] Call Trace: [16087.359872] [] ? ktime_get_ts+0xb1/0xbe [16087.359872] [] io_schedule+0x7b/0xc2 [16087.359872] [] sync_page+0x44/0x48 [16087.359872] [] __wait_on_bit_lock+0x45/0x8c [16087.359872] [] ? sync_page+0x0/0x48 [16087.359872] [] __lock_page+0x63/0x6a [16087.359872] [] ? wake_bit_function+0x0/0x2a [16087.359872] [] lock_page+0x37/0x3b [16087.359872] [] invalidate_inode_pages2_range+0x82/0x2= cb [16087.359872] [] ? xfs_vm_direct_IO+0x90/0xbb [16087.359872] [] ? xfs_get_blocks_direct+0x0/0x17 [16087.359872] [] ? xfs_end_io_direct+0x0/0x4e [16087.359872] [] generic_file_direct_write+0x102/0x158 [16087.359872] [] xfs_write+0x4a5/0x793 [16087.359872] [] ? cpuacct_charge+0x8e/0x97 [16087.359872] [] ? mark_lock+0x22/0x225 [16087.359872] [] xfs_file_aio_write+0x5a/0x5c [16087.359872] [] do_sync_write+0xc0/0x106 [16087.359872] [] ? fget_light+0x4f/0xfb [16087.359872] [] ? security_file_permission+0x11/0x13 [16087.359872] [] vfs_write+0xab/0x105 [16087.359872] [] sys_write+0x47/0x70 [16087.359872] [] system_call_fastpath+0x16/0x1b [16087.359872] test-mysqld D ffff88001f1e42c0 2664 2888 2877 0x000000= 00 [16087.359872] ffff88001dcc5e28 0000000000000046 0000000000000000 ffffffff810676b1 [16087.359872] ffff88001e9e0000 000000000000def8 ffff88001dcc5fd8 0000000000014180 [16087.359872] ffff88001dcc5fd8 0000000000014180 ffff88001f1e42c0 ffff88001f962160 [16087.359872] Call Trace: [16087.359872] [] ? mark_lock+0x22/0x225 [16087.359872] [] ? __mutex_lock_common+0x216/0x330 [16087.359872] [] __mutex_lock_common+0x21e/0x330 [16087.359872] [] ? generic_file_llseek+0x2c/0x5e [16087.359872] [] ? generic_file_llseek+0x2c/0x5e [16087.359872] [] ? fget_light+0x4f/0xfb [16087.359872] [] mutex_lock_nested+0x37/0x3c [16087.359872] [] generic_file_llseek+0x2c/0x5e [16087.359872] [] vfs_llseek+0x35/0x37 [16087.359872] [] sys_lseek+0x48/0x67 [16087.359872] [] system_call_fastpath+0x16/0x1b [16087.359872] test-mysqld D ffff88001ec3d370 2664 2889 2877 0x000000= 00 [16087.359872] ffff88001ede5e28 0000000000000046 ffff88001ede5da8 ffffffff810676b1 [16087.359872] ffff88001ec3d370 000000000000def8 ffff88001ede5fd8 0000000000014180 [16087.359872] ffff88001ede5fd8 0000000000014180 ffff88001ec3d370 ffff88001f0b5370 [16087.359872] Call Trace: [16087.359872] [] ? mark_lock+0x22/0x225 [16087.359872] [] ? mark_held_locks+0x4d/0x6b [16087.359872] [] ? __mutex_lock_common+0x216/0x330 [16087.359872] [] __mutex_lock_common+0x21e/0x330 [16087.359872] [] ? generic_file_llseek+0x2c/0x5e [16087.359872] [] ? generic_file_llseek+0x2c/0x5e [16087.359872] [] ? fget_light+0x4f/0xfb [16087.359872] [] mutex_lock_nested+0x37/0x3c [16087.359872] [] generic_file_llseek+0x2c/0x5e [16087.359872] [] vfs_llseek+0x35/0x37 [16087.359872] [] sys_lseek+0x48/0x67 [16087.359872] [] system_call_fastpath+0x16/0x1b [16087.359872] test-mysqld D 0000000000000000 3152 2890 2877 0x000000= 00 [16087.359872] ffff88001e6fbc08 0000000000000046 ffff88001e6fbbd8 ffff88001e6fbbd4 [16087.359872] ffff88001ec3b210 000000000000def8 ffff88001e6fbfd8 0000000000014180 [16087.359872] ffff88001e6fbfd8 0000000000014180 ffff88001ec3b210 ffff88001ec1a160 [16087.359872] Call Trace: [16087.359872] [] ? __mutex_lock_common+0x216/0x330 [16087.359872] [] __mutex_lock_common+0x21e/0x330 [16087.359872] [] ? xfs_write+0x2bf/0x793 [16087.359872] [] ? xfs_write+0x2bf/0x793 [16087.359872] [] mutex_lock_nested+0x37/0x3c [16087.359872] [] xfs_write+0x2bf/0x793 [16087.359872] [] ? cpuacct_charge+0x8e/0x97 [16087.359872] [] ? mark_lock+0x22/0x225 [16087.359872] [] xfs_file_aio_write+0x5a/0x5c [16087.359872] [] do_sync_write+0xc0/0x106 [16087.359872] [] ? fget_light+0x4f/0xfb [16087.359872] [] ? security_file_permission+0x11/0x13 [16087.359872] [] vfs_write+0xab/0x105 [16087.359872] [] sys_write+0x47/0x70 [16087.359872] [] system_call_fastpath+0x16/0x1b [16087.359872] test-mysqld D ffff88001ec3e420 3232 2891 2877 0x000000= 00 [16087.359872] ffff88001ee91e28 0000000000000046 ffff88001ee91da8 ffffffff810676b1 [16087.359872] ffff88001ec3e420 000000000000def8 ffff88001ee91fd8 0000000000014180 [16087.359872] ffff88001ee91fd8 0000000000014180 ffff88001ec3e420 ffff88001f152160 [16087.359872] Call Trace: [16087.359872] [] ? mark_lock+0x22/0x225 [16087.359872] [] ? mark_held_locks+0x4d/0x6b [16087.359872] [] ? __mutex_lock_common+0x216/0x330 [16087.359872] [] __mutex_lock_common+0x21e/0x330 [16087.359872] [] ? generic_file_llseek+0x2c/0x5e [16087.359872] [] ? generic_file_llseek+0x2c/0x5e [16087.359872] [] ? fget_light+0x4f/0xfb [16087.359872] [] mutex_lock_nested+0x37/0x3c [16087.359872] [] generic_file_llseek+0x2c/0x5e [16087.359872] [] vfs_llseek+0x35/0x37 [16087.359872] [] sys_lseek+0x48/0x67 [16087.359872] [] system_call_fastpath+0x16/0x1b [16087.359872] test-mysqld D ffff88001ec3a160 4136 2892 2877 0x000000= 00 [16087.359872] ffff88001e6d7e18 0000000000000046 ffffffff810b242d ffffffff8105b193 [16087.359872] 000000010000000e 000000000000def8 ffff88001e6d7fd8 0000000000014180 [16087.359872] ffff88001e6d7fd8 0000000000014180 ffff88001ec3a160 ffff88001e5e42c0 [16087.359872] Call Trace: [16087.359872] [] ? find_get_pages_tag+0x0/0x12a [16087.359872] [] ? lock_hrtimer_base+0x25/0x4a [16087.359872] [] ? mark_held_locks+0x4d/0x6b [16087.359872] [] ? __mutex_lock_common+0x216/0x330 [16087.359872] [] __mutex_lock_common+0x21e/0x330 [16087.359872] [] ? vfs_fsync_range+0x6e/0xa6 [16087.359872] [] ? vfs_fsync_range+0x6e/0xa6 [16087.359872] [] mutex_lock_nested+0x37/0x3c [16087.359872] [] vfs_fsync_range+0x6e/0xa6 [16087.359872] [] vfs_fsync+0x18/0x1a [16087.359872] [] do_fsync+0x32/0x48 [16087.359872] [] sys_fsync+0xb/0xf [16087.359872] [] system_call_fastpath+0x16/0x1b [16087.359872] bash S ffff88001e5e0000 5776 2893 2876 0x000000= 00 [16087.359872] ffff88001ee57e58 0000000000000046 0000000000000000 0000000000000000 [16087.359872] ffff88001ee57e08 000000000000def8 ffff88001ee57fd8 0000000000014180 [16087.359872] ffff88001ee57fd8 0000000000014180 ffff88001e5e0000 ffffffff81a0e020 [16087.359872] Call Trace: [16087.359872] [] do_wait+0x1bd/0x22b [16087.359872] [] ? might_fault+0x57/0xa4 [16087.359872] [] sys_wait4+0xa6/0xc3 [16087.359872] [] ? child_wait_callback+0x0/0x53 [16087.359872] [] system_call_fastpath+0x16/0x1b [16087.359872] test-tar D 0000000000000000 3320 2897 2893 0x000000= 00 [16087.359872] ffff88001e6eb700 0000000000000046 ffff88001e6eb680 ffffffff810676b1 [16087.359872] 0000000000000000 000000000000def8 ffff88001e6ebfd8 0000000000014180 [16087.359872] ffff88001e6ebfd8 0000000000014180 ffff88001e58a160 ffff88001ec1c2c0 [16087.359872] Call Trace: [16087.359872] [] ? mark_lock+0x22/0x225 [16087.359872] [] ? trace_hardirqs_on_caller+0x10b/0x12f [16087.359872] [] rwsem_down_failed_common+0x9a/0xcc [16087.359872] [] ? cfq_close_cooperator+0xd9/0x184 [16087.359872] [] rwsem_down_read_failed+0x26/0x30 [16087.359872] [] call_rwsem_down_read_failed+0x14/0x30 [16087.359872] [] ? down_read_nested+0x5b/0x62 [16087.359872] [] ? xfs_ilock+0x7b/0xb2 [16087.359872] [] xfs_ilock+0x7b/0xb2 [16087.359872] [] xfs_ilock_map_shared+0x29/0x2f [16087.359872] [] xfs_iomap+0x9f/0x39c [16087.359872] [] ? register_lock_class+0x20/0x327 [16087.359872] [] __xfs_get_blocks+0x71/0x15c [16087.359872] [] xfs_get_blocks+0x12/0x14 [16087.359872] [] do_mpage_readpage+0x173/0x467 [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] ? add_to_page_cache_locked+0xa4/0xcd [16087.359872] [] mpage_readpages+0xd6/0x11a [16087.359872] [] ? xfs_get_blocks+0x0/0x14 [16087.359872] [] ? xfs_get_blocks+0x0/0x14 [16087.359872] [] ? mark_lock+0x22/0x225 [16087.359872] [] xfs_vm_readpages+0x1a/0x1c [16087.359872] [] __do_page_cache_readahead+0x163/0x1fc [16087.359872] [] ? __do_page_cache_readahead+0x7b/0x1fc [16087.359872] [] ? mark_lock+0x22/0x225 [16087.359872] [] ra_submit+0x1c/0x20 [16087.359872] [] ondemand_readahead+0x243/0x256 [16087.359872] [] page_cache_sync_readahead+0x38/0x3a [16087.359872] [] generic_file_aio_read+0x242/0x5a7 [16087.359872] [] xfs_read+0x1a8/0x1ff [16087.359872] [] xfs_file_aio_read+0x58/0x5d [16087.359872] [] do_sync_read+0xc0/0x106 [16087.359872] [] ? finish_task_switch+0x6f/0xad [16087.359872] [] ? finish_task_switch+0x0/0xad [16087.359872] [] ? schedule+0x845/0x8bd [16087.359872] [] ? security_file_permission+0x11/0x13 [16087.359872] [] vfs_read+0xa8/0x102 [16087.359872] [] sys_read+0x47/0x70 [16087.359872] [] system_call_fastpath+0x16/0x1b [16087.359872] bash S ffff88001e6e0000 4880 2898 2876 0x000000= 00 [16087.359872] ffff88001f3dfe58 0000000000000046 0000000000000000 0000000000000000 [16087.359872] ffff88001f3dfe08 000000000000def8 ffff88001f3dffd8 0000000000014180 [16087.359872] ffff88001f3dffd8 0000000000014180 ffff88001e6e0000 ffff88001f965370 [16087.359872] Call Trace: [16087.359872] [] do_wait+0x1bd/0x22b [16087.359872] [] ? might_fault+0x57/0xa4 [16087.359872] [] sys_wait4+0xa6/0xc3 [16087.359872] [] ? child_wait_callback+0x0/0x53 [16087.359872] [] system_call_fastpath+0x16/0x1b [16087.359872] syslog-ng S ffff88001e6e10b0 6248 3348 1 0x000000= 00 [16087.359872] ffff88001f373e58 0000000000000046 0000000000000002 0000000000000000 [16087.359872] ffff88001f373e08 000000000000def8 ffff88001f373fd8 0000000000014180 [16087.359872] ffff88001f373fd8 0000000000014180 ffff88001e6e10b0 ffff88001e5e6420 [16087.359872] Call Trace: [16087.359872] [] do_wait+0x1bd/0x22b [16087.359872] [] sys_wait4+0xa6/0xc3 [16087.359872] [] ? child_wait_callback+0x0/0x53 [16087.359872] [] ? sys_close+0x2d/0xe4 [16087.359872] [] system_call_fastpath+0x16/0x1b [16087.359872] syslog-ng S 0000000000000000 3832 3349 3348 0x000000= 00 [16087.359872] ffff88001f3e9a58 0000000000000046 0000000000000000 0000000000000282 [16087.359872] 0000000000000040 000000000000def8 ffff88001f3e9fd8 0000000000014180 [16087.359872] ffff88001f3e9fd8 0000000000014180 ffff88001e5e6420 ffff88001f965370 [16087.359872] Call Trace: [16087.359872] [] schedule_hrtimeout_range+0xc2/0xf7 [16087.359872] [] ? hrtimer_wakeup+0x0/0x21 [16087.359872] [] ? hrtimer_start_range_ns+0xf/0x11 [16087.359872] [] poll_schedule_timeout+0x46/0x69 [16087.359872] [] do_sys_poll+0x36a/0x40b [16087.359872] [] ? __pollwait+0x0/0xcf [16087.359872] [] ? pollwake+0x0/0x5c [16087.359872] [] ? pollwake+0x0/0x5c [16087.359872] [] ? pollwake+0x0/0x5c [16087.359872] [] ? pollwake+0x0/0x5c [16087.359872] [] ? mark_lock+0x22/0x225 [16087.359872] [] ? mark_held_locks+0x4d/0x6b [16087.359872] [] ? __wake_up+0x22/0x50 [16087.359872] [] ? _raw_spin_unlock_irqrestore+0x3f/0x4= 7 [16087.359872] [] ? trace_hardirqs_on_caller+0x10b/0x12f [16087.359872] [] ? trace_hardirqs_on_caller+0x10b/0x12f [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] ? ktime_get_ts+0xb1/0xbe [16087.359872] [] ? poll_select_set_timeout+0x5c/0x77 [16087.359872] [] sys_poll+0x50/0xba [16087.359872] [] system_call_fastpath+0x16/0x1b [16087.359872] flush-254:0 S 00000000000493e0 5216 4467 2 0x000000= 00 [16087.359872] ffff88001e783db0 0000000000000046 ffff88001e623210 ffffffff81490baf [16087.359872] ffff88001f95c000 000000000000def8 ffff88001e783fd8 0000000000014180 [16087.359872] ffff88001e783fd8 0000000000014180 ffff88001e623210 ffff88001f152160 [16087.359872] Call Trace: [16087.359872] [] ? _raw_spin_unlock_irqrestore+0x3f/0x4= 7 [16087.359872] [] ? __mod_timer+0x141/0x153 [16087.359872] [] ? init_timer_key+0x8d/0x99 [16087.359872] [] schedule_timeout+0xa2/0xc9 [16087.359872] [] ? process_timeout+0x0/0xb [16087.359872] [] schedule_timeout_interruptible+0x19/0x= 1b [16087.359872] [] bdi_writeback_task+0x82/0xa9 [16087.359872] [] ? bdi_start_fn+0x0/0xd4 [16087.359872] [] bdi_start_fn+0x71/0xd4 [16087.359872] [] ? bdi_start_fn+0x0/0xd4 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] flush-254:16 S 00000000000493e0 6208 4702 2 0x000000= 00 [16087.359872] ffff88001e6cddb0 0000000000000046 0000000000000000 ffffffff81490baf [16087.359872] ffff88001f970000 000000000000def8 ffff88001e6cdfd8 0000000000014180 [16087.359872] ffff88001e6cdfd8 0000000000014180 ffff88001e5e5370 ffff88001f965370 [16087.359872] Call Trace: [16087.359872] [] ? _raw_spin_unlock_irqrestore+0x3f/0x4= 7 [16087.359872] [] ? __mod_timer+0x141/0x153 [16087.359872] [] ? init_timer_key+0x8d/0x99 [16087.359872] [] schedule_timeout+0xa2/0xc9 [16087.359872] [] ? process_timeout+0x0/0xb [16087.359872] [] schedule_timeout_interruptible+0x19/0x= 1b [16087.359872] [] bdi_writeback_task+0x82/0xa9 [16087.359872] [] ? bdi_start_fn+0x0/0xd4 [16087.359872] [] bdi_start_fn+0x71/0xd4 [16087.359872] [] ? bdi_start_fn+0x0/0xd4 [16087.359872] [] kthread+0x7d/0x85 [16087.359872] [] kernel_thread_helper+0x4/0x10 [16087.359872] [] ? restore_args+0x0/0x30 [16087.359872] [] ? kthread+0x0/0x85 [16087.359872] [] ? kernel_thread_helper+0x0/0x10 [16087.359872] bash S ffff88001dcb10b0 4616 4754 2876 0x000000= 00 [16087.359872] ffff88001f371e58 0000000000000046 0000000000000002 0000000000000000 [16087.359872] ffff88001f371e08 000000000000def8 ffff88001f371fd8 0000000000014180 [16087.359872] ffff88001f371fd8 0000000000014180 ffff88001dcb10b0 ffff88001f152160 [16087.359872] Call Trace: [16087.359872] [] do_wait+0x1bd/0x22b [16087.359872] [] ? might_fault+0x57/0xa4 [16087.359872] [] sys_wait4+0xa6/0xc3 [16087.359872] [] ? child_wait_callback+0x0/0x53 [16087.359872] [] system_call_fastpath+0x16/0x1b [16087.359872] sync D 0000000000000000 4896 4761 4754 0x000000= 00 [16087.359872] ffff88001edafcd8 0000000000000046 0000000000000000 ffffffff81067901 [16087.359872] ffff88001e5e42c0 000000000000def8 ffff88001edaffd8 0000000000014180 [16087.359872] ffff88001edaffd8 0000000000014180 ffff88001e5e42c0 ffff88001f916420 [16087.359872] Call Trace: [16087.359872] [] ? mark_held_locks+0x4d/0x6b [16087.359872] [] ? prepare_to_wait+0x70/0x7b [16087.359872] [] xfs_ioend_wait+0x83/0x9b [16087.359872] [] ? autoremove_wake_function+0x0/0x38 [16087.359872] [] ? mapping_tagged+0x60/0x69 [16087.359872] [] ? mapping_tagged+0x0/0x69 [16087.359872] [] xfs_sync_inode_data+0x98/0xbf [16087.359872] [] xfs_inode_ag_walk+0x9d/0xdc [16087.359872] [] ? xfs_sync_inode_data+0x0/0xbf [16087.359872] [] xfs_inode_ag_iterator+0x56/0x84 [16087.359872] [] ? xfs_sync_inode_data+0x0/0xbf [16087.359872] [] xfs_sync_data+0x26/0x4e [16087.359872] [] xfs_quiesce_data+0x1e/0x57 [16087.359872] [] xfs_fs_sync_fs+0x26/0xd7 [16087.359872] [] ? vfs_quota_sync+0x1b7/0x1c8 [16087.359872] [] sync_quota_sb+0x4e/0x103 [16087.359872] [] __sync_filesystem+0x41/0x72 [16087.359872] [] sync_filesystems+0xaa/0x100 [16087.359872] [] sys_sync+0x1c/0x2e [16087.359872] [] system_call_fastpath+0x16/0x1b [16087.359872] test-malloc R running task 4616 4765 2898 0x000000= 00 [16087.359872] ffff88001f3abdb8 0000000000000040 0000000000000001 ffff88001f3abea8 [16087.359872] ffff88000268e720 ffffffff81063fa4 ffff88001f3abe48 ffffffff8105b465 [16087.359872] ffff88001dcb5370 000000000000e6b0 0000000100000001 000000000000c350 [16087.359872] Call Trace: [16087.359872] [] ? trace_hardirqs_on+0xd/0xf [16087.359872] [] ? do_nanosleep+0x73/0xb3 [16087.359872] [] ? hrtimer_nanosleep+0x8b/0xf9 [16087.359872] [] ? hrtimer_wakeup+0x0/0x21 [16087.359872] [] ? hrtimer_start_range_ns+0xf/0x11 [16087.359872] [] ? sys_nanosleep+0x5e/0x78 [16087.359872] [] ? system_call_fastpath+0x16/0x1b [16087.359872] [16087.359872] Showing all locks held in the system: [16087.359872] 2 locks held by xfsdatad/0/414: [16087.359872] #0: (xfsdatad){+.+...}, at: [] worker_thread+0x1d5/0x332 [16087.359872] #1: ((&ioend->io_work)){+.+...}, at: [] worker_thread+0x1d5/0x332 [16087.359872] 2 locks held by xfsdatad/2/416: [16087.359872] #0: (xfsdatad){+.+...}, at: [] worker_thread+0x1d5/0x332 [16087.359872] #1: ((&ioend->io_work)){+.+...}, at: [] worker_thread+0x1d5/0x332 [16087.359872] 1 lock held by agetty/2848: [16087.359872] #0: (&tty->atomic_read_lock){+.+.+.}, at: [] n_tty_read+0x2d8/0x7f3 [16087.359872] 1 lock held by agetty/2849: [16087.359872] #0: (&tty->atomic_read_lock){+.+.+.}, at: [] n_tty_read+0x2d8/0x7f3 [16087.359872] 1 lock held by agetty/2850: [16087.359872] #0: (&tty->atomic_read_lock){+.+.+.}, at: [] n_tty_read+0x2d8/0x7f3 [16087.359872] 1 lock held by agetty/2851: [16087.359872] #0: (&tty->atomic_read_lock){+.+.+.}, at: [] n_tty_read+0x2d8/0x7f3 [16087.359872] 1 lock held by agetty/2852: [16087.359872] #0: (&tty->atomic_read_lock){+.+.+.}, at: [] n_tty_read+0x2d8/0x7f3 [16087.359872] 2 locks held by bash/2853: [16087.359872] #0: (sysrq_key_table_lock){......}, at: [] __handle_sysrq+0x26/0x158 [16087.359872] #1: (tasklist_lock){.+.+..}, at: [] debug_show_all_locks+0x53/0x188 [16087.359872] 1 lock held by test-mysqld/2882: [16087.359872] #0: (&(&ip->i_iolock)->mr_lock){++++++}, at: [] xfs_ilock+0x49/0xb2 [16087.359872] 1 lock held by test-mysqld/2883: [16087.359872] #0: (&sb->s_type->i_mutex_key#12){+.+.+.}, at: [] generic_file_llseek+0x2c/0x5e [16087.359872] 1 lock held by test-mysqld/2884: [16087.359872] #0: (&sb->s_type->i_mutex_key#12){+.+.+.}, at: [] generic_file_llseek+0x2c/0x5e [16087.359872] 2 locks held by test-mysqld/2885: [16087.359872] #0: (&sb->s_type->i_mutex_key#12){+.+.+.}, at: [] xfs_write+0x2bf/0x793 [16087.359872] #1: (&(&ip->i_iolock)->mr_lock){++++++}, at: [] xfs_ilock+0x2c/0xb2 [16087.359872] 1 lock held by test-mysqld/2886: [16087.359872] #0: (&sb->s_type->i_mutex_key#12){+.+.+.}, at: [] generic_file_llseek+0x2c/0x5e [16087.359872] 1 lock held by test-mysqld/2887: [16087.359872] #0: (&(&ip->i_iolock)->mr_lock){++++++}, at: [] xfs_ilock+0x49/0xb2 [16087.359872] 1 lock held by test-mysqld/2888: [16087.359872] #0: (&sb->s_type->i_mutex_key#12){+.+.+.}, at: [] generic_file_llseek+0x2c/0x5e [16087.359872] 1 lock held by test-mysqld/2889: [16087.359872] #0: (&sb->s_type->i_mutex_key#12){+.+.+.}, at: [] generic_file_llseek+0x2c/0x5e [16087.359872] 1 lock held by test-mysqld/2890: [16087.359872] #0: (&sb->s_type->i_mutex_key#12){+.+.+.}, at: [] xfs_write+0x2bf/0x793 [16087.359872] 1 lock held by test-mysqld/2891: [16087.359872] #0: (&sb->s_type->i_mutex_key#12){+.+.+.}, at: [] generic_file_llseek+0x2c/0x5e [16087.359872] 1 lock held by test-mysqld/2892: [16087.359872] #0: (&sb->s_type->i_mutex_key#12){+.+.+.}, at: [] vfs_fsync_range+0x6e/0xa6 [16087.359872] 2 locks held by test-tar/2897: [16087.359872] #0: (&(&ip->i_iolock)->mr_lock){++++++}, at: [] xfs_ilock+0x49/0xb2 [16087.359872] #1: (&(&ip->i_lock)->mr_lock){++++..}, at: [] xfs_ilock+0x7b/0xb2 [16087.359872] 2 locks held by sync/4761: [16087.359872] #0: (mutex){+.+...}, at: [] sync_filesystems+0x1e/0x100 [16087.359872] #1: (&type->s_umount_key#24){.+.+..}, at: [] sync_filesystems+0x88/0x100 [16087.359872] From SRS0+KImH+64+fromorbit.com=david@internode.on.net Tue Aug 3 17:56:56 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_33 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o73MuuDO260360 for ; Tue, 3 Aug 2010 17:56:56 -0500 X-ASG-Debug-ID: 1280876233-618702240000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 84B70491AB0 for ; Tue, 3 Aug 2010 15:57:14 -0700 (PDT) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id Igv7edpWS3wNFw5c for ; Tue, 03 Aug 2010 15:57:14 -0700 (PDT) Received: from dastard (unverified [121.44.216.100]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 33791609-1927428 for multiple; Wed, 04 Aug 2010 08:27:00 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OgQPq-0008Na-Bt; Wed, 04 Aug 2010 08:56:58 +1000 Date: Wed, 4 Aug 2010 08:56:58 +1000 From: Dave Chinner To: Mingming Cao Cc: Matthew Wilcox , linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, sandeen@sandeen.net X-ASG-Orig-Subj: Re: [PATCH] dio: track and serialise unaligned direct IO Subject: Re: [PATCH] dio: track and serialise unaligned direct IO Message-ID: <20100803225658.GB26402@dastard> References: <1280443516-14448-1-git-send-email-david@fromorbit.com> <20100730025324.GO25774@parisc-linux.org> <20100730045331.GA2126@dastard> <1280856865.2436.31.camel@mingming-laptop> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1280856865.2436.31.camel@mingming-laptop> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1280876235 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36952 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Aug 03, 2010 at 10:34:25AM -0700, Mingming Cao wrote: > On Fri, 2010-07-30 at 14:53 +1000, Dave Chinner wrote: > > On Thu, Jul 29, 2010 at 08:53:24PM -0600, Matthew Wilcox wrote: > > > On Fri, Jul 30, 2010 at 08:45:16AM +1000, Dave Chinner wrote: > > > > If we get two unaligned direct IO's to the same filesystem block > > > > that is marked as a new allocation (i.e. buffer_new), then both IOs will > > > > zero the portion of the block they are not writing data to. As a > > > > result, when the IOs complete there will be a portion of the block > > > > that contains zeros from the last IO to complete rather than the > > > > data that should be there. .... > > I don't want any direct IO for XFS to go through the page cache - > > unaligned or not. using the page cache for the unaligned blocks > > would also be much worse for performance that this method because it > > turns unaligned direct IO into 3 IOs - the unaligned head block, the > > aligned body and the unaligned tail block. It would also be a > > performance hit you take on every single dio, whereas this way the > > hit is only taken when an overlap is detected. > > Does this problem also possible for DIO and non AIO case? (Ext4 case > this only happy with AIO+DIO+unaligned). If not, could we simply force > unaligned AIO+DIO to be synchronous? Still direct IO... There is nothing specific to AIO about this bug. XFS (at least) allows concurrent DIO writes to the same inode regardless of whether they are dispatched via AIO or multiple separate threads and so the race condition exists outside just the AIO context... > > And besides, such decisions on whether to use buffered IO have to be > > made high up in the filesystem when we are deciding how to lock the > > inode for the dio - buffered IO requires exclusive locking, not the > > shared locking we do for dio writes. That further reduces the > > performance of unaligned direct IO even when there are no overlaps, > > and it's a solution that every filesystem needs to implement > > themselves in some way. > > > > I've looked at a couple of different ways to fix this (e.g. passing > > the unaligned state to get_blocks() to allow the filesystem to > > serialise there) but they've all died a horrible death of dodgy > > locking and hacky IO completion detection. not to mention > > requiring a different solution in every filesystem. > > I also have been thinking other ways to fix this, initial thoughts about > this but concerned about the scalability. > > I was looking at ways to use buffer head state to indicate any unaligned > AIO DIO write to buffer_new buffers(do_direct_IO set the state), then > for any futhur unaligned IO need to wait for the AIO+DIO complete on > that buffer. That's effectively what my fix does, except it does not overload bufferheads to do it. > but the buffer head passed from do_direct_IO to > get_blocks() is a dummy buffer, have to get the buffer head from > device... Which, IMO, seems like a dangerous layering violation - it's mixing device associated bufferheads with filesystem IO (i.e. from different address spaces) and, as such, the two are never guaranteed to be coherent. To make matters more complex, XFS can have at least two block devices (data and real-time) that direct IO is targeted at, so doing something that is block device specific seems much more complex than just tracking the IO in a separate list... > this would only impact to all IOs that are really conflict with > pending AIO DIOs... it should work for ext4 case...would this something > usable for XFS? I have got the approach started last week but not very > far. It might, but I don't think it's a viable approach. Cheers, Dave. -- Dave Chinner david@fromorbit.com From cmm@us.ibm.com Tue Aug 3 18:41:05 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_33, J_CHICKENPOX_62 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o73Nf56X261858 for ; Tue, 3 Aug 2010 18:41:05 -0500 X-ASG-Debug-ID: 1280879364-1f7201a00000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from e33.co.us.ibm.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6DA6311C9536 for ; Tue, 3 Aug 2010 16:49:25 -0700 (PDT) Received: from e33.co.us.ibm.com (e33.co.us.ibm.com [32.97.110.151]) by cuda.sgi.com with ESMTP id Ey3ouUedMCjEBhLA for ; Tue, 03 Aug 2010 16:49:25 -0700 (PDT) Received: from d03relay04.boulder.ibm.com (d03relay04.boulder.ibm.com [9.17.195.106]) by e33.co.us.ibm.com (8.14.4/8.13.1) with ESMTP id o73NadKS025152 for ; Tue, 3 Aug 2010 17:36:39 -0600 Received: from d03av04.boulder.ibm.com (d03av04.boulder.ibm.com [9.17.195.170]) by d03relay04.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id o73NfKWg109490 for ; Tue, 3 Aug 2010 17:41:20 -0600 Received: from d03av04.boulder.ibm.com (loopback [127.0.0.1]) by d03av04.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id o73NfGMw012678 for ; Tue, 3 Aug 2010 17:41:16 -0600 Received: from [9.47.16.90] (mingming-laptop-009047016090.beaverton.ibm.com [9.47.16.90]) by d03av04.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id o73NfFA6012643; Tue, 3 Aug 2010 17:41:15 -0600 X-ASG-Orig-Subj: Re: [PATCH] dio: track and serialise unaligned direct IO Subject: Re: [PATCH] dio: track and serialise unaligned direct IO From: Mingming Cao To: Dave Chinner Cc: Matthew Wilcox , linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, sandeen@sandeen.net In-Reply-To: <20100803225658.GB26402@dastard> References: <1280443516-14448-1-git-send-email-david@fromorbit.com> <20100730025324.GO25774@parisc-linux.org> <20100730045331.GA2126@dastard> <1280856865.2436.31.camel@mingming-laptop> <20100803225658.GB26402@dastard> Content-Type: text/plain; charset="UTF-8" Date: Tue, 03 Aug 2010 16:41:14 -0700 Message-ID: <1280878874.2334.6.camel@mingming-laptop> Mime-Version: 1.0 X-Mailer: Evolution 2.28.1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: e33.co.us.ibm.com[32.97.110.151] X-Barracuda-Start-Time: 1280879365 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36955 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, 2010-08-04 at 08:56 +1000, Dave Chinner wrote: > On Tue, Aug 03, 2010 at 10:34:25AM -0700, Mingming Cao wrote: > > On Fri, 2010-07-30 at 14:53 +1000, Dave Chinner wrote: > > > On Thu, Jul 29, 2010 at 08:53:24PM -0600, Matthew Wilcox wrote: > > > > On Fri, Jul 30, 2010 at 08:45:16AM +1000, Dave Chinner wrote: > > > > > If we get two unaligned direct IO's to the same filesystem block > > > > > that is marked as a new allocation (i.e. buffer_new), then both IOs will > > > > > zero the portion of the block they are not writing data to. As a > > > > > result, when the IOs complete there will be a portion of the block > > > > > that contains zeros from the last IO to complete rather than the > > > > > data that should be there. > .... > > > I don't want any direct IO for XFS to go through the page cache - > > > unaligned or not. using the page cache for the unaligned blocks > > > would also be much worse for performance that this method because it > > > turns unaligned direct IO into 3 IOs - the unaligned head block, the > > > aligned body and the unaligned tail block. It would also be a > > > performance hit you take on every single dio, whereas this way the > > > hit is only taken when an overlap is detected. > > > > Does this problem also possible for DIO and non AIO case? (Ext4 case > > this only happy with AIO+DIO+unaligned). If not, could we simply force > > unaligned AIO+DIO to be synchronous? Still direct IO... > > There is nothing specific to AIO about this bug. XFS (at least) > allows concurrent DIO writes to the same inode regardless of whether > they are dispatched via AIO or multiple separate threads and so the > race condition exists outside just the AIO context... > Okay..yeah ext4 prevent direct IO write to the same inode from multiple threads, so this is not a issue for non-aio case. How does XFS serialize direct IO (aligned) to the same file offset(or overlap) from multiple threads? Mingming From cmm@us.ibm.com Tue Aug 3 19:11:03 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_33, J_CHICKENPOX_63 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o740B33B000978 for ; Tue, 3 Aug 2010 19:11:03 -0500 X-ASG-Debug-ID: 1280881161-2cba01b40000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from e9.ny.us.ibm.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E95A434AB42 for ; Tue, 3 Aug 2010 17:19:21 -0700 (PDT) Received: from e9.ny.us.ibm.com (e9.ny.us.ibm.com [32.97.182.139]) by cuda.sgi.com with ESMTP id CE5VlnGNAYBtzkRB for ; Tue, 03 Aug 2010 17:19:21 -0700 (PDT) Received: from d01relay05.pok.ibm.com (d01relay05.pok.ibm.com [9.56.227.237]) by e9.ny.us.ibm.com (8.14.4/8.13.1) with ESMTP id o73NsLID009178 for ; Tue, 3 Aug 2010 19:54:21 -0400 Received: from d01av04.pok.ibm.com (d01av04.pok.ibm.com [9.56.224.64]) by d01relay05.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id o740BKDx133906 for ; Tue, 3 Aug 2010 20:11:20 -0400 Received: from d01av04.pok.ibm.com (loopback [127.0.0.1]) by d01av04.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id o740BJeV016076 for ; Tue, 3 Aug 2010 20:11:20 -0400 Received: from [9.47.16.90] (mingming-laptop-009047016090.beaverton.ibm.com [9.47.16.90]) by d01av04.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id o740BIMc016025; Tue, 3 Aug 2010 20:11:19 -0400 X-ASG-Orig-Subj: Re: [PATCH] dio: track and serialise unaligned direct IO Subject: Re: [PATCH] dio: track and serialise unaligned direct IO From: Mingming Cao To: Dave Chinner Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, sandeen@sandeen.net In-Reply-To: <1280443516-14448-1-git-send-email-david@fromorbit.com> References: <1280443516-14448-1-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Tue, 03 Aug 2010 17:11:18 -0700 Message-ID: <1280880678.2334.27.camel@mingming-laptop> Mime-Version: 1.0 X-Mailer: Evolution 2.28.1 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: e9.ny.us.ibm.com[32.97.182.139] X-Barracuda-Start-Time: 1280881162 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36956 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, 2010-07-30 at 08:45 +1000, Dave Chinner wrote: > From: Dave Chinner > > If we get two unaligned direct IO's to the same filesystem block > that is marked as a new allocation (i.e. buffer_new), then both IOs will > zero the portion of the block they are not writing data to. As a > result, when the IOs complete there will be a portion of the block > that contains zeros from the last IO to complete rather than the > data that should be there. > > This is easily manifested by qemu using aio+dio with an unaligned > guest filesystem - every IO is unaligned and fileystem corruption is > encountered in the guest filesystem. xfstest 240 (from Eric Sandeen) > is also a simple reproducer. > > To avoid this problem, track unaligned IO that triggers sub-block zeroing and > check new incoming unaligned IO that require sub-block zeroing against that > list. If we get an overlap where the start and end of unaligned IOs hit the > same filesystem block, then we need to block the incoming IOs until the IO that > is zeroing the block completes. The blocked IO can then continue without > needing to do any zeroing and hence won't overwrite valid data with zeros. > This seems to address both two IOs are unaligned direct IO. If the first IO is aligned direct IO, then it is not tracked? I am also concerned about the aligned direct IO case... 1) first thread aio+dio+aligned write to a hole, there is no zero-out submitted from kernel. But the hole remains initialized before all IO complete and convert it from uninitialized extent to initialized. 2) second thread aio+dio+unalign write to the same hole, this time it is unaligned. since buffer is still new (not converted yet), the new incoming thread zero out port of data that first thread has written to It seems would need to track any direct IO written to a hole/unwrtten extent/ buffer new, not only the unaligned dio ... regards, Mingming > Signed-off-by: Dave Chinner > --- > fs/direct-io.c | 152 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- > 1 files changed, 146 insertions(+), 6 deletions(-) > > diff --git a/fs/direct-io.c b/fs/direct-io.c > index a10cb91..611524e 100644 > --- a/fs/direct-io.c > +++ b/fs/direct-io.c > @@ -71,6 +71,9 @@ struct dio { > unsigned start_zero_done; /* flag: sub-blocksize zeroing has > been performed at the start of a > write */ > +#define LAST_SECTOR ((sector_t)-1LL) > + sector_t zero_block_front; /* fs block we are zeroing at front */ > + sector_t zero_block_rear; /* fs block we are zeroing at rear */ > int pages_in_io; /* approximate total IO pages */ > size_t size; /* total request size (doesn't change)*/ > sector_t block_in_file; /* Current offset into the underlying > @@ -135,6 +138,101 @@ struct dio { > struct page *pages[DIO_PAGES]; /* page buffer */ > }; > > + > +/* > + * record fs blocks we are doing zeroing on in a zero block list. > + * unaligned IO is not very performant and so is relatively uncommon, > + * so a global list should be sufficent to track them. > + */ > +struct dio_zero_block { > + struct list_head dio_list; /* list of io in progress */ > + sector_t zero_block; /* block being zeroed */ > + struct dio *dio; /* owner dio */ > + wait_queue_head_t wq; /* New IO block here */ > + atomic_t ref; /* reference count */ > +}; > + > +DEFINE_SPINLOCK(dio_zero_block_lock); > +LIST_HEAD(dio_zero_block_list); > + > +/* > + * Add a filesystem block to the list of blocks we are tracking. > + */ > +static void > +dio_start_zero_block(struct dio *dio, sector_t zero_block) > +{ > + struct dio_zero_block *zb; > + > + zb = kmalloc(sizeof(*zb), GFP_NOIO); > + if (!zb) > + return; > + INIT_LIST_HEAD(&zb->dio_list); > + init_waitqueue_head(&zb->wq); > + zb->zero_block = zero_block; > + zb->dio = dio; > + atomic_set(&zb->ref, 1); > + > + spin_lock(&dio_zero_block_lock); > + list_add(&zb->dio_list, &dio_zero_block_list); > + spin_unlock(&dio_zero_block_lock); > +} > + > +static void > +dio_drop_zero_block(struct dio_zero_block *zb) > +{ > + if (atomic_dec_and_test(&zb->ref)) > + kfree(zb); > +} > + > +/* > + * Check whether a filesystem block is currently being zeroed, and if it is > + * wait for it to complete before returning. If we waited for a block being > + * zeroed, return 1 to indicate that the block is already initialised, > + * otherwise return 0 to indicate that it needs zeroing. > + */ > +static int > +dio_wait_zero_block(struct dio *dio, sector_t zero_block) > +{ > + struct dio_zero_block *zb; > + > + spin_lock(&dio_zero_block_lock); > + list_for_each_entry(zb, &dio_zero_block_list, dio_list) { > + if (zb->dio->inode != dio->inode) > + continue; > + if (zb->zero_block != zero_block) > + continue; > + atomic_inc(&zb->ref); > + spin_unlock(&dio_zero_block_lock); > + wait_event(zb->wq, (list_empty(&zb->dio_list))); > + dio_drop_zero_block(zb); > + return 1; > + } > + spin_unlock(&dio_zero_block_lock); > + return 0; > +} > + > +/* > + * Complete a block zeroing and wake up anyone waiting for it. > + */ > +static void dio_end_zero_block(struct dio *dio, sector_t zero_block) > +{ > + struct dio_zero_block *zb; > + > + spin_lock(&dio_zero_block_lock); > + list_for_each_entry(zb, &dio_zero_block_list, dio_list) { > + if (zb->dio->inode != dio->inode) > + continue; > + if (zb->zero_block != zero_block) > + continue; > + list_del_init(&zb->dio_list); > + spin_unlock(&dio_zero_block_lock); > + wake_up(&zb->wq); > + dio_drop_zero_block(zb); > + return; > + } > + spin_unlock(&dio_zero_block_lock); > +} > + > /* > * How many pages are in the queue? > */ > @@ -253,6 +351,11 @@ static int dio_complete(struct dio *dio, loff_t offset, int ret, bool is_async) > aio_complete(dio->iocb, ret, 0); > } > > + if (dio->zero_block_front != LAST_SECTOR) > + dio_end_zero_block(dio, dio->zero_block_front); > + if (dio->zero_block_rear != LAST_SECTOR) > + dio_end_zero_block(dio, dio->zero_block_rear); > + > if (dio->flags & DIO_LOCKING) > /* lockdep: non-owner release */ > up_read_non_owner(&dio->inode->i_alloc_sem); > @@ -777,6 +880,12 @@ static void clean_blockdev_aliases(struct dio *dio) > * block with zeros. This happens only if user-buffer, fileoffset or > * io length is not filesystem block-size multiple. > * > + * We need to track the blocks we are zeroing. If we have concurrent IOs that hit > + * the same start or end block, we do not want all the IOs to zero the portion > + * they are not writing data to as that will overwrite data from the other IOs. > + * Hence we need to block until the first unaligned IO completes before we can > + * continue (without executing any zeroing). > + * > * `end' is zero if we're doing the start of the IO, 1 at the end of the > * IO. > */ > @@ -784,8 +893,8 @@ static void dio_zero_block(struct dio *dio, int end) > { > unsigned dio_blocks_per_fs_block; > unsigned this_chunk_blocks; /* In dio_blocks */ > - unsigned this_chunk_bytes; > struct page *page; > + sector_t fsblock; > > dio->start_zero_done = 1; > if (!dio->blkfactor || !buffer_new(&dio->map_bh)) > @@ -797,17 +906,41 @@ static void dio_zero_block(struct dio *dio, int end) > if (!this_chunk_blocks) > return; > > + if (end) > + this_chunk_blocks = dio_blocks_per_fs_block - this_chunk_blocks; > + > /* > * We need to zero out part of an fs block. It is either at the > - * beginning or the end of the fs block. > + * beginning or the end of the fs block, but first we need to check if > + * there is already a zeroing being run on this block. > + * > + * If we are doing a sub-block IO (i.e. zeroing both front and rear of > + * the same block) we don't need to wait or set a gaurd for the rear of > + * the block as we already have one set. > */ > - if (end) > - this_chunk_blocks = dio_blocks_per_fs_block - this_chunk_blocks; > + fsblock = dio->block_in_file >> dio->blkfactor; > + if (!end || dio->zero_block_front != fsblock) { > > - this_chunk_bytes = this_chunk_blocks << dio->blkbits; > + /* wait for any zeroing already in progress */ > + if (dio_wait_zero_block(dio, fsblock)) { > + /* skip the range we would have zeroed. */ > + dio->next_block_for_io += this_chunk_blocks; > + return; > + } > + > + /* > + * we are going to zero stuff now, so set a guard to catch > + * others that might want to zero the same block. > + */ > + dio_start_zero_block(dio, fsblock); > + if (end) > + dio->zero_block_rear = fsblock; > + else > + dio->zero_block_front = fsblock; > + } > > page = ZERO_PAGE(0); > - if (submit_page_section(dio, page, 0, this_chunk_bytes, > + if (submit_page_section(dio, page, 0, this_chunk_blocks << dio->blkbits, > dio->next_block_for_io)) > return; > > @@ -1191,6 +1324,13 @@ __blockdev_direct_IO_newtrunc(int rw, struct kiocb *iocb, struct inode *inode, > */ > memset(dio, 0, offsetof(struct dio, pages)); > > + /* > + * zero_blocks need to initialised to largeŃ•t value to avoid > + * matching the zero block accidentally. > + */ > + dio->zero_block_front = LAST_SECTOR; > + dio->zero_block_rear = LAST_SECTOR; > + > dio->flags = flags; > if (dio->flags & DIO_LOCKING) { > /* watch out for a 0 len io from a tricksy fs */ > -- > 1.7.1 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html From SRS0+1LZ9+65+fromorbit.com=david@internode.on.net Tue Aug 3 19:47:31 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o740lVPq002157 for ; Tue, 3 Aug 2010 19:47:31 -0500 X-ASG-Debug-ID: 1280882868-438303380000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 99C84167B2C2 for ; Tue, 3 Aug 2010 17:47:49 -0700 (PDT) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id 4NFbeE8dGUHBOEnO for ; Tue, 03 Aug 2010 17:47:49 -0700 (PDT) Received: from dastard (unverified [121.44.216.100]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 33806829-1927428 for multiple; Wed, 04 Aug 2010 10:17:47 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OgS94-0008Vg-92; Wed, 04 Aug 2010 10:47:46 +1000 Date: Wed, 4 Aug 2010 10:47:46 +1000 From: Dave Chinner To: Ilia Mirkin Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS hung on 2.6.33.3 kernel Subject: Re: XFS hung on 2.6.33.3 kernel Message-ID: <20100804004746.GT7362@dastard> References: <20100718012033.GA18888@dastard> <20100718235036.GC32635@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1280882870 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36958 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Ilia, Can you send me the output of this for your kernel that the traces came from: $ gdb (gdb) l *( xfs_write+0x2cc) You can run it against the vmlinux file in the kernel build directory. Basically I need to know which xfs_ilock() call in xfs_write() one of the mysqld-test processes is stuck on. Cheers, Dave. -- Dave Chinner david@fromorbit.com From ibmirkin@gmail.com Tue Aug 3 20:15:35 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o741FZZb002920 for ; Tue, 3 Aug 2010 20:15:35 -0500 X-ASG-Debug-ID: 1280885035-7a1b003d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-vw0-f53.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0936D34AB82 for ; Tue, 3 Aug 2010 18:23:55 -0700 (PDT) Received: from mail-vw0-f53.google.com (mail-vw0-f53.google.com [209.85.212.53]) by cuda.sgi.com with ESMTP id hWbgEIzzaBsrw2pS for ; Tue, 03 Aug 2010 18:23:55 -0700 (PDT) Received: by vws15 with SMTP id 15so3619892vws.26 for ; Tue, 03 Aug 2010 18:15:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:sender:received :in-reply-to:references:date:x-google-sender-auth:message-id:subject :from:to:cc:content-type:content-transfer-encoding; bh=8F+EL5dINbXF5Yc2w25k4gW9/KfU0xeelLn3jm5MIkk=; b=OLM8BJcweqSDsiSSjmvB/57WPHkcfhxa/IQczHm4KpqYvCSxHhn5B2Tyo5LMWClZjy UZfVFAUh6PptP7ltvqal+bU+nB4qNgbFMhdub1SK7Fle/ukqqX9vnSPimXiuT63Jr1uu gv2v+iTbGHCsGVq9bEonjQIIilZI1xL8beCYs= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:sender:in-reply-to:references:date :x-google-sender-auth:message-id:subject:from:to:cc:content-type :content-transfer-encoding; b=qAm5PFyMtzAba4mvTHPwMCcKgd0KTrGMr/cU6t6e/FUA9GbyZ7FHEO5Uxdcf4zyhvY +R/Qg2pr7Uzoox3l4QHJZYeupP0g3QGqOuXHejva88R2HYFTHww/aU8flf7MlTDwel9K YnbFiDoDapSRoLMvzEzJJL9Udf0ykTlABxnH4= MIME-Version: 1.0 Received: by 10.220.59.202 with SMTP id m10mr5824297vch.23.1280884553970; Tue, 03 Aug 2010 18:15:53 -0700 (PDT) Sender: ibmirkin@gmail.com Received: by 10.220.166.76 with HTTP; Tue, 3 Aug 2010 18:15:53 -0700 (PDT) In-Reply-To: <20100804004746.GT7362@dastard> References: <20100718012033.GA18888@dastard> <20100718235036.GC32635@dastard> <20100804004746.GT7362@dastard> Date: Tue, 3 Aug 2010 21:15:53 -0400 X-Google-Sender-Auth: wKgvGPSeEslO3bitaJD03h7917o Message-ID: X-ASG-Orig-Subj: Re: XFS hung on 2.6.33.3 kernel Subject: Re: XFS hung on 2.6.33.3 kernel From: Ilia Mirkin To: Dave Chinner Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail-vw0-f53.google.com[209.85.212.53] X-Barracuda-Start-Time: 1280885036 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36961 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Aug 3, 2010 at 8:47 PM, Dave Chinner wrote: > Ilia, > > Can you send me the output of this for your kernel that the > traces came from: > > $ gdb > (gdb) l *( xfs_write+0x2cc) > > You can run it against the vmlinux file in the kernel build > directory. =A0Basically I need to know which xfs_ilock() call in > xfs_write() one of the mysqld-test processes is stuck on. No problem - BTW, I'm running this on a 2.6.33.3 kernel (same as the one before, although diff hardware). If you want (and are fine with me "destroying" the current state), I can upgrade it to a kernel of your choice and repeat the test overnight. Naturally I didn't have CONFIG_DEBUG_INFO in there... just changed that to Y and recompiled. I'm not entirely sure that this preserves all the offsets, but at least the BUG-HUNTING doc makes allusions that it would. (gdb) l *( xfs_write+0x2cc) 0xffffffff8124342d is in xfs_write (fs/xfs/linux-2.6/xfs_lrw.c:597). 592 if (!need_i_mutex && (mapping->nrpages || pos > xip->i_size)) { 593 xfs_iunlock(xip, XFS_ILOCK_EXCL|iolock); 594 iolock =3D XFS_IOLOCK_EXCL; 595 need_i_mutex =3D 1; 596 mutex_lock(&inode->i_mutex); 597 xfs_ilock(xip, XFS_ILOCK_EXCL|iolock); 598 goto start; 599 } 600 } 601 Well, at least it points at an xfs_ilock, so pretty good chance that adding debug info didn't change anything else. From SRS0+1LZ9+65+fromorbit.com=david@internode.on.net Tue Aug 3 22:37:10 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_33 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o743bAYc007049 for ; Tue, 3 Aug 2010 22:37:10 -0500 X-ASG-Debug-ID: 1280893048-644602c90000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3C64816958CC for ; Tue, 3 Aug 2010 20:37:28 -0700 (PDT) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id qVpW3CriMr5hQNdH for ; Tue, 03 Aug 2010 20:37:28 -0700 (PDT) Received: from dastard (unverified [121.44.216.100]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 22326210-1927428 for multiple; Wed, 04 Aug 2010 13:07:20 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OgUn8-0000HQ-UV; Wed, 04 Aug 2010 13:37:18 +1000 Date: Wed, 4 Aug 2010 13:37:18 +1000 From: Dave Chinner To: Mingming Cao Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, sandeen@sandeen.net X-ASG-Orig-Subj: Re: [PATCH] dio: track and serialise unaligned direct IO Subject: Re: [PATCH] dio: track and serialise unaligned direct IO Message-ID: <20100804033718.GU7362@dastard> References: <1280443516-14448-1-git-send-email-david@fromorbit.com> <1280880678.2334.27.camel@mingming-laptop> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1280880678.2334.27.camel@mingming-laptop> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1280893050 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36970 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Aug 03, 2010 at 05:11:18PM -0700, Mingming Cao wrote: > On Fri, 2010-07-30 at 08:45 +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > If we get two unaligned direct IO's to the same filesystem block > > that is marked as a new allocation (i.e. buffer_new), then both IOs will > > zero the portion of the block they are not writing data to. As a > > result, when the IOs complete there will be a portion of the block > > that contains zeros from the last IO to complete rather than the > > data that should be there. > > > > This is easily manifested by qemu using aio+dio with an unaligned > > guest filesystem - every IO is unaligned and fileystem corruption is > > encountered in the guest filesystem. xfstest 240 (from Eric Sandeen) > > is also a simple reproducer. > > > > To avoid this problem, track unaligned IO that triggers sub-block zeroing and > > check new incoming unaligned IO that require sub-block zeroing against that > > list. If we get an overlap where the start and end of unaligned IOs hit the > > same filesystem block, then we need to block the incoming IOs until the IO that > > is zeroing the block completes. The blocked IO can then continue without > > needing to do any zeroing and hence won't overwrite valid data with zeros. > > > > This seems to address both two IOs are unaligned direct IO. If the first > IO is aligned direct IO, then it is not tracked? > > I am also concerned about the aligned direct IO case... > > 1) first thread aio+dio+aligned write to a hole, there is no zero-out > submitted from kernel. But the hole remains initialized before all IO > complete and convert it from uninitialized extent to initialized. > 2) second thread aio+dio+unalign write to the same hole, this time it is > unaligned. since buffer is still new (not converted yet), the new > incoming thread zero out port of data that first thread has written to That is clearly and unmistakably an application bug - it should not be issuing concurrent, overlapping IO to the same block(s) regardless of whether they are unaligned, aligned or a mixture of both. By using direct IO, the application has assumed responsibility for preventing data corruption due to overlapping IOs - they are inherently racy and nothing in the dio code prevents that from occurring. The bug I'm fixing is for *non-overlapping* concurrent unaligned IOs where the kernel direct IO code causes the data corruption, not the application. The application is not doing something stupid, and as such needs to be fixed. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+SkGd+65+fromorbit.com=david@internode.on.net Tue Aug 3 22:58:22 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_33 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o743wM00007808 for ; Tue, 3 Aug 2010 22:58:22 -0500 X-ASG-Debug-ID: 1280894320-58fd00e70000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E45874923D6 for ; Tue, 3 Aug 2010 20:58:40 -0700 (PDT) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id acK11QgAOjWXmtMG for ; Tue, 03 Aug 2010 20:58:40 -0700 (PDT) Received: from dastard (unverified [121.44.216.100]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 34017372-1927428 for multiple; Wed, 04 Aug 2010 13:28:36 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OgV7i-0000Im-5s; Wed, 04 Aug 2010 13:58:34 +1000 Date: Wed, 4 Aug 2010 13:58:34 +1000 From: Dave Chinner To: Mingming Cao Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, sandeen@sandeen.net X-ASG-Orig-Subj: Re: [PATCH] dio: track and serialise unaligned direct IO Subject: Re: [PATCH] dio: track and serialise unaligned direct IO Message-ID: <20100804035834.GV7362@dastard> References: <1280443516-14448-1-git-send-email-david@fromorbit.com> <1280880678.2334.27.camel@mingming-laptop> <20100804033718.GU7362@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100804033718.GU7362@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1280894321 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36972 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Aug 04, 2010 at 01:37:18PM +1000, Dave Chinner wrote: > On Tue, Aug 03, 2010 at 05:11:18PM -0700, Mingming Cao wrote: > > On Fri, 2010-07-30 at 08:45 +1000, Dave Chinner wrote: > > > From: Dave Chinner > > > > > > If we get two unaligned direct IO's to the same filesystem block > > > that is marked as a new allocation (i.e. buffer_new), then both IOs will > > > zero the portion of the block they are not writing data to. As a > > > result, when the IOs complete there will be a portion of the block > > > that contains zeros from the last IO to complete rather than the > > > data that should be there. > > > > > > This is easily manifested by qemu using aio+dio with an unaligned > > > guest filesystem - every IO is unaligned and fileystem corruption is > > > encountered in the guest filesystem. xfstest 240 (from Eric Sandeen) > > > is also a simple reproducer. > > > > > > To avoid this problem, track unaligned IO that triggers sub-block zeroing and > > > check new incoming unaligned IO that require sub-block zeroing against that > > > list. If we get an overlap where the start and end of unaligned IOs hit the > > > same filesystem block, then we need to block the incoming IOs until the IO that > > > is zeroing the block completes. The blocked IO can then continue without > > > needing to do any zeroing and hence won't overwrite valid data with zeros. > > > > > > > This seems to address both two IOs are unaligned direct IO. If the first > > IO is aligned direct IO, then it is not tracked? > > > > I am also concerned about the aligned direct IO case... > > > > 1) first thread aio+dio+aligned write to a hole, there is no zero-out > > submitted from kernel. But the hole remains initialized before all IO > > complete and convert it from uninitialized extent to initialized. > > 2) second thread aio+dio+unalign write to the same hole, this time it is > > unaligned. since buffer is still new (not converted yet), the new > > incoming thread zero out port of data that first thread has written to > > That is clearly and unmistakably an application bug - it should not > be issuing concurrent, overlapping IO to the same block(s) > regardless of whether they are unaligned, aligned or a mixture of > both. By using direct IO, the application has assumed responsibility > for preventing data corruption due to overlapping IOs - they are > inherently racy and nothing in the dio code prevents that from > occurring. > > The bug I'm fixing is for *non-overlapping* concurrent unaligned IOs > where the kernel direct IO code causes the data corruption, not the > application. The application is not doing something stupid, and as > such needs to be fixed. ^^^^^^ the kernel bug needs to be fixed. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+rmdr+65+fromorbit.com=david@internode.on.net Tue Aug 3 23:22:07 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_33, J_CHICKENPOX_62 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o744M7dI008787 for ; Tue, 3 Aug 2010 23:22:07 -0500 X-ASG-Debug-ID: 1280895745-193b02210000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2BB2A16962AC for ; Tue, 3 Aug 2010 21:22:26 -0700 (PDT) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id E77riBl4lkElbh3A for ; Tue, 03 Aug 2010 21:22:26 -0700 (PDT) Received: from dastard (unverified [121.44.216.100]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 33739688-1927428 for multiple; Wed, 04 Aug 2010 13:52:20 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OgVUg-0000Kl-Cy; Wed, 04 Aug 2010 14:22:18 +1000 Date: Wed, 4 Aug 2010 14:22:18 +1000 From: Dave Chinner To: Mingming Cao Cc: Matthew Wilcox , linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, sandeen@sandeen.net X-ASG-Orig-Subj: Re: [PATCH] dio: track and serialise unaligned direct IO Subject: Re: [PATCH] dio: track and serialise unaligned direct IO Message-ID: <20100804042218.GW7362@dastard> References: <1280443516-14448-1-git-send-email-david@fromorbit.com> <20100730025324.GO25774@parisc-linux.org> <20100730045331.GA2126@dastard> <1280856865.2436.31.camel@mingming-laptop> <20100803225658.GB26402@dastard> <1280878874.2334.6.camel@mingming-laptop> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1280878874.2334.6.camel@mingming-laptop> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1280895747 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36974 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Aug 03, 2010 at 04:41:14PM -0700, Mingming Cao wrote: > On Wed, 2010-08-04 at 08:56 +1000, Dave Chinner wrote: > > On Tue, Aug 03, 2010 at 10:34:25AM -0700, Mingming Cao wrote: > > > On Fri, 2010-07-30 at 14:53 +1000, Dave Chinner wrote: > > > > On Thu, Jul 29, 2010 at 08:53:24PM -0600, Matthew Wilcox wrote: > > > > > On Fri, Jul 30, 2010 at 08:45:16AM +1000, Dave Chinner wrote: > > > > > > If we get two unaligned direct IO's to the same filesystem block > > > > > > that is marked as a new allocation (i.e. buffer_new), then both IOs will > > > > > > zero the portion of the block they are not writing data to. As a > > > > > > result, when the IOs complete there will be a portion of the block > > > > > > that contains zeros from the last IO to complete rather than the > > > > > > data that should be there. > > .... > > > > I don't want any direct IO for XFS to go through the page cache - > > > > unaligned or not. using the page cache for the unaligned blocks > > > > would also be much worse for performance that this method because it > > > > turns unaligned direct IO into 3 IOs - the unaligned head block, the > > > > aligned body and the unaligned tail block. It would also be a > > > > performance hit you take on every single dio, whereas this way the > > > > hit is only taken when an overlap is detected. > > > > > > Does this problem also possible for DIO and non AIO case? (Ext4 case > > > this only happy with AIO+DIO+unaligned). If not, could we simply force > > > unaligned AIO+DIO to be synchronous? Still direct IO... > > > > There is nothing specific to AIO about this bug. XFS (at least) > > allows concurrent DIO writes to the same inode regardless of whether > > they are dispatched via AIO or multiple separate threads and so the > > race condition exists outside just the AIO context... > > > > Okay..yeah ext4 prevent direct IO write to the same inode from multiple > threads, so this is not a issue for non-aio case. > > How does XFS serialize direct IO (aligned) to the same file offset(or > overlap) from multiple threads? It doesn't. The 1996 usenix paper describes it well: http://oss.sgi.com/projects/xfs/papers/xfs_usenix/index.html See section 6.2 "Performing File I/O", sepcifically the sections on "Using Direct I/O" and "Using Multiple Processes". Quote: "When using direct I/O, multiple readers and writers can all access the file simultaneously. Currently, when using direct I/O and multiple writers, we place the burden of serializing writes to the same region of the file on the application." This is still true 15 years later.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+1LZ9+65+fromorbit.com=david@internode.on.net Tue Aug 3 23:27:10 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o744R9Ao008963 for ; Tue, 3 Aug 2010 23:27:10 -0500 X-ASG-Debug-ID: 1280896529-5fa602f40000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1A2EB187D11 for ; Tue, 3 Aug 2010 21:35:29 -0700 (PDT) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id e4Z8P4d28pM2jrdA for ; Tue, 03 Aug 2010 21:35:29 -0700 (PDT) Received: from dastard (unverified [121.44.216.100]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 33836302-1927428 for multiple; Wed, 04 Aug 2010 13:57:27 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OgVZe-0000LN-02; Wed, 04 Aug 2010 14:27:26 +1000 Date: Wed, 4 Aug 2010 14:27:25 +1000 From: Dave Chinner To: Ilia Mirkin Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS hung on 2.6.33.3 kernel Subject: Re: XFS hung on 2.6.33.3 kernel Message-ID: <20100804042725.GX7362@dastard> References: <20100718012033.GA18888@dastard> <20100718235036.GC32635@dastard> <20100804004746.GT7362@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1280896531 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36975 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Aug 03, 2010 at 09:15:53PM -0400, Ilia Mirkin wrote: > On Tue, Aug 3, 2010 at 8:47 PM, Dave Chinner wrote: > > Ilia, > > > > Can you send me the output of this for your kernel that the > > traces came from: > > > > $ gdb > > (gdb) l *( xfs_write+0x2cc) > > > > You can run it against the vmlinux file in the kernel build > > directory.  Basically I need to know which xfs_ilock() call in > > xfs_write() one of the mysqld-test processes is stuck on. > > No problem - BTW, I'm running this on a 2.6.33.3 kernel (same as the > one before, although diff hardware). If you want (and are fine with me > "destroying" the current state), I can upgrade it to a kernel of your > choice and repeat the test overnight. > > Naturally I didn't have CONFIG_DEBUG_INFO in there... just changed > that to Y and recompiled. I'm not entirely sure that this preserves > all the offsets, but at least the BUG-HUNTING doc makes allusions that > it would. > > (gdb) l *( xfs_write+0x2cc) > 0xffffffff8124342d is in xfs_write (fs/xfs/linux-2.6/xfs_lrw.c:597). > 592 if (!need_i_mutex && (mapping->nrpages || pos > > xip->i_size)) { > 593 xfs_iunlock(xip, XFS_ILOCK_EXCL|iolock); > 594 iolock = XFS_IOLOCK_EXCL; > 595 need_i_mutex = 1; > 596 mutex_lock(&inode->i_mutex); > 597 xfs_ilock(xip, XFS_ILOCK_EXCL|iolock); Make sense. Can you run 'l *(xfs_ilock+0x2c)' as well? I just need to confirm which lock it has blocked on. Cheers, Dave. -- Dave Chinner david@fromorbit.com From ibmirkin@gmail.com Tue Aug 3 23:38:50 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o744cnTX010144 for ; Tue, 3 Aug 2010 23:38:50 -0500 X-ASG-Debug-ID: 1280896749-427100b80000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-vw0-f53.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A7B5716963DC for ; Tue, 3 Aug 2010 21:39:09 -0700 (PDT) Received: from mail-vw0-f53.google.com (mail-vw0-f53.google.com [209.85.212.53]) by cuda.sgi.com with ESMTP id inQY48jv6dpJHHa2 for ; Tue, 03 Aug 2010 21:39:09 -0700 (PDT) Received: by vws15 with SMTP id 15so3749585vws.26 for ; Tue, 03 Aug 2010 21:39:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:sender:received :in-reply-to:references:date:x-google-sender-auth:message-id:subject :from:to:cc:content-type:content-transfer-encoding; bh=/zaZvfBGJ1ce8PDXBf3Wr6PopOZRefKeLNDRb6o1x+c=; b=FYjWnyxfRCMwYvUhqIhN1YwweMlJHvPvu1btfMhGiqgE+TbDnHNI80mRZfPUertwEv SrZar0aJcT7Y9kRgWiQXwMyhUFcMndVrpYvh8zkgb/ohYeh7jQRGRspIwEnP845r6C7L 7revDFBQgnBYkDvhiTfRyYe80MGCS7HtlBUqI= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:sender:in-reply-to:references:date :x-google-sender-auth:message-id:subject:from:to:cc:content-type :content-transfer-encoding; b=btd4URT6g9KMPe8DWhodqFYNiwNyt4t6tWFRQIefcZDxvtOOWK30AFg5zT22bcmELx +CMpDVw1RtBxaGAABmN1HUN3cjzJA7cxsXHvcfHmScolcVStxkEnU/rGEmadPbIjgADK EPt5UBEo0oGE1eMhA0nLr2tX5gzoCmP5ouzLw= MIME-Version: 1.0 Received: by 10.220.126.207 with SMTP id d15mr5849170vcs.118.1280896748972; Tue, 03 Aug 2010 21:39:08 -0700 (PDT) Sender: ibmirkin@gmail.com Received: by 10.220.166.76 with HTTP; Tue, 3 Aug 2010 21:39:08 -0700 (PDT) In-Reply-To: <20100804042725.GX7362@dastard> References: <20100718012033.GA18888@dastard> <20100718235036.GC32635@dastard> <20100804004746.GT7362@dastard> <20100804042725.GX7362@dastard> Date: Wed, 4 Aug 2010 00:39:08 -0400 X-Google-Sender-Auth: _dbF_tSnOdFde7WLsoBHqkCgvCg Message-ID: X-ASG-Orig-Subj: Re: XFS hung on 2.6.33.3 kernel Subject: Re: XFS hung on 2.6.33.3 kernel From: Ilia Mirkin To: Dave Chinner Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail-vw0-f53.google.com[209.85.212.53] X-Barracuda-Start-Time: 1280896749 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36974 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Aug 4, 2010 at 12:27 AM, Dave Chinner wrote: > On Tue, Aug 03, 2010 at 09:15:53PM -0400, Ilia Mirkin wrote: >> On Tue, Aug 3, 2010 at 8:47 PM, Dave Chinner wrote= : >> > Ilia, >> > >> > Can you send me the output of this for your kernel that the >> > traces came from: >> > >> > $ gdb >> > (gdb) l *( xfs_write+0x2cc) >> > >> > You can run it against the vmlinux file in the kernel build >> > directory. =A0Basically I need to know which xfs_ilock() call in >> > xfs_write() one of the mysqld-test processes is stuck on. >> >> No problem - BTW, I'm running this on a 2.6.33.3 kernel (same as the >> one before, although diff hardware). If you want (and are fine with me >> "destroying" the current state), I can upgrade it to a kernel of your >> choice and repeat the test overnight. >> >> Naturally I didn't have CONFIG_DEBUG_INFO in there... just changed >> that to Y and recompiled. I'm not entirely sure that this preserves >> all the offsets, but at least the BUG-HUNTING doc makes allusions that >> it would. >> >> (gdb) l *( xfs_write+0x2cc) >> 0xffffffff8124342d is in xfs_write (fs/xfs/linux-2.6/xfs_lrw.c:597). >> 592 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (!need_i_mutex && (mappin= g->nrpages || pos >> > xip->i_size)) { >> 593 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 xfs_iunlock(= xip, XFS_ILOCK_EXCL|iolock); >> 594 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 iolock =3D X= FS_IOLOCK_EXCL; >> 595 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 need_i_mutex= =3D 1; >> 596 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 mutex_lock(&= inode->i_mutex); >> 597 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 xfs_ilock(xi= p, XFS_ILOCK_EXCL|iolock); > > Make sense. Can you run 'l *(xfs_ilock+0x2c)' as well? I just need to > confirm which lock it has blocked on. (gdb) l *(xfs_ilock+0x2c) 0xffffffff81221001 is in xfs_ilock (fs/xfs/linux-2.6/mrlock.h:48). 43 down_read_nested(&mrp->mr_lock, subclass); 44 } 45 46 static inline void mrupdate_nested(mrlock_t *mrp, int subclass) 47 { 48 down_write_nested(&mrp->mr_lock, subclass); 49 #ifdef DEBUG 50 mrp->mr_writer =3D 1; 51 #endif 52 } From SRS0+i3iU+65+fromorbit.com=david@internode.on.net Wed Aug 4 01:53:32 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o746rV27016375 for ; Wed, 4 Aug 2010 01:53:32 -0500 X-ASG-Debug-ID: 1280905311-4e9902090000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 65EB811CC2F8 for ; Wed, 4 Aug 2010 00:01:52 -0700 (PDT) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id da3SWVHt3yTaYBAB for ; Wed, 04 Aug 2010 00:01:52 -0700 (PDT) Received: from dastard (unverified [121.44.216.100]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 33964396-1927428 for multiple; Wed, 04 Aug 2010 16:23:49 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OgXrH-0000Vy-IG; Wed, 04 Aug 2010 16:53:47 +1000 Date: Wed, 4 Aug 2010 16:53:47 +1000 From: Dave Chinner To: Ilia Mirkin Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS hung on 2.6.33.3 kernel Subject: Re: XFS hung on 2.6.33.3 kernel Message-ID: <20100804065347.GZ7362@dastard> References: <20100718012033.GA18888@dastard> <20100718235036.GC32635@dastard> <20100804004746.GT7362@dastard> <20100804042725.GX7362@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1280905313 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36983 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Aug 04, 2010 at 12:39:08AM -0400, Ilia Mirkin wrote: > On Wed, Aug 4, 2010 at 12:27 AM, Dave Chinner wrote: > > On Tue, Aug 03, 2010 at 09:15:53PM -0400, Ilia Mirkin wrote: > >> On Tue, Aug 3, 2010 at 8:47 PM, Dave Chinner wrote: > >> > Ilia, > >> > > >> > Can you send me the output of this for your kernel that the > >> > traces came from: > >> > > >> > $ gdb > >> > (gdb) l *( xfs_write+0x2cc) > >> > > >> > You can run it against the vmlinux file in the kernel build > >> > directory.  Basically I need to know which xfs_ilock() call in > >> > xfs_write() one of the mysqld-test processes is stuck on. > >> > >> No problem - BTW, I'm running this on a 2.6.33.3 kernel (same as the > >> one before, although diff hardware). If you want (and are fine with me > >> "destroying" the current state), I can upgrade it to a kernel of your > >> choice and repeat the test overnight. > >> > >> Naturally I didn't have CONFIG_DEBUG_INFO in there... just changed > >> that to Y and recompiled. I'm not entirely sure that this preserves > >> all the offsets, but at least the BUG-HUNTING doc makes allusions that > >> it would. > >> > >> (gdb) l *( xfs_write+0x2cc) > >> 0xffffffff8124342d is in xfs_write (fs/xfs/linux-2.6/xfs_lrw.c:597). > >> 592                     if (!need_i_mutex && (mapping->nrpages || pos > >> > xip->i_size)) { > >> 593                             xfs_iunlock(xip, XFS_ILOCK_EXCL|iolock); > >> 594                             iolock = XFS_IOLOCK_EXCL; > >> 595                             need_i_mutex = 1; > >> 596                             mutex_lock(&inode->i_mutex); > >> 597                             xfs_ilock(xip, XFS_ILOCK_EXCL|iolock); > > > > Make sense. Can you run 'l *(xfs_ilock+0x2c)' as well? I just need to > > confirm which lock it has blocked on. > > (gdb) l *(xfs_ilock+0x2c) > 0xffffffff81221001 is in xfs_ilock (fs/xfs/linux-2.6/mrlock.h:48). > 43 down_read_nested(&mrp->mr_lock, subclass); > 44 } > 45 > 46 static inline void mrupdate_nested(mrlock_t *mrp, int subclass) > 47 { > 48 down_write_nested(&mrp->mr_lock, subclass); > 49 #ifdef DEBUG > 50 mrp->mr_writer = 1; > 51 #endif > 52 } OK, that doesn't help - it followed into the inline function rather than telling me which of the two calls in the function it was. I guess I'll need the disassembly output to work it out. Can you send the output of "disass xfs_ilock" instead? Thanks. Cheers, Dave. -- Dave Chinner david@fromorbit.com From linux@dominikbrodowski.net Wed Aug 4 02:36:40 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o747aeJA018065 for ; Wed, 4 Aug 2010 02:36:40 -0500 X-ASG-Debug-ID: 1280907416-68ca01bb0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from linta.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3C439492C68 for ; Wed, 4 Aug 2010 00:36:56 -0700 (PDT) Received: from linta.de (isilmar-3.linta.de [188.40.101.200]) by cuda.sgi.com with ESMTP id iniYJxbYE2Jr3yHu for ; Wed, 04 Aug 2010 00:36:56 -0700 (PDT) Received: (qmail 4065 invoked from network); 4 Aug 2010 07:36:54 -0000 Received: from p54a06a33.dip.t-dialin.net (HELO comet.dominikbrodowski.net) (brodo@84.160.106.51) by isilmar-3.linta.de with (DHE-RSA-AES256-SHA encrypted) SMTP; 4 Aug 2010 07:36:53 -0000 Received: by comet.dominikbrodowski.net (Postfix, from userid 1000) id 774628007C; Wed, 4 Aug 2010 09:35:46 +0200 (CEST) Date: Wed, 4 Aug 2010 09:35:46 +0200 From: Dominik Brodowski To: linux-raid@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org X-ASG-Orig-Subj: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs Subject: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs Message-ID: <20100804073546.GA7494@comet.dominikbrodowski.net> Mail-Followup-To: Dominik Brodowski , linux-raid@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: isilmar-3.linta.de[188.40.101.200] X-Barracuda-Start-Time: 1280907417 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36986 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hey, on a production system I run kernel 2.6.35 and XFS (rw,relatime,nobarrier) on a lvdevice of a vgroup consisting of five dm-crypt devices (cryptsetup -c aes-lrw-benbi -s 384 create) , each of which runs on a md-raid1 device (mdadm --create --level=raid1 --raid-devices=2) on two 750 GB ATA devices. The read performance is abysmal. The ata devices can be ruled out, as hdparm resulted in acceptable performance: > Timing cached reads: 9444 MB in 2.00 seconds = 4733.59 MB/sec > Timing buffered disk reads: 298 MB in 3.02 seconds = 98.73 MB/sec How can I best track down the cause of the performance problem, a) without rebooting too often, and b) without breaking up the setup specified above (production system)? Any ideas? perf(1)? iostat(1)? Thanks & best, Dominik From BATV+5b0c3c5db7a982429319+2537+infradead.org+hch@bombadil.srs.infradead.org Wed Aug 4 03:50:24 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o748oLfs025729 for ; Wed, 4 Aug 2010 03:50:24 -0500 X-ASG-Debug-ID: 1280912323-15dd02560000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5741E11CC89B for ; Wed, 4 Aug 2010 01:58:43 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id EsorJ973X2q2kO8D for ; Wed, 04 Aug 2010 01:58:43 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OgZgN-0003ii-4Y; Wed, 04 Aug 2010 08:50:39 +0000 Date: Wed, 4 Aug 2010 04:50:39 -0400 From: Christoph Hellwig To: Dominik Brodowski , linux-raid@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org X-ASG-Orig-Subj: Re: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs Subject: Re: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs Message-ID: <20100804085039.GA11671@infradead.org> References: <20100804073546.GA7494@comet.dominikbrodowski.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100804073546.GA7494@comet.dominikbrodowski.net> User-Agent: Mutt/1.5.20 (2009-08-17) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1280912324 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Aug 04, 2010 at 09:35:46AM +0200, Dominik Brodowski wrote: > How can I best track down the cause of the performance problem, > a) without rebooting too often, and > b) without breaking up the setup specified above (production system)? So did you just upgrade the system from an earlier kernel that did not show these problems? Or did no one notice them before? From linux@dominikbrodowski.net Wed Aug 4 04:13:01 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o749D0qt026487 for ; Wed, 4 Aug 2010 04:13:01 -0500 X-ASG-Debug-ID: 1280913681-45d900b40000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from linta.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C4F7014C6187 for ; Wed, 4 Aug 2010 02:21:21 -0700 (PDT) Received: from linta.de (isilmar-3.linta.de [188.40.101.200]) by cuda.sgi.com with ESMTP id kGNZMSDxT4qAKsGr for ; Wed, 04 Aug 2010 02:21:21 -0700 (PDT) Received: (qmail 32056 invoked by uid 1000); 4 Aug 2010 09:13:17 -0000 Date: Wed, 4 Aug 2010 11:13:17 +0200 From: Dominik Brodowski To: Christoph Hellwig Cc: linux-raid@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org X-ASG-Orig-Subj: Re: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs Subject: Re: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs Message-ID: <20100804091317.GA27779@isilmar-3.linta.de> Mail-Followup-To: Dominik Brodowski , Christoph Hellwig , linux-raid@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org References: <20100804073546.GA7494@comet.dominikbrodowski.net> <20100804085039.GA11671@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100804085039.GA11671@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: isilmar-3.linta.de[188.40.101.200] X-Barracuda-Start-Time: 1280913682 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36993 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Christoph, On Wed, Aug 04, 2010 at 04:50:39AM -0400, Christoph Hellwig wrote: > On Wed, Aug 04, 2010 at 09:35:46AM +0200, Dominik Brodowski wrote: > > How can I best track down the cause of the performance problem, > > a) without rebooting too often, and > > b) without breaking up the setup specified above (production system)? > > So did you just upgrade the system from an earlier kernel that did not > show these problems? No, 2.6.31 to 2.6.34 show similar behaviour. > Or did no one notice them before? Well, there are some reports relating to XFS on MD or RAID, though I couldn't find a resolution to the issues reported, e.g. - http://kerneltrap.org/mailarchive/linux-raid/2009/10/12/6490333 - http://lkml.indiana.edu/hypermail/linux/kernel/1006.1/00099.html However, I think we can rule out barriers, as XFS is mounted "nobarrier" here. Best, Dominik From michael.monnerie@is.it-management.at Wed Aug 4 04:15:53 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o749FrBv026588 for ; Wed, 4 Aug 2010 04:15:53 -0500 X-ASG-Debug-ID: 1280913371-5f5603a00000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv14.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 904DA1D6DB76 for ; Wed, 4 Aug 2010 02:16:11 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id 7Mqum8cO79yDpDyz for ; Wed, 04 Aug 2010 02:16:11 -0700 (PDT) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv14.zmi.at (Postfix) with ESMTPSA id 9CF2B17C; Wed, 4 Aug 2010 11:16:10 +0200 (CEST) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id 5CA8347EA07; Wed, 4 Aug 2010 11:16:10 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: Dominik Brodowski , linux-raid@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org X-ASG-Orig-Subj: Re: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs Subject: Re: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs Date: Wed, 4 Aug 2010 11:16:09 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.34.1-zmi; KDE/4.3.5; x86_64; ; ) References: <20100804073546.GA7494@comet.dominikbrodowski.net> In-Reply-To: <20100804073546.GA7494@comet.dominikbrodowski.net> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart41331569.taeFQ0rjha"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201008041116.09822@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1280913372 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36992 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart41331569.taeFQ0rjha Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable On Mittwoch, 4. August 2010 Dominik Brodowski wrote: > The read performance is abysmal. The ata devices can be ruled out, as > hdparm >=20 > resulted in acceptable performance: > > Timing cached reads: 9444 MB in 2.00 seconds =3D 4733.59 MB/sec > > Timing buffered disk reads: 298 MB in 3.02 seconds =3D 98.73 > > MB/sec Has that system been running acceptable before? If yes, what has been=20 changed that performance is down now? Or is it a new setup? Then why is it in production already? Can you run bonnie on that system? What does "dd if=3D of=3D/dev/null bs=3D1m count=3D1024" say? What does "dd if=3D/dev/zero of=3D bs=3D1m count=3D1024" say? =2D-=20 mit freundlichen Gr=FCssen, Michael Monnerie, Ing. BSc it-management Internet Services http://proteger.at [gesprochen: Prot-e-schee] Tel: 0660 / 415 65 31 ****** Aktuelles Radiointerview! ****** http://www.it-podcast.at/aktuelle-sendung.html // Wir haben im Moment zwei H=E4user zu verkaufen: // http://zmi.at/langegg/ // http://zmi.at/haus2009/ --nextPart41331569.taeFQ0rjha Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.12 (GNU/Linux) iEYEABECAAYFAkxZL9kACgkQzhSR9xwSCbTecACeIaIGfwqb9W43UiPu6DtTRiXr RWQAn0J6cBGwcUqCSGFRDblkJA/XaA/s =7bjv -----END PGP SIGNATURE----- --nextPart41331569.taeFQ0rjha-- From BATV+5b0c3c5db7a982429319+2537+infradead.org+hch@bombadil.srs.infradead.org Wed Aug 4 04:21:04 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_56 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o749L3Cj026721 for ; Wed, 4 Aug 2010 04:21:03 -0500 X-ASG-Debug-ID: 1280914166-15de03880000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 97CC514C61D7 for ; Wed, 4 Aug 2010 02:29:26 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id DFBoWPufgCtocjbb for ; Wed, 04 Aug 2010 02:29:26 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OgaA6-0001aA-B2; Wed, 04 Aug 2010 09:21:22 +0000 Date: Wed, 4 Aug 2010 05:21:22 -0400 From: Christoph Hellwig To: Dominik Brodowski , Christoph Hellwig , linux-raid@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org X-ASG-Orig-Subj: Re: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs Subject: Re: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs Message-ID: <20100804092122.GA2998@infradead.org> References: <20100804073546.GA7494@comet.dominikbrodowski.net> <20100804085039.GA11671@infradead.org> <20100804091317.GA27779@isilmar-3.linta.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100804091317.GA27779@isilmar-3.linta.de> User-Agent: Mutt/1.5.20 (2009-08-17) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1280914166 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Aug 04, 2010 at 11:13:17AM +0200, Dominik Brodowski wrote: > > show these problems? > > No, 2.6.31 to 2.6.34 show similar behaviour. Ok, so it's been around for a while. Can you test the write speed of each individual device layer by doing a large read from it, using: dd if= of=/dev/null bs=8k iflag=direct where device starts with the /dev/sda* device, and goes up to the MD device, the dm-crypt device and the LV. And yes, it's safe to read from the device while it's otherwise mounted/used. From linux@dominikbrodowski.net Wed Aug 4 05:25:08 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_56 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o74AP8hT028546 for ; Wed, 4 Aug 2010 05:25:08 -0500 X-ASG-Debug-ID: 1280917527-64b101510000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from linta.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6D0934930E1 for ; Wed, 4 Aug 2010 03:25:27 -0700 (PDT) Received: from linta.de (isilmar-3.linta.de [188.40.101.200]) by cuda.sgi.com with ESMTP id TerqY77kxfqCszHN for ; Wed, 04 Aug 2010 03:25:27 -0700 (PDT) Received: (qmail 19083 invoked by uid 1000); 4 Aug 2010 10:25:26 -0000 Date: Wed, 4 Aug 2010 12:25:26 +0200 From: Dominik Brodowski To: Michael Monnerie , Christoph Hellwig Cc: linux-raid@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, dm-devel@redhat.com X-ASG-Orig-Subj: Re: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs Subject: Re: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs Message-ID: <20100804102526.GB13766@isilmar-3.linta.de> Mail-Followup-To: Dominik Brodowski , Michael Monnerie , Christoph Hellwig , linux-raid@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, dm-devel@redhat.com References: <20100804073546.GA7494@comet.dominikbrodowski.net> <20100804085039.GA11671@infradead.org> <20100804091317.GA27779@isilmar-3.linta.de> <20100804092122.GA2998@infradead.org> <20100804073546.GA7494@comet.dominikbrodowski.net> <201008041116.09822@zmi.at> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100804092122.GA2998@infradead.org> <201008041116.09822@zmi.at> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: isilmar-3.linta.de[188.40.101.200] X-Barracuda-Start-Time: 1280917528 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36998 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hey, many thanks for your feedback. It seems the crypto step is the culprit: Reading 1.1 GB with dd, iflag=direct, bs=8k: /dev/sd* 35.3 MB/s ( 90 %) /dev/md* 39.1 MB/s (100 %) /dev/mapper/md*_crypt 3.9 MB/s ( 10 %) /dev/mapper/vg1-* 3.9 MB/s ( 10 %) The "good" news: it also happens on my notebook, even though it has a different setup (no raid, disk -> lv/vg -> crypt). On my notebook, I'm more than happy to test out different kernel versions, patches etc. /dev/sd* 17.7 MB/s (100 %) /dev/mapper/vg1-* 16.2 MB/s ( 92 %) /dev/mapper/*_crypt 3.1 MB/s ( 18 %) On a different system, a friend of mine reported (with 2.6.33): /dev/sd* 51.9 MB/s (100 %) dm-crypt 32.9 MB/s ( 64 %) This shows that the speed drop when using dmcrypt is not always a factor of 5 to 10... Btw, it occurs both with aes-lrw-benbi and aes-cbc-essiv:sha256 , and (on my notebook) the CPU is mostly idling or waiting. Best, Dominik PS: Bonnie output: Writing intelligently...done Rewriting...done Reading intelligently...done start 'em...done...done...done... Create files in sequential order...done. Stat files in sequential order...done. Delete files in sequential order...done. Create files in random order...done. Stat files in random order...done. Delete files in random order...done. Version 1.03d ------Sequential Output------ --Sequential Input- --Random- -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks-- Machine Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP ABCABCABCABCABC 16G 60186 4 24796 4 53386 5 281.1 1 ------Sequential Create------ --------Random Create-------- -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete-- files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP 16 3176 16 +++++ +++ 4641 28 5501 20 +++++ +++ 2286 9 ABCABCABCABCABCABC,16G,,,60186,4,24796,4,,,53386,5,281.1,1,16,3176,16,+++++,+++,4641,28,5501,20,+++++,+++,2286,9 From BATV+5b0c3c5db7a982429319+2537+infradead.org+hch@bombadil.srs.infradead.org Wed Aug 4 06:17:50 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_56 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o74BHnRO030398 for ; Wed, 4 Aug 2010 06:17:50 -0500 X-ASG-Debug-ID: 1280921172-21c801490000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id F00D911CBEC1 for ; Wed, 4 Aug 2010 04:26:12 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 5JMVqVyas9XHe7wn for ; Wed, 04 Aug 2010 04:26:12 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1Ogbz1-0005Jl-M9; Wed, 04 Aug 2010 11:18:03 +0000 Date: Wed, 4 Aug 2010 07:18:03 -0400 From: Christoph Hellwig To: Dominik Brodowski , Michael Monnerie , Christoph Hellwig , linux-raid@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, dm-devel@redhat.com X-ASG-Orig-Subj: Re: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs Subject: Re: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs Message-ID: <20100804111803.GA32643@infradead.org> References: <20100804073546.GA7494@comet.dominikbrodowski.net> <20100804085039.GA11671@infradead.org> <20100804091317.GA27779@isilmar-3.linta.de> <20100804092122.GA2998@infradead.org> <20100804073546.GA7494@comet.dominikbrodowski.net> <201008041116.09822@zmi.at> <20100804102526.GB13766@isilmar-3.linta.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100804102526.GB13766@isilmar-3.linta.de> User-Agent: Mutt/1.5.20 (2009-08-17) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1280921172 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Aug 04, 2010 at 12:25:26PM +0200, Dominik Brodowski wrote: > Hey, > > many thanks for your feedback. It seems the crypto step is the culprit: > > Reading 1.1 GB with dd, iflag=direct, bs=8k: > > /dev/sd* 35.3 MB/s ( 90 %) > /dev/md* 39.1 MB/s (100 %) > /dev/mapper/md*_crypt 3.9 MB/s ( 10 %) > /dev/mapper/vg1-* 3.9 MB/s ( 10 %) > > The "good" news: it also happens on my notebook, even though it has a > different setup (no raid, disk -> lv/vg -> crypt). On my notebook, I'm > more than happy to test out different kernel versions, patches etc. > > /dev/sd* 17.7 MB/s (100 %) > /dev/mapper/vg1-* 16.2 MB/s ( 92 %) > /dev/mapper/*_crypt 3.1 MB/s ( 18 %) The good news is that you have it tracked down, the bad news is that I know very little about dm-crypt. Maybe the issue is the single threaded decryption in dm-crypt? Can you check how much CPU time the dm crypt kernel thread uses? From linux@dominikbrodowski.net Wed Aug 4 06:24:10 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_56 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o74BOAjC030570 for ; Wed, 4 Aug 2010 06:24:10 -0500 X-ASG-Debug-ID: 1280921069-2a5f006f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from linta.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id EE8C64932EC for ; Wed, 4 Aug 2010 04:24:30 -0700 (PDT) Received: from linta.de (isilmar-3.linta.de [188.40.101.200]) by cuda.sgi.com with ESMTP id jlJCtIzn51uxKctK for ; Wed, 04 Aug 2010 04:24:30 -0700 (PDT) Received: (qmail 6102 invoked by uid 1000); 4 Aug 2010 11:24:28 -0000 Date: Wed, 4 Aug 2010 13:24:28 +0200 From: Dominik Brodowski To: Christoph Hellwig Cc: Michael Monnerie , linux-raid@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, dm-devel@redhat.com X-ASG-Orig-Subj: Re: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs Subject: Re: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs Message-ID: <20100804112428.GA5462@isilmar-3.linta.de> Mail-Followup-To: Dominik Brodowski , Christoph Hellwig , Michael Monnerie , linux-raid@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, dm-devel@redhat.com References: <20100804073546.GA7494@comet.dominikbrodowski.net> <20100804085039.GA11671@infradead.org> <20100804091317.GA27779@isilmar-3.linta.de> <20100804092122.GA2998@infradead.org> <20100804073546.GA7494@comet.dominikbrodowski.net> <201008041116.09822@zmi.at> <20100804102526.GB13766@isilmar-3.linta.de> <20100804111803.GA32643@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100804111803.GA32643@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: isilmar-3.linta.de[188.40.101.200] X-Barracuda-Start-Time: 1280921070 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.37001 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Aug 04, 2010 at 07:18:03AM -0400, Christoph Hellwig wrote: > On Wed, Aug 04, 2010 at 12:25:26PM +0200, Dominik Brodowski wrote: > > Hey, > > > > many thanks for your feedback. It seems the crypto step is the culprit: > > > > Reading 1.1 GB with dd, iflag=direct, bs=8k: > > > > /dev/sd* 35.3 MB/s ( 90 %) > > /dev/md* 39.1 MB/s (100 %) > > /dev/mapper/md*_crypt 3.9 MB/s ( 10 %) > > /dev/mapper/vg1-* 3.9 MB/s ( 10 %) > > > > The "good" news: it also happens on my notebook, even though it has a > > different setup (no raid, disk -> lv/vg -> crypt). On my notebook, I'm > > more than happy to test out different kernel versions, patches etc. > > > > /dev/sd* 17.7 MB/s (100 %) > > /dev/mapper/vg1-* 16.2 MB/s ( 92 %) > > /dev/mapper/*_crypt 3.1 MB/s ( 18 %) > > The good news is that you have it tracked down, the bad news is that > I know very little about dm-crypt. Maybe the issue is the single > threaded decryption in dm-crypt? Can you check how much CPU time > the dm crypt kernel thread uses? 2 CPUs overall: Cpu(s): 1.0%us, 5.7%sy, 0.0%ni, 44.8%id, 47.0%wa, 0.0%hi, 1.5%si, 0.0%st Thanks & best, Dominik From swmike@swm.pp.se Wed Aug 4 06:52:45 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o74Bqj5f032262 for ; Wed, 4 Aug 2010 06:52:45 -0500 X-ASG-Debug-ID: 1280922784-163e020a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from uplift.swm.pp.se (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 614431E3D32E for ; Wed, 4 Aug 2010 04:53:04 -0700 (PDT) Received: from uplift.swm.pp.se (swm.pp.se [212.247.200.143]) by cuda.sgi.com with ESMTP id rKoxrBR5RM9rFA4a for ; Wed, 04 Aug 2010 04:53:04 -0700 (PDT) Received: by uplift.swm.pp.se (Postfix, from userid 501) id 3715E9F; Wed, 4 Aug 2010 13:53:03 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by uplift.swm.pp.se (Postfix) with ESMTP id 35E5B9C; Wed, 4 Aug 2010 13:53:03 +0200 (CEST) Date: Wed, 4 Aug 2010 13:53:03 +0200 (CEST) From: Mikael Abrahamsson To: Christoph Hellwig cc: Dominik Brodowski , Michael Monnerie , linux-raid@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, dm-devel@redhat.com X-ASG-Orig-Subj: Re: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs Subject: Re: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs In-Reply-To: <20100804111803.GA32643@infradead.org> Message-ID: References: <20100804073546.GA7494@comet.dominikbrodowski.net> <20100804085039.GA11671@infradead.org> <20100804091317.GA27779@isilmar-3.linta.de> <20100804092122.GA2998@infradead.org> <20100804073546.GA7494@comet.dominikbrodowski.net> <201008041116.09822@zmi.at> <20100804102526.GB13766@isilmar-3.linta.de> <20100804111803.GA32643@infradead.org> User-Agent: Alpine 1.10 (DEB 962 2008-03-14) Organization: People's Front Against WWW MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed X-Barracuda-Connect: swm.pp.se[212.247.200.143] X-Barracuda-Start-Time: 1280922785 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.37004 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, 4 Aug 2010, Christoph Hellwig wrote: > The good news is that you have it tracked down, the bad news is that I > know very little about dm-crypt. Maybe the issue is the single threaded > decryption in dm-crypt? Can you check how much CPU time the dm crypt > kernel thread uses? I'm not sure it's that. I have a Core i5 with AES-NI and that didn't significantly increase my overall performance, as it's not there the bottleneck is (at least in my system). I earlier sent out an email wondering if someone could shed some light on how scheduling, block caching and read-ahead works together when one does disks->md->crypto->lvm->fs, becase that's a lot of layers and potentially a lot of unneeded buffering, readahead and scheduling magic? -- Mikael Abrahamsson email: swmike@swm.pp.se From elopez@dciphi.uhu.es Wed Aug 4 07:29:46 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.3 required=5.0 tests=BAYES_60,MIME_8BIT_HEADER autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o74CTjUk033271 for ; Wed, 4 Aug 2010 07:29:46 -0500 X-ASG-Debug-ID: 1280925004-5da200140000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ironport.uhu.es (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 77DF21E3D8DC for ; Wed, 4 Aug 2010 05:30:04 -0700 (PDT) Received: from ironport.uhu.es (relay.uhu.es [150.214.167.14]) by cuda.sgi.com with ESMTP id wjyBFQcukn7l1MWX for ; Wed, 04 Aug 2010 05:30:04 -0700 (PDT) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AuoEAI4i50vAqAM3/2dsb2JhbACRVo0vu1mCaoIrBA X-IronPort-AV: E=Sophos;i="4.55,315,1278280800"; d="scan'208";a="13617877" Received: from sirio5.uhu.es (HELO sirio05) ([192.168.3.55]) by relay.uhu.es with ESMTP; 04 Aug 2010 14:30:04 +0200 Received: from [127.0.0.1] (helo=correo.uhu.es) by sirio05 with esmtp (Exim 4.50) id 1Ogbzs-0004vD-13; Wed, 04 Aug 2010 13:18:56 +0200 Received: from 189.254.237.178 (proxying for 93.186.164.42) (SquirrelMail authenticated user elopez) by correo.uhu.es with HTTP; Wed, 4 Aug 2010 13:18:56 +0200 (CEST) Message-ID: <36195.189.254.237.178.1280920736.squirrel@correo.uhu.es> Date: Wed, 4 Aug 2010 13:18:56 +0200 (CEST) X-ASG-Orig-Subj: Web-Mail-Quote =?iso-8859-1?Q?erh=F6hen?= Subject: Web-Mail-Quote =?iso-8859-1?Q?erh=F6hen?= From: "Localhost" To: webmaster@localhost.de User-Agent: SquirrelMail/1.4.4 MIME-Version: 1.0 Content-Type: text/plain;charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Priority: 3 (Normal) Importance: Normal X-Barracuda-Connect: relay.uhu.es[150.214.167.14] X-Barracuda-Start-Time: 1280925005 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0856 1.0000 -1.4796 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.98 X-Barracuda-Spam-Status: No, SCORE=-0.98 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.37006 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Ihre Webmail-Quote hat die Menge, die Quote 5GB überschritten wird. Sie sind derzeit auf 4.8GB. Um wieder zu aktivieren und steigern Sie Ihre Webmail-Quote klicken Sie bitte auf den untenstehenden Link. https://www.hotforms123.com/Forms_ResponsePages/emailForm.aspx?id=03fcf0b1-1e0c-4084-9682-0b73c54698ff_100_400_700 Andernfalls kann die Löschung Ihrer Webmail-Accounts führen. Vielen Dank und sorry für die Unannehmlichkeiten Localhost From msnitzer@redhat.com Wed Aug 4 07:57:42 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o74CvfSb034042 for ; Wed, 4 Aug 2010 07:57:41 -0500 X-ASG-Debug-ID: 1280927165-6f6e01020000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 73DE115D0478 for ; Wed, 4 Aug 2010 06:06:05 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id vj3WzoTl3An5KA3U for ; Wed, 04 Aug 2010 06:06:05 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o74CucPD021728 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 4 Aug 2010 08:56:38 -0400 Received: from localhost (dhcp-100-19-150.bos.redhat.com [10.16.19.150]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o74CuVs6032128 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Wed, 4 Aug 2010 08:56:32 -0400 Date: Wed, 4 Aug 2010 08:56:31 -0400 From: Mike Snitzer To: Mikael Abrahamsson Cc: Christoph Hellwig , device-mapper development , Michael Monnerie , linux-kernel@vger.kernel.org, Andi Kleen , Dominik Brodowski , xfs@oss.sgi.com, linux-raid@vger.kernel.org X-ASG-Orig-Subj: Re: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs Subject: Re: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs Message-ID: <20100804125631.GC17263@redhat.com> References: <20100804073546.GA7494@comet.dominikbrodowski.net> <20100804085039.GA11671@infradead.org> <20100804091317.GA27779@isilmar-3.linta.de> <20100804092122.GA2998@infradead.org> <20100804073546.GA7494@comet.dominikbrodowski.net> <201008041116.09822@zmi.at> <20100804102526.GB13766@isilmar-3.linta.de> <20100804111803.GA32643@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.20 (2009-12-10) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1280927165 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Aug 04 2010 at 7:53am -0400, Mikael Abrahamsson wrote: > On Wed, 4 Aug 2010, Christoph Hellwig wrote: > > >The good news is that you have it tracked down, the bad news is > >that I know very little about dm-crypt. Maybe the issue is the > >single threaded decryption in dm-crypt? Can you check how much > >CPU time the dm crypt kernel thread uses? > > I'm not sure it's that. I have a Core i5 with AES-NI and that didn't > significantly increase my overall performance, as it's not there the > bottleneck is (at least in my system). You could try applying both of these patches that are pending review for hopeful inclussion in 2.6.36: https://patchwork.kernel.org/patch/103404/ https://patchwork.kernel.org/patch/112657/ From sbrodsky@sgi.com Wed Aug 4 09:16:59 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_FRT_FREE autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o74EGxOa036181 for ; Wed, 4 Aug 2010 09:16:59 -0500 Received: from CF--AMER002E--3.americas.sgi.com (cf--amer002e--3.americas.sgi.com [137.38.100.6]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3EFD1AC002 for ; Wed, 4 Aug 2010 07:17:17 -0700 (PDT) Received: from [128.162.232.29] ([128.162.232.29]) by CF--AMER002E--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Wed, 4 Aug 2010 09:16:44 -0500 Subject: [PATCH v3] xfs: ensure f_ffree returned by statfs() is non-negative From: Stuart Brodsky To: xfs@oss.sgi.com Content-Type: text/plain; charset="UTF-8" Date: Wed, 04 Aug 2010 09:15:59 -0500 Message-ID: <1280931359.12084.2519.camel@superior.americas.sgi.com> Mime-Version: 1.0 X-Mailer: Evolution 2.28.2 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 04 Aug 2010 14:16:44.0938 (UTC) FILETIME=[AAF94EA0:01CB33DF] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Because of delayed updates to sb_icount field in the super block, it is possible to allocate over maxicount number of inodes. This causes the arithmetic to calculate a negative number of free inodes in user commands like df or stat -f. Since maxicount is a somewhat arbitrary number, a slight over allocation is not critical but user commands should be displayed as 0 or greater and never go negative. To do this the value in the stats buffer f_ffree is capped to never go negative. Signed-off-by: Stu Brodsky --- a/fs/xfs/linux-2.6/xfs_super.c.orig 2010-07-20 06:06:19.269572013-0500 +++ b/fs/xfs/linux-2.6/xfs_super.c 2010-07-20 08:09:17.773570840 -0500 @@ -1226,6 +1226,7 @@ struct xfs_inode *ip = XFS_I(dentry->d_inode); __uint64_t fakeinos, id; xfs_extlen_t lsize; + __int64_t ffree; statp->f_type = XFS_SB_MAGIC; statp->f_namelen = MAXNAMELEN - 1; @@ -1249,7 +1250,9 @@ statp->f_files = min_t(typeof(statp->f_files), statp->f_files, mp->m_maxicount); - statp->f_ffree = statp->f_files - (sbp->sb_icount - sbp->sb_ifree); + ffree = statp->f_files - (sbp->sb_icount - sbp->sb_ifree); + statp->f_ffree = (__u64) (ffree < 0 ? 0 : ffree); + spin_unlock(&mp->m_sb_lock); if ((ip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) || -- Stuart Brodsky 2750 Blue Water Road Eagan, MN. 55121 651-683-7910 From cmm@us.ibm.com Wed Aug 4 09:55:59 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_33 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o74EtxIp037429 for ; Wed, 4 Aug 2010 09:55:59 -0500 X-ASG-Debug-ID: 1280933779-5578010a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from e9.ny.us.ibm.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9B63A493E46 for ; Wed, 4 Aug 2010 07:56:19 -0700 (PDT) Received: from e9.ny.us.ibm.com (e9.ny.us.ibm.com [32.97.182.139]) by cuda.sgi.com with ESMTP id v2A3GHvZ1FxJJQvn for ; Wed, 04 Aug 2010 07:56:19 -0700 (PDT) Received: from d01relay01.pok.ibm.com (d01relay01.pok.ibm.com [9.56.227.233]) by e9.ny.us.ibm.com (8.14.4/8.13.1) with ESMTP id o74EdFmG020406 for ; Wed, 4 Aug 2010 10:39:15 -0400 Received: from d03av02.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by d01relay01.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id o74EuFV7385956 for ; Wed, 4 Aug 2010 10:56:16 -0400 Received: from d03av02.boulder.ibm.com (loopback [127.0.0.1]) by d03av02.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id o74Eu24f028801 for ; Wed, 4 Aug 2010 08:56:03 -0600 Received: from [9.65.196.163] (sig-9-65-196-163.mts.ibm.com [9.65.196.163]) by d03av02.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id o74Eu0i4027480; Wed, 4 Aug 2010 08:56:01 -0600 X-ASG-Orig-Subj: Re: [PATCH] dio: track and serialise unaligned direct IO Subject: Re: [PATCH] dio: track and serialise unaligned direct IO From: Mingming Cao To: Dave Chinner Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, sandeen@sandeen.net In-Reply-To: <20100804033718.GU7362@dastard> References: <1280443516-14448-1-git-send-email-david@fromorbit.com> <1280880678.2334.27.camel@mingming-laptop> <20100804033718.GU7362@dastard> Content-Type: text/plain; charset="UTF-8" Date: Wed, 04 Aug 2010 07:55:52 -0700 Message-ID: <1280933752.4676.6.camel@mingming-laptop> Mime-Version: 1.0 X-Mailer: Evolution 2.28.1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: e9.ny.us.ibm.com[32.97.182.139] X-Barracuda-Start-Time: 1280933779 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.37016 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, 2010-08-04 at 13:37 +1000, Dave Chinner wrote: > On Tue, Aug 03, 2010 at 05:11:18PM -0700, Mingming Cao wrote: > > On Fri, 2010-07-30 at 08:45 +1000, Dave Chinner wrote: > > > From: Dave Chinner > > > > > > If we get two unaligned direct IO's to the same filesystem block > > > that is marked as a new allocation (i.e. buffer_new), then both IOs will > > > zero the portion of the block they are not writing data to. As a > > > result, when the IOs complete there will be a portion of the block > > > that contains zeros from the last IO to complete rather than the > > > data that should be there. > > > > > > This is easily manifested by qemu using aio+dio with an unaligned > > > guest filesystem - every IO is unaligned and fileystem corruption is > > > encountered in the guest filesystem. xfstest 240 (from Eric Sandeen) > > > is also a simple reproducer. > > > > > > To avoid this problem, track unaligned IO that triggers sub-block zeroing and > > > check new incoming unaligned IO that require sub-block zeroing against that > > > list. If we get an overlap where the start and end of unaligned IOs hit the > > > same filesystem block, then we need to block the incoming IOs until the IO that > > > is zeroing the block completes. The blocked IO can then continue without > > > needing to do any zeroing and hence won't overwrite valid data with zeros. > > > > > > > This seems to address both two IOs are unaligned direct IO. If the first > > IO is aligned direct IO, then it is not tracked? > > > > I am also concerned about the aligned direct IO case... > > > > 1) first thread aio+dio+aligned write to a hole, there is no zero-out > > submitted from kernel. But the hole remains initialized before all IO > > complete and convert it from uninitialized extent to initialized. > > 2) second thread aio+dio+unalign write to the same hole, this time it is > > unaligned. since buffer is still new (not converted yet), the new > > incoming thread zero out port of data that first thread has written to > > That is clearly and unmistakably an application bug - it should not > be issuing concurrent, overlapping IO to the same block(s) > regardless of whether they are unaligned, aligned or a mixture of > both. By using direct IO, the application has assumed responsibility > for preventing data corruption due to overlapping IOs - they are > inherently racy and nothing in the dio code prevents that from > occurring. > while there are multiple applications running on the same filesystem, they could possible touching the same files concurrently. How could applications know there is other apps to change the same file at the same time? > The bug I'm fixing is for *non-overlapping* concurrent unaligned IOs > where the kernel direct IO code causes the data corruption, not the > application. The application is not doing something stupid, and as > such needs to be fixed. > For the case I refering to here, it's the kernel direct IO who zero out the block for 2). The application did 2) did not do zero-out it self, but it will result in loose data the application write in 1). It's the same as what you are trying to fix. Mingming From ibmirkin@gmail.com Wed Aug 4 10:39:44 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o74FdhAL038686 for ; Wed, 4 Aug 2010 10:39:44 -0500 X-ASG-Debug-ID: 1280936403-557803390000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-pv0-f181.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4F39649417A for ; Wed, 4 Aug 2010 08:40:03 -0700 (PDT) Received: from mail-pv0-f181.google.com (mail-pv0-f181.google.com [74.125.83.181]) by cuda.sgi.com with ESMTP id IaokGv5p7gbzBOl2 for ; Wed, 04 Aug 2010 08:40:03 -0700 (PDT) Received: by pvg2 with SMTP id 2so2862822pvg.26 for ; Wed, 04 Aug 2010 08:40:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:sender:received :in-reply-to:references:date:x-google-sender-auth:message-id:subject :from:to:cc:content-type:content-transfer-encoding; bh=25lfVwAXQt0SRlUohKEifilY/TGgw6seVBFNPMyHC2A=; b=vpol0j2VtkZCFJBxUimh9zooQK3u+6neffGS/tszmUy07g2PR04jAVJFle8cnPg7nh 3TvvRONJF9gNsWi/zxLtRiAJvGYYC/B0YnX3VGV+JOleMExAvmQoAqKWl6cUSRvDUe9g fHErgD1Rysh3NHXPVnY+oVWn9GabZd14A3d9A= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:sender:in-reply-to:references:date :x-google-sender-auth:message-id:subject:from:to:cc:content-type :content-transfer-encoding; b=VDhXK4X61C2UQqDEhGvRDLQOv4qADhcioe/AKCOF7upNejczBR8CPOn+G9Mljoy5vU ZXjjhTaEkiminvqi2oBG0iOU42IKNVg/3fH0Aw3MRbKYa4uAkL2JGmRUM5pfO6TWHMy8 m9o6OPtNLpC5BeN/YXwiO3Yw05XRjSSaGxp7U= MIME-Version: 1.0 Received: by 10.142.48.6 with SMTP id v6mr7960140wfv.96.1280936403284; Wed, 04 Aug 2010 08:40:03 -0700 (PDT) Sender: ibmirkin@gmail.com Received: by 10.220.166.76 with HTTP; Wed, 4 Aug 2010 08:40:02 -0700 (PDT) In-Reply-To: <20100804065347.GZ7362@dastard> References: <20100718012033.GA18888@dastard> <20100718235036.GC32635@dastard> <20100804004746.GT7362@dastard> <20100804042725.GX7362@dastard> <20100804065347.GZ7362@dastard> Date: Wed, 4 Aug 2010 11:40:02 -0400 X-Google-Sender-Auth: uQrRUsFLS9ilh0UFKX60Z-0HiuY Message-ID: X-ASG-Orig-Subj: Re: XFS hung on 2.6.33.3 kernel Subject: Re: XFS hung on 2.6.33.3 kernel From: Ilia Mirkin To: Dave Chinner Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail-pv0-f181.google.com[74.125.83.181] X-Barracuda-Start-Time: 1280936404 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.37018 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Aug 4, 2010 at 2:53 AM, Dave Chinner wrote: > On Wed, Aug 04, 2010 at 12:39:08AM -0400, Ilia Mirkin wrote: >> On Wed, Aug 4, 2010 at 12:27 AM, Dave Chinner wrot= e: >> > On Tue, Aug 03, 2010 at 09:15:53PM -0400, Ilia Mirkin wrote: >> >> On Tue, Aug 3, 2010 at 8:47 PM, Dave Chinner wr= ote: >> >> > Ilia, >> >> > >> >> > Can you send me the output of this for your kernel that the >> >> > traces came from: >> >> > >> >> > $ gdb >> >> > (gdb) l *( xfs_write+0x2cc) >> >> > >> >> > You can run it against the vmlinux file in the kernel build >> >> > directory. =A0Basically I need to know which xfs_ilock() call in >> >> > xfs_write() one of the mysqld-test processes is stuck on. >> >> >> >> No problem - BTW, I'm running this on a 2.6.33.3 kernel (same as the >> >> one before, although diff hardware). If you want (and are fine with m= e >> >> "destroying" the current state), I can upgrade it to a kernel of your >> >> choice and repeat the test overnight. >> >> >> >> Naturally I didn't have CONFIG_DEBUG_INFO in there... just changed >> >> that to Y and recompiled. I'm not entirely sure that this preserves >> >> all the offsets, but at least the BUG-HUNTING doc makes allusions tha= t >> >> it would. >> >> >> >> (gdb) l *( xfs_write+0x2cc) >> >> 0xffffffff8124342d is in xfs_write (fs/xfs/linux-2.6/xfs_lrw.c:597). >> >> 592 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (!need_i_mutex && (map= ping->nrpages || pos >> >> > xip->i_size)) { >> >> 593 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 xfs_iunlo= ck(xip, XFS_ILOCK_EXCL|iolock); >> >> 594 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 iolock = =3D XFS_IOLOCK_EXCL; >> >> 595 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 need_i_mu= tex =3D 1; >> >> 596 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 mutex_loc= k(&inode->i_mutex); >> >> 597 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 xfs_ilock= (xip, XFS_ILOCK_EXCL|iolock); >> > >> > Make sense. Can you run 'l *(xfs_ilock+0x2c)' as well? I just need to >> > confirm which lock it has blocked on. >> >> (gdb) l *(xfs_ilock+0x2c) >> 0xffffffff81221001 is in xfs_ilock (fs/xfs/linux-2.6/mrlock.h:48). >> 43 =A0 =A0 =A0 =A0 =A0 =A0 =A0down_read_nested(&mrp->mr_lock, subclass); >> 44 =A0 =A0 =A0} >> 45 >> 46 =A0 =A0 =A0static inline void mrupdate_nested(mrlock_t *mrp, int subc= lass) >> 47 =A0 =A0 =A0{ >> 48 =A0 =A0 =A0 =A0 =A0 =A0 =A0down_write_nested(&mrp->mr_lock, subclass)= ; >> 49 =A0 =A0 =A0#ifdef DEBUG >> 50 =A0 =A0 =A0 =A0 =A0 =A0 =A0mrp->mr_writer =3D 1; >> 51 =A0 =A0 =A0#endif >> 52 =A0 =A0 =A0} > > OK, that doesn't help - it followed into the inline function > rather than telling me which of the two calls in the function it > was. I guess I'll need the disassembly output to work it out. > Can you send the output of "disass xfs_ilock" instead? Thanks. Looks like it's the first one. (gdb) disass xfs_ilock Dump of assembler code for function xfs_ilock: 0xffffffff81220fd5 : push %rbp 0xffffffff81220fd6 : test $0x1,%sil 0xffffffff81220fda : mov %rsp,%rbp 0xffffffff81220fdd : push %r14 0xffffffff81220fdf : push %r13 0xffffffff81220fe1 : mov %rdi,%r13 0xffffffff81220fe4 : push %r12 0xffffffff81220fe6 : mov %esi,%r12d 0xffffffff81220fe9 : push %rbx 0xffffffff81220fea : je 0xffffffff81221003 0xffffffff81220fec : and $0xff0000,%esi 0xffffffff81220ff2 : lea 0xe8(%rdi),%rdi 0xffffffff81220ff9 : shr $0x10,%esi 0xffffffff81220ffc : callq 0xffffffff8105b725 0xffffffff81221001 : jmp 0xffffffff8122101e 0xffffffff81221003 : test $0x2,%sil 0xffffffff81221007 : je 0xffffffff8122101e 0xffffffff81221009 : and $0xff0000,%esi 0xffffffff8122100f : lea 0xe8(%rdi),%rdi 0xffffffff81221016 : shr $0x10,%esi 0xffffffff81221019 : callq 0xffffffff8105b792 0xffffffff8122101e : test $0x4,%r12b 0xffffffff81221022 : je 0xffffffff81221038 0xffffffff81221024 : mov %r12d,%esi 0xffffffff81221027 : lea 0x88(%r13),%rdi 0xffffffff8122102e : shr $0x18,%esi 0xffffffff81221031 : callq 0xffffffff8105b725 0xffffffff81221036 : jmp 0xffffffff81221050 0xffffffff81221038 : test $0x8,%r12b 0xffffffff8122103c : je 0xffffffff81221050 0xffffffff8122103e : mov %r12d,%esi 0xffffffff81221041 : lea 0x88(%r13),%rdi 0xffffffff81221048 : shr $0x18,%esi 0xffffffff8122104b : callq 0xffffffff8105b792 0xffffffff81221050 : cmpl $0x0,0x863891(%rip) # 0xffffffff81a848e8 0xffffffff81221057 : mov 0x8(%rbp),%r14 0xffffffff8122105b : je 0xffffffff8122107e 0xffffffff8122105d : mov 0x86389c(%rip),%rbx # 0xffffffff81a84900 0xffffffff81221064 : test %rbx,%rbx 0xffffffff81221067 : je 0xffffffff8122107e 0xffffffff81221069 : mov %r14,%rdx 0xffffffff8122106c : mov %r12d,%esi 0xffffffff8122106f : mov %r13,%rdi 0xffffffff81221072 : callq *(%rbx) 0xffffffff81221074 : add $0x8,%rbx 0xffffffff81221078 : cmpq $0x0,(%rbx) 0xffffffff8122107c : jmp 0xffffffff81221067 0xffffffff8122107e : pop %rbx 0xffffffff8122107f : pop %r12 0xffffffff81221081 : pop %r13 0xffffffff81221083 : pop %r14 0xffffffff81221085 : leaveq 0xffffffff81221086 : retq ---Type to continue, or q to quit--- End of assembler dump. From Valdis.Kletnieks@vt.edu Wed Aug 4 15:34:39 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o74KYc12047601 for ; Wed, 4 Aug 2010 15:34:38 -0500 X-ASG-Debug-ID: 1280954098-314f03d20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from lennier.cc.vt.edu (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E702949591B for ; Wed, 4 Aug 2010 13:34:58 -0700 (PDT) Received: from lennier.cc.vt.edu (lennier.cc.vt.edu [198.82.162.213]) by cuda.sgi.com with ESMTP id AadOuz0IKuKgApze for ; Wed, 04 Aug 2010 13:34:58 -0700 (PDT) Received: from dagger.cc.vt.edu (dagger.cc.vt.edu [198.82.163.114]) by lennier.cc.vt.edu (8.13.8/8.13.8) with ESMTP id o74KX7Xq017975; Wed, 4 Aug 2010 16:33:07 -0400 Received: from turing-police.cc.vt.edu (EHLO localhost) ([128.173.14.107]) by dagger.cc.vt.edu (MOS 4.1.8-GA FastPath queued) with ESMTP id KXD81310; Wed, 04 Aug 2010 16:33:06 -0400 (EDT) X-Mailer: exmh version 2.7.2 01/07/2005 with nmh-1.2 To: Dominik Brodowski Cc: Michael Monnerie , Christoph Hellwig , linux-raid@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, dm-devel@redhat.com X-ASG-Orig-Subj: Re: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs Subject: Re: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs In-Reply-To: Your message of "Wed, 04 Aug 2010 12:25:26 +0200." <20100804102526.GB13766@isilmar-3.linta.de> From: Valdis.Kletnieks@vt.edu References: <20100804073546.GA7494@comet.dominikbrodowski.net> <20100804085039.GA11671@infradead.org> <20100804091317.GA27779@isilmar-3.linta.de> <20100804092122.GA2998@infradead.org> <20100804073546.GA7494@comet.dominikbrodowski.net> <201008041116.09822@zmi.at> <20100804102526.GB13766@isilmar-3.linta.de> Mime-Version: 1.0 Content-Type: multipart/signed; boundary="==_Exmh_1280953986_3909P"; micalg=pgp-sha1; protocol="application/pgp-signature" Content-Transfer-Encoding: 7bit Date: Wed, 04 Aug 2010 16:33:06 -0400 Message-ID: <15446.1280953986@localhost> X-Mirapoint-Received-SPF: 128.173.14.107 localhost Valdis.Kletnieks@vt.edu 2 pass X-Mirapoint-IP-Reputation: reputation=neutral-1, source=Fixed, refid=n/a, actions=MAILHURDLE SPF TAG X-Junkmail-Status: score=10/50, host=dagger.cc.vt.edu X-Junkmail-SD-Raw: score=unknown, refid=str=0001.0A020207.4C59CE83.0142,ss=1,fgs=0, ip=0.0.0.0, so=2009-09-22 00:05:22, dmn=2009-09-10 00:05:08, mode=single engine X-Junkmail-IWF: false X-Barracuda-Connect: lennier.cc.vt.edu[198.82.162.213] X-Barracuda-Start-Time: 1280954098 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.37038 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --==_Exmh_1280953986_3909P Content-Type: text/plain; charset="us-ascii" Content-Id: <15440.1280953986.1@localhost> On Wed, 04 Aug 2010 12:25:26 +0200, Dominik Brodowski said: > The "good" news: it also happens on my notebook, even though it has a > different setup (no raid, disk -> lv/vg -> crypt). On my notebook, I'm > more than happy to test out different kernel versions, patches etc. > > /dev/sd* 17.7 MB/s (100 %) > /dev/mapper/vg1-* 16.2 MB/s ( 92 %) > /dev/mapper/*_crypt 3.1 MB/s ( 18 %) Unfortunately, on my laptop with a similar config, I'm seeing this: # dd if=/dev/sda bs=8k count=1000000 of=/dev/null 1000000+0 records in 1000000+0 records out 8192000000 bytes (8.2 GB) copied, 108.352 s, 75.6 MB/s # dd if=/dev/sda2 bs=8k count=1000000 of=/dev/null 1000000+0 records in 1000000+0 records out 8192000000 bytes (8.2 GB) copied, 105.105 s, 77.9 MB/s # dd if=/dev/mapper/vg_blackice-root bs=8k count=100000 of=/dev/null 100000+0 records in 100000+0 records out 819200000 bytes (819 MB) copied, 11.6469 s, 70.3 MB/s The raw disk, the LUKS-encrypted partition that's got a LVM on it, and a crypted LVM partition. The last run spikes both CPUs up to about 50%CPU each. So whatever it is, it's somehow more subtle than that. Maybe the fact that in my case, it's disk, crypto, and LVM on the crypted partition, rather than crypted filesystems on an LVM volume? --==_Exmh_1280953986_3909P Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.10 (GNU/Linux) Comment: Exmh version 2.5 07/13/2001 iD8DBQFMWc6CcC3lWbTT17ARAiAuAKCfL5NTEQUgaL9kVy6x0SN/ryDfbgCg9vhS WfKyIOBnRrmDh2eZQDebem0= =iHTW -----END PGP SIGNATURE----- --==_Exmh_1280953986_3909P-- From neilb@suse.de Wed Aug 4 17:24:30 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o74MOT9x050339 for ; Wed, 4 Aug 2010 17:24:29 -0500 X-ASG-Debug-ID: 1280960689-4ffb01920000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.suse.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 50308495B50 for ; Wed, 4 Aug 2010 15:24:49 -0700 (PDT) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id z2AMMmyrferUQ96P for ; Wed, 04 Aug 2010 15:24:49 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id B03BE93F19; Thu, 5 Aug 2010 00:24:48 +0200 (CEST) Date: Thu, 5 Aug 2010 08:24:38 +1000 From: Neil Brown To: Mikael Abrahamsson Cc: Christoph Hellwig , Dominik Brodowski , Michael Monnerie , linux-raid@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, dm-devel@redhat.com X-ASG-Orig-Subj: Re: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs Subject: Re: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs Message-ID: <20100805082438.0b476adb@notabene> In-Reply-To: References: <20100804073546.GA7494@comet.dominikbrodowski.net> <20100804085039.GA11671@infradead.org> <20100804091317.GA27779@isilmar-3.linta.de> <20100804092122.GA2998@infradead.org> <20100804073546.GA7494@comet.dominikbrodowski.net> <201008041116.09822@zmi.at> <20100804102526.GB13766@isilmar-3.linta.de> <20100804111803.GA32643@infradead.org> X-Mailer: Claws Mail 3.7.6 (GTK+ 2.20.1; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Barracuda-Connect: cantor.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1280960690 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, 4 Aug 2010 13:53:03 +0200 (CEST) Mikael Abrahamsson wrote: > On Wed, 4 Aug 2010, Christoph Hellwig wrote: > > > The good news is that you have it tracked down, the bad news is that I > > know very little about dm-crypt. Maybe the issue is the single threaded > > decryption in dm-crypt? Can you check how much CPU time the dm crypt > > kernel thread uses? > > I'm not sure it's that. I have a Core i5 with AES-NI and that didn't > significantly increase my overall performance, as it's not there the > bottleneck is (at least in my system). > > I earlier sent out an email wondering if someone could shed some light on > how scheduling, block caching and read-ahead works together when one does > disks->md->crypto->lvm->fs, becase that's a lot of layers and potentially > a lot of unneeded buffering, readahead and scheduling magic? > Both page-cache and read-ahead work at the filesystem level, so only the device in the stack that the filesystem mounts from is relevant for these. Any read-ahead setting on other devices are ignored. Other levels only have a cache if they explicitly need one. e.g. raid5 has a stripe-cache to allow parity calculations across all blocks in a stripe. Scheduling can potentially happen at every layer, but it takes very different forms. Crypto, lvm, raid0 etc don't do any scheduling - it is just first-in-first-out. RAID5 does some scheduling for writes (but not reads) to try to gather full stripes. If you write 2 of 3 blocks in a stripe, then 3 of 3 in another stripe, the 3 of 3 will be processed immediately while the 2 of 3 might be delayed a little in the hope that the third will arrive. The sys/block/XXX/queue/scheduler setting only applies at the bottom of the stack (though when you have dm-multipath it is actually one step above the bottom). Hope that helps, NeilBrown From SRS0+jah0+66+fromorbit.com=david@internode.on.net Wed Aug 4 20:02:39 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o7512cGP055067 for ; Wed, 4 Aug 2010 20:02:39 -0500 X-ASG-Debug-ID: 1280970177-40b101d40000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 14EF7496305 for ; Wed, 4 Aug 2010 18:02:57 -0700 (PDT) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id gnggZeO5m86apioB for ; Wed, 04 Aug 2010 18:02:57 -0700 (PDT) Received: from dastard (unverified [121.44.216.100]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 34131778-1927428 for multiple; Thu, 05 Aug 2010 10:32:45 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1Ogor4-0001tq-So; Thu, 05 Aug 2010 11:02:42 +1000 Date: Thu, 5 Aug 2010 11:02:42 +1000 From: Dave Chinner To: Mingming Cao Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, sandeen@sandeen.net X-ASG-Orig-Subj: Re: [PATCH] dio: track and serialise unaligned direct IO Subject: Re: [PATCH] dio: track and serialise unaligned direct IO Message-ID: <20100805010242.GA7362@dastard> References: <1280443516-14448-1-git-send-email-david@fromorbit.com> <1280880678.2334.27.camel@mingming-laptop> <20100804033718.GU7362@dastard> <1280933752.4676.6.camel@mingming-laptop> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1280933752.4676.6.camel@mingming-laptop> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1280970179 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.37056 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Aug 04, 2010 at 07:55:52AM -0700, Mingming Cao wrote: > On Wed, 2010-08-04 at 13:37 +1000, Dave Chinner wrote: > > On Tue, Aug 03, 2010 at 05:11:18PM -0700, Mingming Cao wrote: > > > This seems to address both two IOs are unaligned direct IO. If the first > > > IO is aligned direct IO, then it is not tracked? > > > > > > I am also concerned about the aligned direct IO case... > > > > > > 1) first thread aio+dio+aligned write to a hole, there is no zero-out > > > submitted from kernel. But the hole remains initialized before all IO > > > complete and convert it from uninitialized extent to initialized. > > > 2) second thread aio+dio+unalign write to the same hole, this time it is > > > unaligned. since buffer is still new (not converted yet), the new > > > incoming thread zero out port of data that first thread has written to > > > > That is clearly and unmistakably an application bug - it should not > > be issuing concurrent, overlapping IO to the same block(s) > > regardless of whether they are unaligned, aligned or a mixture of > > both. By using direct IO, the application has assumed responsibility > > for preventing data corruption due to overlapping IOs - they are > > inherently racy and nothing in the dio code prevents that from > > occurring. > > while there are multiple applications running on the same filesystem, > they could possible touching the same files concurrently. How could > applications know there is other apps to change the same file at the > same time? That's for the applications to figure out. A typical way of acheiving serialisation at application level is for all the applications doing dio to the same files is to use byte-range locking... Remember, DIO abdicates all responsibility for IO coherency to the applications. If userspace is issuing concurrent direct IOs to the same block _no matter how_, then that is an application problem, not a kernel problem. If you want the kernel to avoid overlapping DIO, then we have to track _every single DIO_. We clearly do not do that, have never done that, and no OS that implements direct IO has ever done that. It is, quite simply, not the responsibility of the kernel to prevent userspace from doing stupid stuff with DIO and it never has been. If you want POSIX IO coherency semantics, then *don't use DIO*. > > The bug I'm fixing is for *non-overlapping* concurrent unaligned IOs > > where the kernel direct IO code causes the data corruption, not the > > application. The application is not doing something stupid, and as > > such needs to be fixed. > > For the case I refering to here, it's the kernel direct IO who zero out > the block for 2). The application did 2) did not do zero-out it self, > but it will result in loose data the application write in 1). It's the > same as what you are trying to fix. No it isn't. Overlapping vs non-overlapping DIO are two very different cases. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+SSx++66+fromorbit.com=david@internode.on.net Thu Aug 5 00:45:38 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o755jbWu068343 for ; Thu, 5 Aug 2010 00:45:37 -0500 X-ASG-Debug-ID: 1280987642-46e601860000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8C2D611CD9DF for ; Wed, 4 Aug 2010 22:54:03 -0700 (PDT) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id qOzvQQ2V8TFHiCts for ; Wed, 04 Aug 2010 22:54:03 -0700 (PDT) Received: from dastard (unverified [121.44.216.100]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 34384836-1927428 for multiple; Thu, 05 Aug 2010 15:15:54 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OgtH7-0002BQ-50; Thu, 05 Aug 2010 15:45:53 +1000 Date: Thu, 5 Aug 2010 15:45:53 +1000 From: Dave Chinner To: Ilia Mirkin Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS hung on 2.6.33.3 kernel Subject: Re: XFS hung on 2.6.33.3 kernel Message-ID: <20100805054553.GB7362@dastard> References: <20100718012033.GA18888@dastard> <20100718235036.GC32635@dastard> <20100804004746.GT7362@dastard> <20100804042725.GX7362@dastard> <20100804065347.GZ7362@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1280987644 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.37075 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Aug 04, 2010 at 11:40:02AM -0400, Ilia Mirkin wrote: > On Wed, Aug 4, 2010 at 2:53 AM, Dave Chinner wrote: > > On Wed, Aug 04, 2010 at 12:39:08AM -0400, Ilia Mirkin wrote: > >> On Wed, Aug 4, 2010 at 12:27 AM, Dave Chinner wrote: > >> > On Tue, Aug 03, 2010 at 09:15:53PM -0400, Ilia Mirkin wrote: > >> >> On Tue, Aug 3, 2010 at 8:47 PM, Dave Chinner wrote: > >> >> > Ilia, > >> >> > > >> >> > Can you send me the output of this for your kernel that the > >> >> > traces came from: > >> >> > > >> >> > $ gdb > >> >> > (gdb) l *( xfs_write+0x2cc) > >> >> > > >> >> > You can run it against the vmlinux file in the kernel build > >> >> > directory.  Basically I need to know which xfs_ilock() call in > >> >> > xfs_write() one of the mysqld-test processes is stuck on. .... > > OK, that doesn't help - it followed into the inline function > > rather than telling me which of the two calls in the function it > > was. I guess I'll need the disassembly output to work it out. > > Can you send the output of "disass xfs_ilock" instead? Thanks. > > Looks like it's the first one. Yup, that's what it looks like to me, too. That means it's the XFS_IOLOCK_EXCL it is blocking trying to get, not the XFS_ILOCK_EXCL. Well, that makes sense, and tells me that the lockdep "held locks" output at the end also includes locks we are trying to obtain. That clears up that confusion. Ok, I'll work from there. Thanks, Ilia. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+SSx++66+fromorbit.com=david@internode.on.net Thu Aug 5 01:25:26 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o756PQDI069772 for ; Thu, 5 Aug 2010 01:25:26 -0500 X-ASG-Debug-ID: 1280989544-5c0702e40000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B12F41BEF9E8 for ; Wed, 4 Aug 2010 23:25:45 -0700 (PDT) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id hmxEl1Ab8w1YSnZp for ; Wed, 04 Aug 2010 23:25:45 -0700 (PDT) Received: from dastard (unverified [121.44.216.100]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 22493392-1927428 for multiple; Thu, 05 Aug 2010 15:55:43 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1Ogtte-0002E9-1l; Thu, 05 Aug 2010 16:25:42 +1000 Date: Thu, 5 Aug 2010 16:25:41 +1000 From: Dave Chinner To: Ilia Mirkin Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS hung on 2.6.33.3 kernel Subject: Re: XFS hung on 2.6.33.3 kernel Message-ID: <20100805062541.GC26402@dastard> References: <20100718012033.GA18888@dastard> <20100718235036.GC32635@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1280989546 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.37078 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Aug 03, 2010 at 06:30:36PM -0400, Ilia Mirkin wrote: > On Sun, Jul 18, 2010 at 7:50 PM, Dave Chinner wrote: > > On Sat, Jul 17, 2010 at 09:35:33PM -0400, Ilia Mirkin wrote: > >> On Sat, Jul 17, 2010 at 9:20 PM, Dave Chinner wrote: > >> > On Sat, Jul 17, 2010 at 12:01:11AM -0400, Ilia Mirkin wrote: > >> > I can't find a thread that holds the XFS inode lock that everything > >> > is waiting on. I think it is the ILOCK, but none of the threads in > >> > this trace should be holding it where they are blocked. IOWs, the > >> > output does not give me enough information to get to the root cause. > >> > >> In case this happens again, was there something more useful I could > >> have collected? Should I have grabbed all task states? > > > > All the task states, including the running tasks, is probably a good .... > > Though I suspect the only way to get to the bottom of it will > > be to work out a reproducable test case.... > > I felt a little bothered by this issue, so I dug in a little further. > I basically created a sample mysql, tar, and it seemed that having > memory pressure helped, so I created an allocator as well. [snip test case] Nice work. I think I see the problem, and it's not something that can be easily fixed. The test-tar process is blocked in xfs_ilock_map_shared() trying to get the ip->i_lock in exclusive mode. You have a couple of IO's waiting to complete in the xfsdatad's waiting to get the ip->i_Ilock in exclusive mode in a non-blocking fashiion: schedule_timeout schedule_timeout_uninterruptible xfs_end_io worker_thread kthread kernel_thread_helper There are test-mysqld processes stuck doing page cache invalidation, waiting for IO completion to occur (which can't occur because of the above stuck IOs). These hold the ip->i_iolock in shared mode. 2882, 2887 io_schedule sync_page lock_page invalidate_inode_pages2_range generic_file_direct_write xfs_write xfs_file_aio_write do_sync_write vfs_write sys_write There's a couple of test-mysqld processes stuck on the inode->i_mutex here: 2883, 2884, 2886, 2888, 2889, 2891 __mutex_lock_common mutex_lock_nested generic_file_llseek vfs_llseek sys_lseek and here: 2890, 2892 __mutex_lock_common mutex_lock_nested xfs_write xfs_file_aio_write do_sync_write vfs_write sys_write There's a test-mysqld process stuck waiting for either the ip->i_iolock or ip->i_ilock in exclusive mode: 2885: xfs_write+0x2cc/0x793 rwsem_down_failed_common rwsem_down_write_failed call_rwsem_down_write_failed xfs_ilock xfs_write xfs_file_aio_write do_sync_write vfs_write sys_write And then there is the test-tar process, which is blocked on the ip->i_ilock trying to get it in _shared_ mode, holding the ip->i_iolock in shared mode 2897 rwsem_down_failed_common rwsem_down_read_failed call_rwsem_down_read_failed xfs_ilock xfs_ilock_map_shared xfs_iomap __xfs_get_blocks xfs_get_blocks do_mpage_readpage mpage_readpages xfs_vm_readpages __do_page_cache_readahead ra_submit ondemand_readahead page_cache_sync_readahead generic_file_aio_read xfs_read xfs_file_aio_read do_sync_read vfs_read sys_read And a sync process stuck waiting for io completion (no locks held) xfs_ioend_wait xfs_sync_inode_data xfs_inode_ag_walk xfs_inode_ag_iterator xfs_sync_data xfs_quiesce_data xfs_fs_sync_fs sync_quota_sb __sync_filesystem sync_filesystems sys_sync So in summary, we have: 1) xfsdatad sleeping for a clock tick because it can't get the ip->i_lock(EXCL) without blocking 2) 2882, 2887 waiting for IO completion, holding ip->i_iolock(SHARED) (blocked behind #1)) 3) 2885 waiting on an ip->i_iolock(EXCL), holding the i_mutex and blocked behind #2) and #5) 4) 2883, 2884, 2886, 2888, 2889, 2891, 2890, 2892 waiting on i_mutex, blocked behind #3) 5) 2897 doing buffered read, holding ip->i_iolock(SHARED), waiting on ip->i_lock(SHARED) So, this leaves me with the question - what is holding the ip->i_ilock()? Everything is blocked waiting for it and there are no reported holders, either through stack trace analysis or from the lockdep lock holder report. I said this previously: >> > I can't find a thread that holds the XFS inode lock that everything >> > is waiting on. I think it is the ILOCK, but none of the threads in >> > this trace should be holding it where they are blocked. IOWs, the >> > output does not give me enough information to get to the root cause. And my conclusion is the same from this analysis - I cannot see why everything has stopped waiting on an ILOCK that nobody should hold and lockdep is saying that nobody does actually hold. I'm starting to suspect memory corruption or something similar that is corrupting the inode lock state, but I don't hold much hope of tracking down something like that if it takes hours to reproduce. Ilia, while I try to think of the next step to take, can you try a couple of things to see if the hang can be caused faster? Maybe trying these different initial conditions: - use a smaller test file - allocate the file with worst case fragmentation by writing it backwards in synchronous 4k blocks before running the test - preallocating the test file with fallocate() Also, it woul dbe interesting to find out if a newer kernel also hangs in a similar manner, say 2.6.35? Cheers, Dave. -- Dave Chinner david@fromorbit.com From ibmirkin@gmail.com Thu Aug 5 01:42:19 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o756gJTX070349 for ; Thu, 5 Aug 2010 01:42:19 -0500 X-ASG-Debug-ID: 1280991046-46dc02cc0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-vw0-f53.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1087711CDF24 for ; Wed, 4 Aug 2010 23:50:46 -0700 (PDT) Received: from mail-vw0-f53.google.com (mail-vw0-f53.google.com [209.85.212.53]) by cuda.sgi.com with ESMTP id ymBwEeYHQeEjRdRR for ; Wed, 04 Aug 2010 23:50:46 -0700 (PDT) Received: by vws15 with SMTP id 15so4885786vws.26 for ; Wed, 04 Aug 2010 23:42:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:sender:received :in-reply-to:references:date:x-google-sender-auth:message-id:subject :from:to:cc:content-type:content-transfer-encoding; bh=wsu0V4E2yCBoN1qrtmYTZ7Jkqn1zWWEVQbSmIPyYMmM=; b=CM2yX+A4sQzm07DPzDyW1B17fe3zbiFQ3opqUOiGU96CNCHyAHEULrAFMGpEcQqCy0 3LGs1AcgONlcIniKYxosBS9m8k4sMQ7ewEIkvKWn6+8x180kaOryBhCeqDEu+FZQEXtR 8fxQYqrpGROaW6pUrfCGmbDxZwvNQd9P/h6VI= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:sender:in-reply-to:references:date :x-google-sender-auth:message-id:subject:from:to:cc:content-type :content-transfer-encoding; b=lSFHCmSjCj8JIOVoKiMMszDf/3w+jNWYZ55i2TDBvwrq3tGXMO1Dr1srkPQWE8uH7S hGlRhdGrXb9kYPVdQHL2J6vAX/WKrre1Sjzo23lWSvj+45rXCOdeNdkZog9mvEmPBatn rJpP+Nj2Ryo1hR0v1LsNLH53c89rul37ieEjg= MIME-Version: 1.0 Received: by 10.220.126.129 with SMTP id c1mr6925446vcs.214.1280990558640; Wed, 04 Aug 2010 23:42:38 -0700 (PDT) Sender: ibmirkin@gmail.com Received: by 10.220.126.196 with HTTP; Wed, 4 Aug 2010 23:42:38 -0700 (PDT) In-Reply-To: <20100805062541.GC26402@dastard> References: <20100718012033.GA18888@dastard> <20100718235036.GC32635@dastard> <20100805062541.GC26402@dastard> Date: Thu, 5 Aug 2010 02:42:38 -0400 X-Google-Sender-Auth: hmBmpxn_kjLb-LV3PT1oJUITOvU Message-ID: X-ASG-Orig-Subj: Re: XFS hung on 2.6.33.3 kernel Subject: Re: XFS hung on 2.6.33.3 kernel From: Ilia Mirkin To: Dave Chinner Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail-vw0-f53.google.com[209.85.212.53] X-Barracuda-Start-Time: 1280991047 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.37079 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Aug 5, 2010 at 2:25 AM, Dave Chinner wrote: > a couple of things to see if the hang can be caused faster? Maybe > trying these different initial conditions: Together or independently? > > =A0 =A0 =A0 =A0- use a smaller test file OK. My theory [based on no evidence] was that it had to be bigger than RAM size. I'll try less though. > =A0 =A0 =A0 =A0- allocate the file with worst case fragmentation by > =A0 =A0 =A0 =A0 =A0writing it backwards in synchronous 4k blocks before > =A0 =A0 =A0 =A0 =A0running the test I created the file with dd if=3D/dev/zero of=3D... bs=3D1M count=3D... How would I "write backwards"? Like truncate and then seek to the end, write, seek back, write, etc? Is there a utility that might do it already? > =A0 =A0 =A0 =A0- preallocating the test file with fallocate() Sure. > > Also, it woul dbe interesting to find out if a newer kernel also > hangs in a similar manner, say 2.6.35? Will do. --=20 Ilia Mirkin imirkin@alum.mit.edu From stan@hardwarefreak.com Thu Aug 5 03:31:27 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o758VRqi074537 for ; Thu, 5 Aug 2010 03:31:27 -0500 X-ASG-Debug-ID: 1280997107-5ac703b30000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 783E016A6D2A for ; Thu, 5 Aug 2010 01:31:47 -0700 (PDT) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id D6SMvevTanG2A2JJ for ; Thu, 05 Aug 2010 01:31:47 -0700 (PDT) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 40C306C014 for ; Thu, 5 Aug 2010 03:31:47 -0500 (CDT) Message-ID: <4C5A774D.6000400@hardwarefreak.com> Date: Thu, 05 Aug 2010 03:33:17 -0500 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.1.11) Gecko/20100711 Thunderbird/3.0.6 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs Subject: Re: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs References: <20100804073546.GA7494@comet.dominikbrodowski.net> <20100804085039.GA11671@infradead.org> <20100804091317.GA27779@isilmar-3.linta.de> <20100804092122.GA2998@infradead.org> <20100804073546.GA7494@comet.dominikbrodowski.net> <201008041116.09822@zmi.at> <20100804102526.GB13766@isilmar-3.linta.de> <20100804111803.GA32643@infradead.org> <20100805082438.0b476adb@notabene> In-Reply-To: <20100805082438.0b476adb@notabene> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1280997108 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.37086 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Neil Brown put forth on 8/4/2010 5:24 PM: > Both page-cache and read-ahead work at the filesystem level Are you referring to /sys/block/sdx/queue/read_ahead_kb? I'm pretty sure this works below the FS level and below the partition level. This read_ahead works at the block device level. At least for individual or JBOD. Are you saying this setting gets ignored by the kernel if/when mdadm, LVM, and/or crypto are used? -- Stan From linux@dominikbrodowski.net Thu Aug 5 04:30:51 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_56 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o759Uo2q076299 for ; Thu, 5 Aug 2010 04:30:51 -0500 X-ASG-Debug-ID: 1281000669-4bb800330000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from linta.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C83AC1E3F60C for ; Thu, 5 Aug 2010 02:31:10 -0700 (PDT) Received: from linta.de (isilmar-3.linta.de [188.40.101.200]) by cuda.sgi.com with ESMTP id ZSEzcRs8PFNKFLD3 for ; Thu, 05 Aug 2010 02:31:10 -0700 (PDT) Received: (qmail 31150 invoked from network); 5 Aug 2010 09:31:07 -0000 Received: from p54a039dc.dip.t-dialin.net (HELO comet.dominikbrodowski.net) (brodo@84.160.57.220) by isilmar-3.linta.de with (DHE-RSA-AES256-SHA encrypted) SMTP; 5 Aug 2010 09:31:07 -0000 Received: by comet.dominikbrodowski.net (Postfix, from userid 1000) id 91CF480230; Thu, 5 Aug 2010 11:31:00 +0200 (CEST) Date: Thu, 5 Aug 2010 11:31:00 +0200 From: Dominik Brodowski To: Valdis.Kletnieks@vt.edu, josef@redhat.com, chris.mason@oracle.com Cc: Michael Monnerie , Christoph Hellwig , linux-raid@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, dm-devel@redhat.com X-ASG-Orig-Subj: direct-io regression [Was: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs] Subject: direct-io regression [Was: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs] Message-ID: <20100805093100.GA3001@comet.dominikbrodowski.net> Mail-Followup-To: Dominik Brodowski , Valdis.Kletnieks@vt.edu, josef@redhat.com, chris.mason@oracle.com, Michael Monnerie , Christoph Hellwig , linux-raid@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, dm-devel@redhat.com References: <20100804073546.GA7494@comet.dominikbrodowski.net> <20100804085039.GA11671@infradead.org> <20100804091317.GA27779@isilmar-3.linta.de> <20100804092122.GA2998@infradead.org> <20100804073546.GA7494@comet.dominikbrodowski.net> <201008041116.09822@zmi.at> <20100804102526.GB13766@isilmar-3.linta.de> <15446.1280953986@localhost> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <15446.1280953986@localhost> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: isilmar-3.linta.de[188.40.101.200] X-Barracuda-Start-Time: 1281000670 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.37090 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hey, when attempting to track down insufficient I/O performance, I found the following reression relating to direct-io on my notebook, where an ata device, which consists of several partitions, is combined to a lvm volume, and one logical volume is then encrypted using dm-crypt. Test case was the following command: $ dd if=/dev/mapper/vg0-root_crypt of=/dev/zero iflag=direct bs=8k count=131072 2.6.34 results in ~16 MB/s, 2.6.35 results in ~ 3.1 MB/s The regression was bisected down to the follwoing commit: commit c2c6ca417e2db7a519e6e92c82f4a933d940d076 Author: Josef Bacik Date: Sun May 23 11:00:55 2010 -0400 direct-io: do not merge logically non-contiguous requests ... How to fix this? I do not use btrfs, but ext3 (and the access was down on the block level, not on the fs level, so this btrs-related commit should not cause such a regression). Best, Dominik From chris.mason@oracle.com Thu Aug 5 06:33:00 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_56, UNPARSEABLE_RELAY autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o75BWxcV084794 for ; Thu, 5 Aug 2010 06:33:00 -0500 X-ASG-Debug-ID: 1281008000-4bc702b40000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from rcsinet10.oracle.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DE77C1E3F7D1 for ; Thu, 5 Aug 2010 04:33:20 -0700 (PDT) Received: from rcsinet10.oracle.com (rcsinet10.oracle.com [148.87.113.121]) by cuda.sgi.com with ESMTP id a4bcAVWLXxEC0geW for ; Thu, 05 Aug 2010 04:33:20 -0700 (PDT) Received: from acsinet15.oracle.com (acsinet15.oracle.com [141.146.126.227]) by rcsinet10.oracle.com (Switch-3.4.2/Switch-3.4.2) with ESMTP id o75BX7F9023657 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 5 Aug 2010 11:33:09 GMT Received: from acsmt354.oracle.com (acsmt354.oracle.com [141.146.40.154]) by acsinet15.oracle.com (Switch-3.4.2/Switch-3.4.1) with ESMTP id o756tglE030051; Thu, 5 Aug 2010 11:33:01 GMT Received: from abhmt013.oracle.com by acsmt355.oracle.com with ESMTP id 468671041281007963; Thu, 05 Aug 2010 04:32:43 -0700 Received: from localhost (/66.66.148.185) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 05 Aug 2010 04:32:42 -0700 Date: Thu, 5 Aug 2010 07:32:40 -0400 From: Chris Mason To: Dominik Brodowski , Valdis.Kletnieks@vt.edu, josef@redhat.com, Michael Monnerie , Christoph Hellwig , linux-raid@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, dm-devel@redhat.com X-ASG-Orig-Subj: Re: direct-io regression [Was: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs] Subject: Re: direct-io regression [Was: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs] Message-ID: <20100805113240.GA29846@think> Mail-Followup-To: Chris Mason , Dominik Brodowski , Valdis.Kletnieks@vt.edu, josef@redhat.com, Michael Monnerie , Christoph Hellwig , linux-raid@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, dm-devel@redhat.com References: <20100804073546.GA7494@comet.dominikbrodowski.net> <20100804085039.GA11671@infradead.org> <20100804091317.GA27779@isilmar-3.linta.de> <20100804092122.GA2998@infradead.org> <20100804073546.GA7494@comet.dominikbrodowski.net> <201008041116.09822@zmi.at> <20100804102526.GB13766@isilmar-3.linta.de> <15446.1280953986@localhost> <20100805093100.GA3001@comet.dominikbrodowski.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100805093100.GA3001@comet.dominikbrodowski.net> User-Agent: Mutt/1.5.20 (2009-06-14) X-Source-IP: acsmt354.oracle.com [141.146.40.154] X-Auth-Type: Internal IP X-CT-RefId: str=0001.0A090209.4C5AA172.016F:SCFMA4539814,ss=1,fgs=0 X-Barracuda-Connect: rcsinet10.oracle.com[148.87.113.121] X-Barracuda-Start-Time: 1281008000 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.37097 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Aug 05, 2010 at 11:31:00AM +0200, Dominik Brodowski wrote: > Hey, > > when attempting to track down insufficient I/O performance, I found the > following reression relating to direct-io on my notebook, where an > ata device, which consists of several partitions, is combined to a lvm > volume, and one logical volume is then encrypted using dm-crypt. Test case > was the following command: > > $ dd if=/dev/mapper/vg0-root_crypt of=/dev/zero iflag=direct bs=8k count=131072 > > 2.6.34 results in ~16 MB/s, > 2.6.35 results in ~ 3.1 MB/s > > The regression was bisected down to the follwoing commit: > > commit c2c6ca417e2db7a519e6e92c82f4a933d940d076 > Author: Josef Bacik > Date: Sun May 23 11:00:55 2010 -0400 > > direct-io: do not merge logically non-contiguous requests > > ... > > How to fix this? I do not use btrfs, but ext3 (and the access was down on > the block level, not on the fs level, so this btrs-related commit should not > cause such a regression). Well, you've already bisected down to an offending if statement, that's a huge help. I'll try to reproduce this and fix it up today. But, I'm surprised your drive is doing 8K dio reads at 16MB/s, that seems a little high. -chris From josef@redhat.com Thu Aug 5 07:32:21 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_56 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o75CWK8G086789 for ; Thu, 5 Aug 2010 07:32:21 -0500 X-ASG-Debug-ID: 1281011561-761c00240000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0F36D1BEFCF8 for ; Thu, 5 Aug 2010 05:32:41 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id mEHHrUbBZhAmUobA for ; Thu, 05 Aug 2010 05:32:41 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from int-mx04.intmail.prod.int.phx2.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.17]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o75CWQvW031385 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 5 Aug 2010 08:32:26 -0400 Received: from dhcp231-156.rdu.redhat.com (dhcp231-156.rdu.redhat.com [10.11.231.156]) by int-mx04.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o75CWKxY005203; Thu, 5 Aug 2010 08:32:20 -0400 Date: Thu, 5 Aug 2010 08:36:49 -0400 From: Josef Bacik To: Chris Mason , Dominik Brodowski , Valdis.Kletnieks@vt.edu, josef@redhat.com, Michael Monnerie , Christoph Hellwig , linux-raid@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, dm-devel@redhat.com X-ASG-Orig-Subj: Re: direct-io regression [Was: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs] Subject: Re: direct-io regression [Was: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs] Message-ID: <20100805123649.GA18672@dhcp231-156.rdu.redhat.com> References: <20100804073546.GA7494@comet.dominikbrodowski.net> <20100804085039.GA11671@infradead.org> <20100804091317.GA27779@isilmar-3.linta.de> <20100804092122.GA2998@infradead.org> <20100804073546.GA7494@comet.dominikbrodowski.net> <201008041116.09822@zmi.at> <20100804102526.GB13766@isilmar-3.linta.de> <15446.1280953986@localhost> <20100805093100.GA3001@comet.dominikbrodowski.net> <20100805113240.GA29846@think> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100805113240.GA29846@think> User-Agent: Mutt/1.5.19 (2009-01-05) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.17 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1281011562 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Aug 05, 2010 at 07:32:40AM -0400, Chris Mason wrote: > On Thu, Aug 05, 2010 at 11:31:00AM +0200, Dominik Brodowski wrote: > > Hey, > > > > when attempting to track down insufficient I/O performance, I found the > > following reression relating to direct-io on my notebook, where an > > ata device, which consists of several partitions, is combined to a lvm > > volume, and one logical volume is then encrypted using dm-crypt. Test case > > was the following command: > > > > $ dd if=/dev/mapper/vg0-root_crypt of=/dev/zero iflag=direct bs=8k count=131072 > > > > 2.6.34 results in ~16 MB/s, > > 2.6.35 results in ~ 3.1 MB/s > > > > The regression was bisected down to the follwoing commit: > > > > commit c2c6ca417e2db7a519e6e92c82f4a933d940d076 > > Author: Josef Bacik > > Date: Sun May 23 11:00:55 2010 -0400 > > > > direct-io: do not merge logically non-contiguous requests > > > > ... > > > > How to fix this? I do not use btrfs, but ext3 (and the access was down on > > the block level, not on the fs level, so this btrs-related commit should not > > cause such a regression). > > Well, you've already bisected down to an offending if statement, that's > a huge help. I'll try to reproduce this and fix it up today. > > But, I'm surprised your drive is doing 8K dio reads at 16MB/s, that > seems a little high. > Hrm, I made sure there were no perf regressions when I wast testing this stuff, though I think I only tested xfs and ext4. Originally I had a test where if we provided our own submit_io, so maybe as a workaround just make if (dio->final_block_in_bio != dio->cur_page_block || cur_offset != bio_next_offset) look like this if (dio->final_block_in_bio != dio->cur_page_block || (dio->submit_io && cur_offset != bio_next_offset)) and that should limit my change to only btrfs. I know why it could cause a problem, but this change shouldn't be causing a 400% regression. I suspect something else is afoot here. Thanks, Josef From linux@dominikbrodowski.net Thu Aug 5 10:35:24 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.3 required=5.0 tests=BAYES_00,FAKE_REPLY_C, J_CHICKENPOX_56 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o75FZOQD092483 for ; Thu, 5 Aug 2010 10:35:24 -0500 X-ASG-Debug-ID: 1281023032-41c6013d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from linta.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 464A6C4F674 for ; Thu, 5 Aug 2010 08:43:52 -0700 (PDT) Received: from linta.de (isilmar-3.linta.de [188.40.101.200]) by cuda.sgi.com with ESMTP id Apxr6YE0IA1tADl2 for ; Thu, 05 Aug 2010 08:43:52 -0700 (PDT) Received: (qmail 5831 invoked from network); 5 Aug 2010 15:35:41 -0000 Received: from p54a02077.dip.t-dialin.net (HELO comet.dominikbrodowski.net) (brodo@84.160.32.119) by isilmar-3.linta.de with (DHE-RSA-AES256-SHA encrypted) SMTP; 5 Aug 2010 15:35:41 -0000 Received: by comet.dominikbrodowski.net (Postfix, from userid 1000) id EF95780232; Thu, 5 Aug 2010 17:35:19 +0200 (CEST) Date: Thu, 5 Aug 2010 17:35:19 +0200 From: Dominik Brodowski To: Chris Mason , josef@redhat.com Cc: Valdis.Kletnieks@vt.edu, Michael Monnerie , Christoph Hellwig , linux-raid@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, dm-devel@redhat.com X-ASG-Orig-Subj: Re: direct-io regression [Was: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs] Subject: Re: direct-io regression [Was: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs] Message-ID: <20100805153519.GA7242@comet.dominikbrodowski.net> Mail-Followup-To: Dominik Brodowski , Chris Mason , josef@redhat.com, Valdis.Kletnieks@vt.edu, Michael Monnerie , Christoph Hellwig , linux-raid@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, dm-devel@redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100805123649.GA18672@dhcp231-156.rdu.redhat.com> <20100805113240.GA29846@think> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: isilmar-3.linta.de[188.40.101.200] X-Barracuda-Start-Time: 1281023034 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.37115 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hey, On Thu, Aug 05, 2010 at 07:32:40AM -0400, Chris Mason wrote: > But, I'm surprised your drive is doing 8K dio reads at 16MB/s, that > seems a little high. Well, that's what it does: # $ dd if=/dev/mapper/vg0-home_crypt of=/dev/zero iflag=direct bs=8k count=131072 seek=131072 # 131072+0 records in # 131072+0 records out # 1073741824 bytes (1.1 GB) copied, 62.0177 s, 17.3 MB/s On Thu, Aug 05, 2010 at 08:36:49AM -0400, Josef Bacik wrote: > Hrm, I made sure there were no perf regressions when I wast testing this stuff, > though I think I only tested xfs and ext4. For this test, I'm not doing dio on filesystem level, but on block level (/dev/mapper/vg0-*_crypt). It seems that dm-crypt creates such offending holes, which cause this huge performance drop. > Originally I had a test where if we > provided our own submit_io, so maybe as a workaround just make > > if (dio->final_block_in_bio != dio->cur_page_block || > cur_offset != bio_next_offset) > > look like this > > if (dio->final_block_in_bio != dio->cur_page_block || > (dio->submit_io && cur_offset != bio_next_offset)) Tested-by: Dominik Brodowski With this fix, I get proper speeds when doing dio reads from /dev/mapper/vg0-*_crypt; see the 17.3 MB/s above. Most strangely, also accesing /dev/mapper/vg0-* (un-encrypted) and the raw device at /dev/sda* speeds up (to up to 28 MB/s). Was only seeing around 16 to 18 MB/s without this patch for unencrypted access. > I know why it could cause a problem, but this change shouldn't be > causing a 400% regression. Well, it seems to cause -- at least on my notebook -- a 150% regression on unencrypted LVM2 access; and this > 400% on encrypted LVM2 access... > I suspect something else is afoot here. There is, probably. But the fix you propose helps a lot, already. Thanks & best, Dominik From chris.mason@oracle.com Thu Aug 5 10:40:05 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_56, UNPARSEABLE_RELAY autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o75Fe5er092604 for ; Thu, 5 Aug 2010 10:40:05 -0500 X-ASG-Debug-ID: 1281022825-4a6701cd0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from rcsinet10.oracle.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5E7C8498CF5 for ; Thu, 5 Aug 2010 08:40:25 -0700 (PDT) Received: from rcsinet10.oracle.com (rcsinet10.oracle.com [148.87.113.121]) by cuda.sgi.com with ESMTP id LwWAFLOtOipQZQyx for ; Thu, 05 Aug 2010 08:40:25 -0700 (PDT) Received: from rcsinet15.oracle.com (rcsinet15.oracle.com [148.87.113.117]) by rcsinet10.oracle.com (Switch-3.4.2/Switch-3.4.2) with ESMTP id o75Fe5Gt018739 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 5 Aug 2010 15:40:06 GMT Received: from acsmt353.oracle.com (acsmt353.oracle.com [141.146.40.153]) by rcsinet15.oracle.com (Switch-3.4.2/Switch-3.4.1) with ESMTP id o75Fe3mv031334; Thu, 5 Aug 2010 15:40:03 GMT Received: from abhmt019.oracle.com by acsmt353.oracle.com with ESMTP id 488128011281022787; Thu, 05 Aug 2010 08:39:47 -0700 Received: from localhost (/66.66.148.185) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 05 Aug 2010 08:39:44 -0700 Date: Thu, 5 Aug 2010 11:39:43 -0400 From: Chris Mason To: Dominik Brodowski , josef@redhat.com, Valdis.Kletnieks@vt.edu, Michael Monnerie , Christoph Hellwig , linux-raid@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, dm-devel@redhat.com X-ASG-Orig-Subj: Re: direct-io regression [Was: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs] Subject: Re: direct-io regression [Was: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs] Message-ID: <20100805153943.GO29846@think> Mail-Followup-To: Chris Mason , Dominik Brodowski , josef@redhat.com, Valdis.Kletnieks@vt.edu, Michael Monnerie , Christoph Hellwig , linux-raid@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, dm-devel@redhat.com References: <20100805123649.GA18672@dhcp231-156.rdu.redhat.com> <20100805113240.GA29846@think> <20100805153519.GA7242@comet.dominikbrodowski.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100805153519.GA7242@comet.dominikbrodowski.net> User-Agent: Mutt/1.5.20 (2009-06-14) X-Source-IP: acsmt353.oracle.com [141.146.40.153] X-Auth-Type: Internal IP X-CT-RefId: str=0001.0A090201.4C5ADB55.007B:SCFMA4539814,ss=1,fgs=0 X-Barracuda-Connect: rcsinet10.oracle.com[148.87.113.121] X-Barracuda-Start-Time: 1281022826 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.37114 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Aug 05, 2010 at 05:35:19PM +0200, Dominik Brodowski wrote: > Hey, > > On Thu, Aug 05, 2010 at 07:32:40AM -0400, Chris Mason wrote: > > But, I'm surprised your drive is doing 8K dio reads at 16MB/s, that > > seems a little high. > > Well, that's what it does: > > # $ dd if=/dev/mapper/vg0-home_crypt of=/dev/zero iflag=direct bs=8k count=131072 seek=131072 > # 131072+0 records in > # 131072+0 records out > # 1073741824 bytes (1.1 GB) copied, 62.0177 s, 17.3 MB/s Can I ask you to do the test directly to the real honest to goodness drive? If it were an SSD I'd be less surprised, but then the extra submits shouldn't hurt the ssd that much either. Thanks for testing the patch, I'll send it in. -chris From linux@dominikbrodowski.net Thu Aug 5 10:53:51 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_42, J_CHICKENPOX_56 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o75Frott093102 for ; Thu, 5 Aug 2010 10:53:51 -0500 X-ASG-Debug-ID: 1281024139-41db025a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from linta.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1B7DDC4FA52 for ; Thu, 5 Aug 2010 09:02:20 -0700 (PDT) Received: from linta.de (isilmar-3.linta.de [188.40.101.200]) by cuda.sgi.com with ESMTP id dLDlEfx33oYkC0Ie for ; Thu, 05 Aug 2010 09:02:20 -0700 (PDT) Received: (qmail 9952 invoked from network); 5 Aug 2010 15:54:07 -0000 Received: from p54a02077.dip.t-dialin.net (HELO comet.dominikbrodowski.net) (brodo@84.160.32.119) by isilmar-3.linta.de with (DHE-RSA-AES256-SHA encrypted) SMTP; 5 Aug 2010 15:54:07 -0000 Received: by comet.dominikbrodowski.net (Postfix, from userid 1000) id 1958280230; Thu, 5 Aug 2010 17:53:57 +0200 (CEST) Date: Thu, 5 Aug 2010 17:53:57 +0200 From: Dominik Brodowski To: Chris Mason Cc: josef@redhat.com, Valdis.Kletnieks@vt.edu, Michael Monnerie , Christoph Hellwig , linux-raid@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, dm-devel@redhat.com X-ASG-Orig-Subj: Re: direct-io regression [Was: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs] Subject: Re: direct-io regression [Was: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs] Message-ID: <20100805155357.GA8245@comet.dominikbrodowski.net> Mail-Followup-To: Dominik Brodowski , Chris Mason , josef@redhat.com, Valdis.Kletnieks@vt.edu, Michael Monnerie , Christoph Hellwig , linux-raid@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, dm-devel@redhat.com References: <20100805123649.GA18672@dhcp231-156.rdu.redhat.com> <20100805113240.GA29846@think> <20100805153519.GA7242@comet.dominikbrodowski.net> <20100805153943.GO29846@think> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100805153943.GO29846@think> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: isilmar-3.linta.de[188.40.101.200] X-Barracuda-Start-Time: 1281024141 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.37115 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Aug 05, 2010 at 11:39:43AM -0400, Chris Mason wrote: > On Thu, Aug 05, 2010 at 05:35:19PM +0200, Dominik Brodowski wrote: > > On Thu, Aug 05, 2010 at 07:32:40AM -0400, Chris Mason wrote: > > > But, I'm surprised your drive is doing 8K dio reads at 16MB/s, that > > > seems a little high. > > > > Well, that's what it does: > > > > # $ dd if=/dev/mapper/vg0-home_crypt of=/dev/zero iflag=direct bs=8k count=131072 seek=131072 > > # 131072+0 records in > > # 131072+0 records out > > # 1073741824 bytes (1.1 GB) copied, 62.0177 s, 17.3 MB/s > > Can I ask you to do the test directly to the real honest to goodness > drive? If it were an SSD I'd be less surprised, but then the extra > submits shouldn't hurt the ssd that much either. >From lower the chain up to the device: # LANG=EN dd if=/dev/mapper/vg0-root_crypt of=/dev/zero bs=8k count=131072 seek=393300 iflag=direct 131072+0 records in 131072+0 records out 1073741824 bytes (1.1 GB) copied, 63.1217 s, 17.0 MB/s # LANG=EN dd if=/dev/mapper/vg0-root of=/dev/zero bs=8k count=131072 seek=393300 iflag=direct 131072+0 records in 131072+0 records out 1073741824 bytes (1.1 GB) copied, 43.2335 s, 24.8 MB/s # LANG=EN dd if=/dev/sda5 of=/dev/zero bs=8k count=131072 seek=393300 iflag=direct 131072+0 records in 131072+0 records out 1073741824 bytes (1.1 GB) copied, 42.0868 s, 25.5 MB/s Best, Dominik From linux@dominikbrodowski.net Thu Aug 5 11:35:06 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o75GZ6eK094317 for ; Thu, 5 Aug 2010 11:35:06 -0500 X-ASG-Debug-ID: 1281026126-4a8b03930000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from linta.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5F7C449931F for ; Thu, 5 Aug 2010 09:35:26 -0700 (PDT) Received: from linta.de (isilmar-3.linta.de [188.40.101.200]) by cuda.sgi.com with ESMTP id QHcP1AArGuD5SODv for ; Thu, 05 Aug 2010 09:35:26 -0700 (PDT) Received: (qmail 24579 invoked from network); 5 Aug 2010 16:35:25 -0000 Received: from p54a02077.dip.t-dialin.net (HELO comet.dominikbrodowski.net) (brodo@84.160.32.119) by isilmar-3.linta.de with (DHE-RSA-AES256-SHA encrypted) SMTP; 5 Aug 2010 16:35:25 -0000 Received: by comet.dominikbrodowski.net (Postfix, from userid 1000) id 1271E80230; Thu, 5 Aug 2010 18:35:20 +0200 (CEST) Date: Thu, 5 Aug 2010 18:35:19 +0200 From: Dominik Brodowski To: Chris Mason , josef@redhat.com, Valdis.Kletnieks@vt.edu, Michael Monnerie , Christoph Hellwig , linux-raid@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, dm-devel@redhat.com X-ASG-Orig-Subj: Re: direct-io regression [Was: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs] Subject: Re: direct-io regression [Was: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs] Message-ID: <20100805163519.GA6604@comet.dominikbrodowski.net> Mail-Followup-To: Dominik Brodowski , Chris Mason , josef@redhat.com, Valdis.Kletnieks@vt.edu, Michael Monnerie , Christoph Hellwig , linux-raid@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, dm-devel@redhat.com References: <20100805123649.GA18672@dhcp231-156.rdu.redhat.com> <20100805113240.GA29846@think> <20100805153519.GA7242@comet.dominikbrodowski.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100805153519.GA7242@comet.dominikbrodowski.net> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: isilmar-3.linta.de[188.40.101.200] X-Barracuda-Start-Time: 1281026127 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.37118 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Small correction: On Thu, Aug 05, 2010 at 05:35:19PM +0200, Dominik Brodowski wrote: > With this fix, I get proper speeds when doing dio reads from > /dev/mapper/vg0-*_crypt; see the 17.3 MB/s above. Most strangely, > also accesing /dev/mapper/vg0-* (un-encrypted) and the raw > device at /dev/sda* speeds up (to up to 28 MB/s). Was only seeing around > 16 to 18 MB/s without this patch for unencrypted access. The speed-up of the unencrypted access (18 -> 28 MB/s) is caused by using a different configuration for kernel 2.6.35; and seems to be unrelated to your patch. Will try to track down which config option is the culprit. kernel, dmcrypt? | good config | bad config ------------------------------------------------- patched 2.6.35, dmcrypt ~ 18 MB/s ~ 13 MB/s patched 2.6.35 ~ 28 MB/s ~ 18 MB/s ------------------------------------------------- plain 2.6.35, dmcrypt ~ 3 MB/s ~ 3 MB/s plain 2.6.35 ~ 16 MB/s Best, Dominik From jmoyer@redhat.com Thu Aug 5 13:58:41 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o75IweBF098614 for ; Thu, 5 Aug 2010 13:58:41 -0500 X-ASG-Debug-ID: 1281035230-2afc02920000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 083EFC52773 for ; Thu, 5 Aug 2010 12:07:10 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 8mHV8va0ETOLCHGa for ; Thu, 05 Aug 2010 12:07:10 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o75Iwkfk015186 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 5 Aug 2010 14:58:46 -0400 Received: from segfault.boston.devel.redhat.com (segfault.boston.devel.redhat.com [10.16.60.26]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o75IwbK9027741; Thu, 5 Aug 2010 14:58:38 -0400 From: Jeff Moyer To: Chris Mason Cc: Dominik Brodowski , Valdis.Kletnieks@vt.edu, josef@redhat.com, Michael Monnerie , Christoph Hellwig , linux-raid@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, dm-devel@redhat.com X-ASG-Orig-Subj: Re: direct-io regression [Was: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs] Subject: Re: direct-io regression [Was: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs] References: <20100804073546.GA7494@comet.dominikbrodowski.net> <20100804085039.GA11671@infradead.org> <20100804091317.GA27779@isilmar-3.linta.de> <20100804092122.GA2998@infradead.org> <20100804073546.GA7494@comet.dominikbrodowski.net> <201008041116.09822@zmi.at> <20100804102526.GB13766@isilmar-3.linta.de> <15446.1280953986@localhost> <20100805093100.GA3001@comet.dominikbrodowski.net> <20100805113240.GA29846@think> X-PGP-KeyID: 1F78E1B4 X-PGP-CertKey: F6FE 280D 8293 F72C 65FD 5A58 1FF8 A7CA 1F78 E1B4 X-PCLoadLetter: What the f**k does that mean? Date: Thu, 05 Aug 2010 14:58:37 -0400 In-Reply-To: <20100805113240.GA29846@think> (Chris Mason's message of "Thu, 5 Aug 2010 07:32:40 -0400") Message-ID: User-Agent: Gnus/5.110011 (No Gnus v0.11) Emacs/23.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1281035232 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Chris Mason writes: > But, I'm surprised your drive is doing 8K dio reads at 16MB/s, that > seems a little high. I'm not sure why you think that. We're talking about a plain old SATA disk, right? I can get 40-50MB/s on my systems for 8KB O_DIRECT reads. What am I missing? Cheers, Jeff From chris.mason@oracle.com Thu Aug 5 14:06:24 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,UNPARSEABLE_RELAY autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o75J6OOq098876 for ; Thu, 5 Aug 2010 14:06:24 -0500 X-ASG-Debug-ID: 1281035203-7da9028b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from rcsinet10.oracle.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6DDFD1E40383 for ; Thu, 5 Aug 2010 12:06:43 -0700 (PDT) Received: from rcsinet10.oracle.com (rcsinet10.oracle.com [148.87.113.121]) by cuda.sgi.com with ESMTP id VFGD2Xl3XjCNxWSH for ; Thu, 05 Aug 2010 12:06:43 -0700 (PDT) Received: from rcsinet15.oracle.com (rcsinet15.oracle.com [148.87.113.117]) by rcsinet10.oracle.com (Switch-3.4.2/Switch-3.4.2) with ESMTP id o75J6P9X004953 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 5 Aug 2010 19:06:27 GMT Received: from acsmt355.oracle.com (acsmt355.oracle.com [141.146.40.155]) by rcsinet15.oracle.com (Switch-3.4.2/Switch-3.4.1) with ESMTP id o75IwmgM011202; Thu, 5 Aug 2010 19:06:24 GMT Received: from abhmt008.oracle.com by acsmt353.oracle.com with ESMTP id 470104731281034901; Thu, 05 Aug 2010 12:01:41 -0700 Received: from localhost (/66.66.148.185) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 05 Aug 2010 12:01:40 -0700 Date: Thu, 5 Aug 2010 15:01:38 -0400 From: Chris Mason To: Jeff Moyer Cc: Dominik Brodowski , Valdis.Kletnieks@vt.edu, josef@redhat.com, Michael Monnerie , Christoph Hellwig , linux-raid@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, dm-devel@redhat.com X-ASG-Orig-Subj: Re: direct-io regression [Was: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs] Subject: Re: direct-io regression [Was: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs] Message-ID: <20100805190138.GV29846@think> Mail-Followup-To: Chris Mason , Jeff Moyer , Dominik Brodowski , Valdis.Kletnieks@vt.edu, josef@redhat.com, Michael Monnerie , Christoph Hellwig , linux-raid@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, dm-devel@redhat.com References: <20100804085039.GA11671@infradead.org> <20100804091317.GA27779@isilmar-3.linta.de> <20100804092122.GA2998@infradead.org> <20100804073546.GA7494@comet.dominikbrodowski.net> <201008041116.09822@zmi.at> <20100804102526.GB13766@isilmar-3.linta.de> <15446.1280953986@localhost> <20100805093100.GA3001@comet.dominikbrodowski.net> <20100805113240.GA29846@think> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) X-Source-IP: acsmt355.oracle.com [141.146.40.155] X-Auth-Type: Internal IP X-CT-RefId: str=0001.0A090205.4C5B0BB1.01E8:SCFMA4539814,ss=1,fgs=0 X-Barracuda-Connect: rcsinet10.oracle.com[148.87.113.121] X-Barracuda-Start-Time: 1281035204 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.37128 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Aug 05, 2010 at 02:58:37PM -0400, Jeff Moyer wrote: > Chris Mason writes: > > > But, I'm surprised your drive is doing 8K dio reads at 16MB/s, that > > seems a little high. > > I'm not sure why you think that. We're talking about a plain old SATA > disk, right? I can get 40-50MB/s on my systems for 8KB O_DIRECT reads. > What am I missing? Clearly I'm wrong, his drive is going much faster ;) I expect the smaller reads to be slower but the drive's internal cache is doing well. -chris From linux@dominikbrodowski.net Thu Aug 5 15:54:35 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_56 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o75KsYHE104159 for ; Thu, 5 Aug 2010 15:54:34 -0500 X-ASG-Debug-ID: 1281041694-3c0e01090000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from linta.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 58AF01E40A47 for ; Thu, 5 Aug 2010 13:54:54 -0700 (PDT) Received: from linta.de (isilmar-3.linta.de [188.40.101.200]) by cuda.sgi.com with ESMTP id 0cqRXy2JVxfCaEhX for ; Thu, 05 Aug 2010 13:54:54 -0700 (PDT) Received: (qmail 2692 invoked from network); 5 Aug 2010 20:54:53 -0000 Received: from p54a02077.dip.t-dialin.net (HELO comet.dominikbrodowski.net) (brodo@84.160.32.119) by isilmar-3.linta.de with (DHE-RSA-AES256-SHA encrypted) SMTP; 5 Aug 2010 20:54:53 -0000 Received: by comet.dominikbrodowski.net (Postfix, from userid 1000) id E604980230; Thu, 5 Aug 2010 22:47:49 +0200 (CEST) Date: Thu, 5 Aug 2010 22:47:49 +0200 From: Dominik Brodowski To: linux-kernel@vger.kernel.org, mingo@redhat.com, peterz@infradead.org Cc: Chris Mason , josef@redhat.com, Valdis.Kletnieks@vt.edu, Michael Monnerie , Christoph Hellwig , linux-raid@vger.kernel.org, xfs@oss.sgi.com, dm-devel@redhat.com X-ASG-Orig-Subj: Performance impact of CONFIG_DEBUG? direct-io test case Subject: Performance impact of CONFIG_DEBUG? direct-io test case Message-ID: <20100805204749.GA6318@comet.dominikbrodowski.net> Mail-Followup-To: Dominik Brodowski , linux-kernel@vger.kernel.org, mingo@redhat.com, peterz@infradead.org, Chris Mason , josef@redhat.com, Valdis.Kletnieks@vt.edu, Michael Monnerie , Christoph Hellwig , linux-raid@vger.kernel.org, xfs@oss.sgi.com, dm-devel@redhat.com References: <20100805123649.GA18672@dhcp231-156.rdu.redhat.com> <20100805113240.GA29846@think> <20100805153519.GA7242@comet.dominikbrodowski.net> <20100805163519.GA6604@comet.dominikbrodowski.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100805163519.GA6604@comet.dominikbrodowski.net> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: isilmar-3.linta.de[188.40.101.200] X-Barracuda-Start-Time: 1281041695 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.37136 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean How large is the performance impact of CONFIG_DEBUG? Well, for the test workload I've been working with lately, dd if= of=/dev/zero bs=8k count=100000 iflag=direct where is a dm-crypted LVM volume consisting of several partitions on a notebook pata harddisk, I get the following results: 1) best results are ~ 28 MB/s 2) Enabling CONFIG_DEBUG_LOCK_ALLOC, which also means CONFIG_LOCKDEP being enabled, causes the transfer rate to decrease by ~ 1.2 MB/s 3) Enabling CONFIG_DEBUG_SPINLOCK && CONFIG_DEBUG_MUTEXTES or CONFIG_DEBUG_SPINLOCK_SLEEP=y costs about ~ 0.4 MB/s each 4) Enabling all of the following options: CONFIG_DEBUG_RT_MUTEXES CONFIG_DEBUG_PI_LIST CONFIG_PROVE_LOCKING CONFIG_LOCK_STAT CONFIG_DEBUG_LOCKDEP costs another ~ 5 MB/s. So, for this test case, the performance impact of (some) CONFIG_DEBUG options is highly significant, here by about 25 %. Best, Dominik From linux@dominikbrodowski.net Thu Aug 5 15:54:34 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_56 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o75KsYmk104158 for ; Thu, 5 Aug 2010 15:54:34 -0500 X-ASG-Debug-ID: 1281041694-4ec2003d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from linta.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8D85E1E40A49 for ; Thu, 5 Aug 2010 13:54:54 -0700 (PDT) Received: from linta.de (isilmar-3.linta.de [188.40.101.200]) by cuda.sgi.com with ESMTP id QDHksjO6vZUllQZq for ; Thu, 05 Aug 2010 13:54:54 -0700 (PDT) Received: (qmail 2706 invoked from network); 5 Aug 2010 20:54:54 -0000 Received: from p54a02077.dip.t-dialin.net (HELO comet.dominikbrodowski.net) (brodo@84.160.32.119) by isilmar-3.linta.de with (DHE-RSA-AES256-SHA encrypted) SMTP; 5 Aug 2010 20:54:53 -0000 Received: by comet.dominikbrodowski.net (Postfix, from userid 1000) id 39FA180232; Thu, 5 Aug 2010 22:54:48 +0200 (CEST) Date: Thu, 5 Aug 2010 22:54:48 +0200 From: Dominik Brodowski To: linux-kernel@vger.kernel.org, mingo@redhat.com, peterz@infradead.org Cc: Chris Mason , josef@redhat.com, Valdis.Kletnieks@vt.edu, Michael Monnerie , Christoph Hellwig , linux-raid@vger.kernel.org, xfs@oss.sgi.com, dm-devel@redhat.com X-ASG-Orig-Subj: Performance impact of CONFIG_SCHED_MC? direct-io test case Subject: Performance impact of CONFIG_SCHED_MC? direct-io test case Message-ID: <20100805205448.GB6318@comet.dominikbrodowski.net> Mail-Followup-To: Dominik Brodowski , linux-kernel@vger.kernel.org, mingo@redhat.com, peterz@infradead.org, Chris Mason , josef@redhat.com, Valdis.Kletnieks@vt.edu, Michael Monnerie , Christoph Hellwig , linux-raid@vger.kernel.org, xfs@oss.sgi.com, dm-devel@redhat.com References: <20100805123649.GA18672@dhcp231-156.rdu.redhat.com> <20100805113240.GA29846@think> <20100805153519.GA7242@comet.dominikbrodowski.net> <20100805163519.GA6604@comet.dominikbrodowski.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100805163519.GA6604@comet.dominikbrodowski.net> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: isilmar-3.linta.de[188.40.101.200] X-Barracuda-Start-Time: 1281041695 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.37136 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean How large is the performance impact of CONFIG_SCHED_MC -- for which there is a warning that it comes "at a cost of slightly increased overhead in some places."? Well, for the test workload I've been working with lately, dd if= of=/dev/zero bs=8k count=100000 iflag=direct where is a dm-crypted LVM volume consisting of several partitions on a notebook pata harddisk, and all this runs on a Core2 Duo, I get a ~ 10 % performance reduction if CONFIG_SCHED_MC is enabled. Combined with the CONFIG_DEBUG performance reduction mentioned in the other message, all of the reduction from 28 MB/s to 18 MB/s is explained for. Best, Dominik PS: Ingo: you got both mingo@elte.hu and mingo@redhat.com in MAINTAINERS, I suppose both are valid? From SRS0+bxCo+67+fromorbit.com=dave@internode.on.net Thu Aug 5 20:18:26 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_62, J_CHICKENPOX_64 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o761IQN8112744 for ; Thu, 5 Aug 2010 20:18:26 -0500 X-ASG-Debug-ID: 1281057524-1563028c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id BE12D16AE847 for ; Thu, 5 Aug 2010 18:18:45 -0700 (PDT) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id aF1V3ndgBtD7AG68 for ; Thu, 05 Aug 2010 18:18:45 -0700 (PDT) Received: from dastard (unverified [121.44.216.100]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 34203320-1927428 for ; Fri, 06 Aug 2010 10:48:44 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OhBa4-0003on-SU for xfs@oss.sgi.com; Fri, 06 Aug 2010 11:18:40 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OhBa3-0006RK-7w for xfs@oss.sgi.com; Fri, 06 Aug 2010 11:18:39 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfstests: fix NIS detection damage Subject: [PATCH] xfstests: fix NIS detection damage Date: Fri, 6 Aug 2010 11:18:39 +1000 Message-Id: <1281057519-24730-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1281057526 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.37152 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner NIS detection wasn't tested on machines without NIS enabled, so many tests are failing on non-NIS machines. the _yp_active function has no specific return value so always evaluates as 0 (active) and the "_cat_passwd" function is called from within an awk script which is not valid as the shell may run with a sanitised environment. Hence the functions do not need specific export calls, either, as unsanitised subshells will automatically inherit the parent's environment. Signed-off-by: Dave Chinner --- common.attr | 9 +++++++-- common.rc | 6 +++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/common.attr b/common.attr index 51616bc..6ba0b32 100644 --- a/common.attr +++ b/common.attr @@ -90,10 +90,14 @@ _create_n_aces() # _filter_aces() { - $AWK_PROG ' + tmp_file=`mktemp /tmp/ace.XXXXXX` + + (_cat_passwd; _cat_group) > $tmp_file + + $AWK_PROG -v tmpfile=$tmp_file ' BEGIN { FS=":" - while ( "_cat_passwd" | getline > 0 ) { + while ( getline 0 ) { idlist[$1] = $3 } } @@ -102,6 +106,7 @@ _filter_aces() /^default:user/ { if ($3 in idlist) sub($3, idlist[$3]); print; next} {print} ' + rm -f $tmp_file } _filter_aces_notypes() diff --git a/common.rc b/common.rc index e0cdfe6..08d4f71 100644 --- a/common.rc +++ b/common.rc @@ -800,13 +800,14 @@ _yp_active() local dn dn=$(domainname 2>/dev/null) test -n "${dn}" -a "${dn}" != "(none)" + echo $? } # cat the password file # _cat_passwd() { - [ _yp_active ] && ypcat passwd + [ $(_yp_active) -eq 0 ] && ypcat passwd cat /etc/passwd } @@ -814,10 +815,9 @@ _cat_passwd() # _cat_group() { - [ _yp_active ] && ypcat group + [ $(_yp_active) -eq 0 ] && ypcat group cat /etc/group } -export -f _yp_active _cat_passwd _cat_group # check for the fsgqa user on the machine # -- 1.7.1 From BATV+5ad17299b6ca7d028f88+2539+infradead.org+hch@bombadil.srs.infradead.org Fri Aug 6 08:00:48 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o76D0k7J140954 for ; Fri, 6 Aug 2010 08:00:48 -0500 X-ASG-Debug-ID: 1281099668-4a9702210000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E2795F67B1B for ; Fri, 6 Aug 2010 06:01:08 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id lMY4vXejcnDpMsy5 for ; Fri, 06 Aug 2010 06:01:08 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OhMXq-0005LB-Mn; Fri, 06 Aug 2010 13:01:06 +0000 Date: Fri, 6 Aug 2010 09:01:06 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com, npiggin@kernel.de X-ASG-Orig-Subj: Re: [PATCH] xfs: Reduce log force overhead for delayed logging Subject: Re: [PATCH] xfs: Reduce log force overhead for delayed logging Message-ID: <20100806130106.GA16818@infradead.org> References: <1280801234-23568-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1280801234-23568-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-08-17) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1281099668 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Looks good to me, Reviewed-by: Christoph Hellwig minor nitpicks below: > int > xlog_cil_push( This can be marked STATIC now. > +/* > + * CIL force routines > + */ > +xfs_lsn_t xlog_cil_force_lsn(struct log *log, xfs_lsn_t sequence); > + > +static inline void > +xlog_cil_force(struct log *log) > +{ > + if (log->l_cilp) > + xlog_cil_force_lsn(log, log->l_cilp->xc_current_sequence); > +} I'd move the if (log->l_cilp) check to the caller. One of the two already does so, as does the caller of xlog_cil_force_lsn. From BATV+5ad17299b6ca7d028f88+2539+infradead.org+hch@bombadil.srs.infradead.org Fri Aug 6 08:02:33 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_FRT_FREE autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o76D2XSv141052 for ; Fri, 6 Aug 2010 08:02:33 -0500 X-ASG-Debug-ID: 1281099775-4a9502380000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5B1261D70D58; Fri, 6 Aug 2010 06:02:55 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id Zfh49qAq6YJG7Se8; Fri, 06 Aug 2010 06:02:55 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OhMZZ-0005kU-WD; Fri, 06 Aug 2010 13:02:54 +0000 Date: Fri, 6 Aug 2010 09:02:53 -0400 From: Christoph Hellwig To: Stuart Brodsky Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH v3] xfs: ensure f_ffree returned by statfs() is non-negative Subject: Re: [PATCH v3] xfs: ensure f_ffree returned by statfs() is non-negative Message-ID: <20100806130253.GB16818@infradead.org> References: <1280931359.12084.2519.camel@superior.americas.sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1280931359.12084.2519.camel@superior.americas.sgi.com> User-Agent: Mutt/1.5.20 (2009-08-17) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1281099775 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Good changelog this time around, thanks. > - statp->f_ffree = statp->f_files - (sbp->sb_icount - > sbp->sb_ifree); Your mailer line-wrapper the patch here. > + ffree = statp->f_files - (sbp->sb_icount - sbp->sb_ifree); > + statp->f_ffree = (__u64) (ffree < 0 ? 0 : ffree); Why not just use min_t here? statp->f_ffree = max_t(__int64_t, ffree, 0); From BATV+5ad17299b6ca7d028f88+2539+infradead.org+hch@bombadil.srs.infradead.org Fri Aug 6 08:03:12 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o76D3CnG141099 for ; Fri, 6 Aug 2010 08:03:12 -0500 X-ASG-Debug-ID: 1281099814-48ae02cb0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9148D49C587 for ; Fri, 6 Aug 2010 06:03:34 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id qaFgvaOgXq94Lbgd for ; Fri, 06 Aug 2010 06:03:34 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OhMaE-00062B-8Q; Fri, 06 Aug 2010 13:03:34 +0000 Date: Fri, 6 Aug 2010 09:03:34 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfstests: fix NIS detection damage Subject: Re: [PATCH] xfstests: fix NIS detection damage Message-ID: <20100806130334.GC16818@infradead.org> References: <1281057519-24730-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1281057519-24730-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-08-17) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1281099814 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, Aug 06, 2010 at 11:18:39AM +1000, Dave Chinner wrote: > From: Dave Chinner > > NIS detection wasn't tested on machines without NIS enabled, so many tests are > failing on non-NIS machines. the _yp_active function has no specific return > value so always evaluates as 0 (active) and the "_cat_passwd" function is > called from within an awk script which is not valid as the shell may run with a > sanitised environment. Hence the functions do not need specific export calls, > either, as unsanitised subshells will automatically inherit the parent's > environment. > > Signed-off-by: Dave Chinner Looks good, Reviewed-by: Christoph Hellwig From SRS0+JBZb+68+fromorbit.com=david@internode.on.net Sat Aug 7 05:08:04 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_28, J_CHICKENPOX_47 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o77A84Pd192929 for ; Sat, 7 Aug 2010 05:08:04 -0500 X-ASG-Debug-ID: 1281175704-48c801120000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DBDEE16C4101 for ; Sat, 7 Aug 2010 03:08:24 -0700 (PDT) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id WjmLDeXAHhV1IrsT for ; Sat, 07 Aug 2010 03:08:24 -0700 (PDT) Received: from dastard (unverified [121.44.216.100]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 34640032-1927428 for multiple; Sat, 07 Aug 2010 19:38:23 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OhgKD-00068e-L0; Sat, 07 Aug 2010 20:08:21 +1000 Date: Sat, 7 Aug 2010 20:08:21 +1000 From: Dave Chinner To: Ilia Mirkin Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS hung on 2.6.33.3 kernel Subject: Re: XFS hung on 2.6.33.3 kernel Message-ID: <20100807100821.GC7362@dastard> References: <20100718012033.GA18888@dastard> <20100718235036.GC32635@dastard> <20100805062541.GC26402@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1281175705 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.37284 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Aug 05, 2010 at 02:42:38AM -0400, Ilia Mirkin wrote: > On Thu, Aug 5, 2010 at 2:25 AM, Dave Chinner wrote: > > a couple of things to see if the hang can be caused faster? Maybe > > trying these different initial conditions: > > Together or independently? independently first - then if that does't work, maybe together? > >        - allocate the file with worst case fragmentation by > >          writing it backwards in synchronous 4k blocks before > >          running the test > > I created the file with > > dd if=/dev/zero of=... bs=1M count=... > > How would I "write backwards"? Like truncate and then seek to the end, > write, seek back, write, etc? Is there a utility that might do it > already? For a 1GB file: $ for i in `seq 256000 1 0`; do > dd if=/dev/zero of=testfile bs=4k count=1 seek=$i conv=notrunc,sync > done Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+3NQj+68+fromorbit.com=david@internode.on.net Sat Aug 7 05:13:31 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o77ADVrW193170 for ; Sat, 7 Aug 2010 05:13:31 -0500 X-ASG-Debug-ID: 1281176031-6fa602960000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8190149F79F for ; Sat, 7 Aug 2010 03:13:52 -0700 (PDT) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id jn9ILX9FggwIjGmK for ; Sat, 07 Aug 2010 03:13:52 -0700 (PDT) Received: from dastard (unverified [121.44.216.100]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 34350689-1927428 for multiple; Sat, 07 Aug 2010 19:43:51 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OhgPV-000694-IO; Sat, 07 Aug 2010 20:13:49 +1000 Date: Sat, 7 Aug 2010 20:13:49 +1000 From: Dave Chinner To: Stan Hoeppner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs Subject: Re: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs Message-ID: <20100807101349.GD7362@dastard> References: <20100804085039.GA11671@infradead.org> <20100804091317.GA27779@isilmar-3.linta.de> <20100804092122.GA2998@infradead.org> <20100804073546.GA7494@comet.dominikbrodowski.net> <201008041116.09822@zmi.at> <20100804102526.GB13766@isilmar-3.linta.de> <20100804111803.GA32643@infradead.org> <20100805082438.0b476adb@notabene> <4C5A774D.6000400@hardwarefreak.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4C5A774D.6000400@hardwarefreak.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1281176033 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.37284 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Aug 05, 2010 at 03:33:17AM -0500, Stan Hoeppner wrote: > Neil Brown put forth on 8/4/2010 5:24 PM: > > > Both page-cache and read-ahead work at the filesystem level > > Are you referring to /sys/block/sdx/queue/read_ahead_kb? I'm pretty sure this > works below the FS level and below the partition level. This read_ahead works > at the block device level. At least for individual or JBOD. That number is used to initialise the default readahead value for any file descriptor opened on the filesystem. readahead is tracked per-fd at the page cache level, so is effectively at the filesystem level, not the block device. > Are you saying this setting gets ignored by the kernel if/when mdadm, LVM, > and/or crypto are used? Only the value from the block device the filesystem sits on is used. i.e. if you are using /dev/md0, then the filesystem uses the value from /sys/block/md0/queue/read_ahead_kb and ignores all the ones set on the /dev/sdX devices that make up /dev/md0. Cheers, Dave. -- Dave Chinner david@fromorbit.com From seo@orangewebtech.com Sat Aug 7 06:55:00 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.8 required=5.0 tests=BAYES_50,FROM_EXCESS_BASE64 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o77Bt0nN196629 for ; Sat, 7 Aug 2010 06:55:00 -0500 X-ASG-Debug-ID: 1281182620-22f702ad0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-ww0-f51.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 154BF12C1D19 for ; Sat, 7 Aug 2010 05:03:40 -0700 (PDT) Received: from mail-ww0-f51.google.com (mail-ww0-f51.google.com [74.125.82.51]) by cuda.sgi.com with ESMTP id KCjDv1CJgpKk9LAQ for ; Sat, 07 Aug 2010 05:03:40 -0700 (PDT) Received: by wwb17 with SMTP id 17so5715391wwb.32 for ; Sat, 07 Aug 2010 04:55:20 -0700 (PDT) Received: by 10.227.136.146 with SMTP id r18mr11232651wbt.53.1281175339268; Sat, 07 Aug 2010 03:02:19 -0700 (PDT) Received: from Ankur-PC ([122.170.40.102]) by mx.google.com with ESMTPS id e31sm2220633wbe.5.2010.08.07.03.02.17 (version=TLSv1/SSLv3 cipher=RC4-MD5); Sat, 07 Aug 2010 03:02:19 -0700 (PDT) From: "=?utf-8?B?V2VibWFzdGVyIE9yYW5nZVRlY2hub2xhYg==?=" To: xfs@oss.sgi.com X-ASG-Orig-Subj: =?utf-8?B?cGFydG5lcnNoaXAgaXNzdWU=?= Subject: =?utf-8?B?cGFydG5lcnNoaXAgaXNzdWU=?= Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Date: Sat, 7 Aug 2010 15:29:57 +0530 Message-ID: <20100807095957028.28001CBD492037AB@Ankur-PC> X-Mailer: Web CEO 8.1.0.3903 X-Barracuda-Connect: mail-ww0-f51.google.com[74.125.82.51] X-Barracuda-Start-Time: 1281182621 X-Barracuda-Bayes: INNOCENT GLOBAL 0.1101 1.0000 -1.3324 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.27 X-Barracuda-Spam-Status: No, SCORE=-0.27 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=FROM_EXCESS_BASE64, FROM_EXCESS_BASE64_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.37289 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 FROM_EXCESS_BASE64 From: base64 encoded unnecessarily 1.05 FROM_EXCESS_BASE64_2 From: base64 encoded unnecessarily X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean SGVsbG8sDQpJIGhhdmUgZm91bmQgeW91ciB3ZWJzaXRlIG9zcy5zZ2kuY29tIHdoZW4gc2VhcmNo aW5nIHRoZSB3ZWIgb24gdGhlIHRvcGljcyByZWxhdGVkIHRvIG15IHdlYnNpdGUgdGhlbWUuDQpJ IG11c3Qgc2F5IHlvdXIgc2l0ZSBjb250ZW50IGlzIHZlcnkgZ29vZCBhbmQgSSB0aGluayB3ZSB3 b3VsZCBiZW5lZml0IG11Y2ggZnJvbSBwb3NzaWJsZSBwYXJ0bmVyc2hpcCAtIGZvciBleGFtcGxl IGxpbmsgZXhjaGFuZ2UuIFRoaXMgd291bGQgYnJpbmcgbW9yZSB0YXJnZXRlZCB0cmFmZmljIHRv IG91ciBzaXRlcywgcGx1cyBpbmNyZWFzZSBvdXIgd2Vic2l0ZXMnIHdlaWdodCBhdCB0aGUgc2Vh cmNoIGVuZ2luZXMsIGFzIHRoZXkgZ2l2ZSBncmVhdGVyIHZhbHVlIHRvIHRoZSBsaW5rcyBmcm9t IHRoZSB0b3BpYy1yZWxhdGVkIHNpdGVzIHJhdGhlciB0aGFuIGlycmVsZXZhbnQgYmFja2xpbmtz Lg0KTXkgd2Vic2l0ZSBodHRwOi8vd3d3Lm9yYW5nZXRlY2hub2xhYi5jb20vIGlzIGRlZmluaXRl bHkgcmVsYXRlZCB0byB5b3Vycy4NCkkgd291bGQgYmUgZ2xhZCB0byBsaW5rIHRvIHlvdXIgc2l0 ZSBpbiByZXR1cm4gdG8geW91IGxpbmtpbmcgYmFjayB0byBtaW5lLg0KRmVlbCBmcmVlIHRvIGVt YWlsIG1lIGRpcmVjdCB0byBzZW9Ab3Jhbmdld2VidGVjaC5jb20gdG8gZGlzY3VzcyB0aGUgZGV0 YWlscyBvbiB0aGUgcG9zc2libGUgcGFydG5lcnNoaXAuDQoNCkhvcGUgZm9yIHRoZSBmcnVpdGZ1 bCBjb29wZXJhdGlvbiwNCg0KQmVzdCByZWdhcmRzLA0KV2VibWFzdGVyIE9yYW5nZVRlY2hub2xh YiwNCmh0dHA6Ly93d3cub3JhbmdldGVjaG5vbGFiLmNvbS8NCg== From stan@hardwarefreak.com Sat Aug 7 18:40:04 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o77Ne4FC220636 for ; Sat, 7 Aug 2010 18:40:04 -0500 X-ASG-Debug-ID: 1281224926-6a9e03540000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C63DCC6869D for ; Sat, 7 Aug 2010 16:48:46 -0700 (PDT) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id SkmOzXYbK0G5FykX for ; Sat, 07 Aug 2010 16:48:46 -0700 (PDT) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id EA8026C33C for ; Sat, 7 Aug 2010 18:40:23 -0500 (CDT) Message-ID: <4C5DEFA1.4010506@hardwarefreak.com> Date: Sat, 07 Aug 2010 18:43:29 -0500 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.1.11) Gecko/20100711 Thunderbird/3.0.6 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs Subject: Re: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs References: <20100804085039.GA11671@infradead.org> <20100804091317.GA27779@isilmar-3.linta.de> <20100804092122.GA2998@infradead.org> <20100804073546.GA7494@comet.dominikbrodowski.net> <201008041116.09822@zmi.at> <20100804102526.GB13766@isilmar-3.linta.de> <20100804111803.GA32643@infradead.org> <20100805082438.0b476adb@notabene> <4C5A774D.6000400@hardwarefreak.com> <20100807101349.GD7362@dastard> In-Reply-To: <20100807101349.GD7362@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1281224928 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0209 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.37339 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Dave Chinner put forth on 8/7/2010 5:13 AM: > On Thu, Aug 05, 2010 at 03:33:17AM -0500, Stan Hoeppner wrote: >> Neil Brown put forth on 8/4/2010 5:24 PM: >> >>> Both page-cache and read-ahead work at the filesystem level >> >> Are you referring to /sys/block/sdx/queue/read_ahead_kb? I'm pretty sure this >> works below the FS level and below the partition level. This read_ahead works >> at the block device level. At least for individual or JBOD. > > That number is used to initialise the default readahead value for > any file descriptor opened on the filesystem. readahead is tracked > per-fd at the page cache level, so is effectively at the filesystem > level, not the block device. > >> Are you saying this setting gets ignored by the kernel if/when mdadm, LVM, >> and/or crypto are used? > > Only the value from the block device the filesystem sits on is used. > i.e. if you are using /dev/md0, then the filesystem uses the value > from /sys/block/md0/queue/read_ahead_kb and ignores all the ones set > on the /dev/sdX devices that make up /dev/md0. Thanks for the clarification/education Dave. -- Stan From michael.monnerie@is.it-management.at Sun Aug 8 02:46:40 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o787kead242465 for ; Sun, 8 Aug 2010 02:46:40 -0500 X-ASG-Debug-ID: 1281253619-09eb03600000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv14.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2D7B0D76721 for ; Sun, 8 Aug 2010 00:47:00 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id kADZHkndxDaxO9K7 for ; Sun, 08 Aug 2010 00:47:00 -0700 (PDT) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv14.zmi.at (Postfix) with ESMTPSA id 8977D17E; Sun, 8 Aug 2010 09:46:58 +0200 (CEST) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id 3F04C47EA07; Sun, 8 Aug 2010 09:46:58 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs Subject: Re: How to track down abysmal performance ata - raid1 - crypto - vg/lv - xfs Date: Sun, 8 Aug 2010 09:46:53 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.35-zmi; KDE/4.3.5; x86_64; ; ) References: <20100804085039.GA11671@infradead.org> <4C5A774D.6000400@hardwarefreak.com> <20100807101349.GD7362@dastard> In-Reply-To: <20100807101349.GD7362@dastard> Cc: Dave Chinner MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart4150250.H0cggjMXBm"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201008080946.57635@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1281253621 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.37370 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart4150250.H0cggjMXBm Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable On Samstag, 7. August 2010 Dave Chinner wrote: > > Are you referring to /sys/block/sdx/queue/read_ahead_kb? I'm > > pretty sure this works below the FS level and below the partition > > level. This read_ahead works at the block device level. At least > > for individual or JBOD. >=20 > That number is used to initialise the default readahead value for > any file descriptor opened on the filesystem. readahead is tracked > per-fd at the page cache level, so is effectively at the filesystem > level, not the block device. >=20 > > Are you saying this setting gets ignored by the kernel if/when > > mdadm, LVM, and/or crypto are used? >=20 > Only the value from the block device the filesystem sits on is used. > i.e. if you are using /dev/md0, then the filesystem uses the value > from /sys/block/md0/queue/read_ahead_kb and ignores all the ones set > on the /dev/sdX devices that make up /dev/md0. =20 That would be a wonderful piece of documentation belonging to=20 Documentation/sysctl/fs.txt or vm.txt, and /sbin/sysctl should not only=20 change /proc/sys values, but also /sys entries. Such performance knobs are very poorly documented, but would be an=20 important bit for administrators to tune systems for their needs. This=20 is something that's really missing in Linux. =2D-=20 mit freundlichen Gr=FCssen, Michael Monnerie, Ing. BSc it-management Internet Services http://proteger.at [gesprochen: Prot-e-schee] Tel: 0660 / 415 65 31 ****** Aktuelles Radiointerview! ****** http://www.it-podcast.at/aktuelle-sendung.html // Wir haben im Moment zwei H=E4user zu verkaufen: // http://zmi.at/langegg/ // http://zmi.at/haus2009/ --nextPart4150250.H0cggjMXBm Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.12 (GNU/Linux) iEYEABECAAYFAkxeYPEACgkQzhSR9xwSCbTtcACg2gg83JJO+lbH3KLkgJ4fDXlU DdIAnAkrxrZk2tQe3iQ1GfstSe1GxLez =7Hw6 -----END PGP SIGNATURE----- --nextPart4150250.H0cggjMXBm-- From elopez@dciphi.uhu.es Sun Aug 8 03:29:48 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.0 required=5.0 tests=BAYES_95 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o788TktJ243668 for ; Sun, 8 Aug 2010 03:29:47 -0500 X-ASG-Debug-ID: 1281256711-6ef601440000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ironport.uhu.es (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0AFACC68D15 for ; Sun, 8 Aug 2010 01:38:31 -0700 (PDT) Received: from ironport.uhu.es (relay.uhu.es [150.214.167.14]) by cuda.sgi.com with ESMTP id xrhVNaYewIhBakJb for ; Sun, 08 Aug 2010 01:38:31 -0700 (PDT) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AuoEAI4i50vAqAM0/2dsb2JhbACRVo0vu1mCaoIrBA X-IronPort-AV: E=Sophos;i="4.55,337,1278280800"; d="scan'208";a="13684115" Received: from sirio2.uhu.es (HELO sirio02) ([192.168.3.52]) by relay.uhu.es with ESMTP; 08 Aug 2010 10:30:07 +0200 Received: from [127.0.0.1] (helo=correo.uhu.es) by sirio02 with esmtp (Exim 4.50) id 1Oi0Gu-0006ZX-69; Sun, 08 Aug 2010 09:26:16 +0200 Received: from 201.245.175.172 (proxying for 93.186.164.42) (SquirrelMail authenticated user elopez) by correo.uhu.es with HTTP; Sun, 8 Aug 2010 09:26:16 +0200 (CEST) Message-ID: <52206.201.245.175.172.1281252376.squirrel@correo.uhu.es> Date: Sun, 8 Aug 2010 09:26:16 +0200 (CEST) X-ASG-Orig-Subj: WEBMASTER Subject: WEBMASTER From: "UPDATE" To: info@webmaster.de User-Agent: SquirrelMail/1.4.4 MIME-Version: 1.0 Content-Type: text/plain;charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Priority: 3 (Normal) Importance: Normal X-Barracuda-Connect: relay.uhu.es[150.214.167.14] X-Barracuda-Start-Time: 1281256713 X-Barracuda-Bayes: INNOCENT GLOBAL 0.3172 1.0000 -0.2769 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.28 X-Barracuda-Spam-Status: No, SCORE=-0.28 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.37375 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Ihre Webmail-Quote hat die Menge, die Quote 5GB überschritten wird. Sie sind derzeit auf 4.8GB. Um wieder zu aktivieren und steigern Sie Ihre Webmail-Quote klicken Sie bitte auf den untenstehenden Link. http://www.emailmeform.com/builder/form/4rdt04L8X6bUb8 Andernfalls kann die Löschung Ihrer Webmail-Accounts führen. Vielen Dank und sorry für die Unannehmlichkeiten Localhost From mayang8025@gmail.com Sun Aug 8 05:07:34 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.9 required=5.0 tests=BAYES_50,FREEMAIL_FROM, J_CHICKENPOX_72,SUBJ_CONGRATULATION,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o78A7Xar246212 for ; Sun, 8 Aug 2010 05:07:34 -0500 X-ASG-Debug-ID: 1281262580-6f0c03c20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-pw0-f53.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 07B2AC6939F for ; Sun, 8 Aug 2010 03:16:20 -0700 (PDT) Received: from mail-pw0-f53.google.com (mail-pw0-f53.google.com [209.85.160.53]) by cuda.sgi.com with ESMTP id FpeConMwN0dXyQZv for ; Sun, 08 Aug 2010 03:16:20 -0700 (PDT) Received: by pwj2 with SMTP id 2so1608064pwj.26 for ; Sun, 08 Aug 2010 03:07:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:date:to:from:reply-to:subject :message-id:x-priority:x-mailer:mime-version :content-transfer-encoding:content-type; bh=9PiKwUfceKtVoJmAY41t9TM2/E82CSJzLFKGSmQXRdE=; b=I6UCsxJEO/V+WtOg9dlyH+bNv0Znue2L1hl9wwLtJiO2a9MLFveVMTIKr5EWKEQyNU OUQoGFVEE2ITh2/BEHSEuTHipYOGAHvYK4KnfiZZvsHW6MfNiblYlCB3KwEH8ABTczyW KTV4Qecz2k3FQkbO9GxAqNa8h3weTqORh78S4= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=date:to:from:reply-to:subject:message-id:x-priority:x-mailer :mime-version:content-transfer-encoding:content-type; b=UUsIt2MbTB4AB1CehbnSx31pwEDbv6SbBPP+iQ83kIrW2/s2AMdQHF9hxGNUJNwNFm y8Qa8brclqwbC8m/Rgh/hczMqYvKUSRgZqVdAR+lS32j22mOnE29uU3tpUOh8OUhjEz3 9/GJtmk1DQVZiuKaa+b5oxVAhjP29CZyASVXk= Received: by 10.142.48.4 with SMTP id v4mr12333625wfv.85.1281255927654; Sun, 08 Aug 2010 01:25:27 -0700 (PDT) Received: from 192.168.1.10 ([112.198.229.193]) by mx.google.com with ESMTPS id z1sm4595728wfd.15.2010.08.08.01.25.25 (version=SSLv3 cipher=RC4-MD5); Sun, 08 Aug 2010 01:25:26 -0700 (PDT) Date: Sun, 8 Aug 2010 08:25:20 +0000 To: name From: Reply-To: X-ASG-Orig-Subj: Congratulations, your commission is coming Subject: Congratulations, your commission is coming Message-ID: <04a887bd4cb36672c077cebd1b1eaf51@192.168.1.10> X-Priority: 3 X-Mailer: PHPMailer [version 1.72] MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="iso-8859-1" X-Barracuda-Connect: mail-pw0-f53.google.com[209.85.160.53] X-Barracuda-Start-Time: 1281262581 X-Barracuda-Bayes: INNOCENT GLOBAL 0.5203 1.0000 0.7500 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.75 X-Barracuda-Spam-Status: No, SCORE=0.75 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=DKIM_SIGNED, DKIM_VERIFIED, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.37381 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hello- To claim your commission, click this link ASAP. http://www.rpahomebiz.co.cc/s.php?un=rpa1&e=xfs@oss.sgi.com Sincerely, George Mason 5195 N Lake Shore Drive Chicago,IL 60657 USA Removal link: Click Below to unsubscribed http://www.rpahomebiz.co.cc/u.php?un=rpa1&e=xfs@oss.sgi.com From mckern_juq@yahoo.com.vn Tue Aug 10 00:31:44 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.3 required=5.0 tests=BAYES_99,FREEMAIL_FROM, MIME_8BIT_HEADER,T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL,UNPARSEABLE_RELAY autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o7A5ViLx073613 for ; Tue, 10 Aug 2010 00:31:44 -0500 X-ASG-Debug-ID: 1281418324-46ff00d50000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp117.mail.sg1.yahoo.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id A271316D45CE for ; Mon, 9 Aug 2010 22:32:05 -0700 (PDT) Received: from smtp117.mail.sg1.yahoo.com (smtp117.mail.sg1.yahoo.com [124.108.123.216]) by cuda.sgi.com with SMTP id 3T1ecdwEvkzFmGCP for ; Mon, 09 Aug 2010 22:32:05 -0700 (PDT) Received: (qmail 68817 invoked from network); 10 Aug 2010 05:32:03 -0000 DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.com.vn; h=DKIM-Signature:Message-ID:Received:X-Yahoo-SMTP:X-YMail-OSG:X-Yahoo-Newman-Property:From:Subject:To:Content-Type:MIME-Version:Content-Transfer-Encoding:Date; b=aIIkhzztRMyw0Xk0JTvAY46nkVEYKOyg/TbtdFOOswRLYh8E5C3I8rMtofcaAacFgT4WP0gotY6VJlxtskk/D0zGwR1lHtfHjPVFl5gT01mbnxa3BrAShPzhzLkqvC/2T8y/7vouz0am6qbVNCMjkcic7GIVFlIimskNuPEH/0U= ; DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com.vn; s=s1024; t=1281418323; bh=Fr0XK/pNXQhkMfHUdaEbcGszUXH0ROZI7tDo8UsF/AY=; h=Message-ID:Received:X-Yahoo-SMTP:X-YMail-OSG:X-Yahoo-Newman-Property:From:Subject:To:Content-Type:MIME-Version:Content-Transfer-Encoding:Date; b=uifNw7xj3/Lh+jWLaQWkCGc0Ufk6PixmahWhbBAILfqsRUTgFzlJnI1kjZsAOU6tMhCHdxwse1xReIBZx4xn/3z7xkHhjhXt/m321Iszc+WsPThojZjndk4jx31gvMJnnikYK3gamAvgsUnS4hcDKFgY8WQcEJveE/pXFAXHUPI= Message-ID: <691629.67086.qm@smtp117.mail.sg1.yahoo.com> Received: from fdkxiia (mckern_juq@58.251.106.125 with login) by smtp117.mail.sg1.yahoo.com with SMTP; 10 Aug 2010 13:32:02 +0800 SGT X-Yahoo-SMTP: QBmVprmswBB5_FlRRID1vzLoJPtONhY- X-YMail-OSG: .xjHlsAVM1mj9dhlDYUWVlFh142DjXsDqJUc2RpF0j18fKL NFjil_zlLmJ6It7X9xzx8Bk2GVseqJ2YPxHUbcgagGIFNfZr86HBiUrcN9c7 yeG2bdKnWtOHe6NBpELcI4roCoVfm12yUvlO_6GKI4o1xnBhPR8RX94B938g cwiUyGVaJAtYb4aYKdsU6wBmHWTSDNxf9pAPcqcMlLGGLi7Qg38pTdaSXX7D HxaNU1jQKesdAvPLkNL0S.EMIeE4iUSALEQgj2G_2QzaDH2udM4SG9Borz1W n8vsGYA-- X-Yahoo-Newman-Property: ymail-5 From: "Mvodowtd" X-ASG-Orig-Subj: =?gb2312?B?1MS2wbjVtKvTyrz+MlSjqDMtNaOp?= Subject: =?gb2312?B?1MS2wbjVtKvTyrz+MlSjqDMtNaOp?= To: xfryax@163.com Content-Type: text/plain; charset="gb2312" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Date: Tue, 10 Aug 2010 13:31:49 +0800 X-Barracuda-Connect: smtp117.mail.sg1.yahoo.com[124.108.123.216] X-Barracuda-Start-Time: 1281418326 X-Barracuda-Bayes: INNOCENT GLOBAL 0.5649 1.0000 0.7500 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 1.77 X-Barracuda-Spam-Status: No, SCORE=1.77 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M, DKIM_SIGNED, DKIM_VERIFIED, MIME_BASE64_TEXT, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.37554 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.52 MIME_BASE64_TEXT RAW: Message text disguised using base64 encoding 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean xPq6w6Oh16jStbmp06bUrbOn0czLv8Xk1sa498Dgw+LLsM/j0cwuDQoNCiDW0LuqoaLcvcjYu8ah osvV0cyhorTz0KHQ3MOooaK7xrrXwqWhotK7vsXSu8H5oaK2rLPmz8Sy3bXIo6ENCg0KIMGqz7VR UaO6NTcxNDc1NDQ5ILrOyfoxMzkyNjUyOTgwNSAgd3d3Lmc1NTg4LmNvbQ0KDQogsb7JzNDQz+PR zLa8yse+q7fCz7XB0C6w/Newus3V5sa3sfDO3sG90fmjqNPQt8DOscLro6kgv9q40LS/1f0uOTUl trzKx9Xm0czLvy4NCg0KINX9ueazp7zSvNO5pNbG1/cuob6+q7fCob8gs6e1xNKqx/O63NHPuPEu 0czStsirsr/M2MrivNO5pNPr1sbX99Xm1f2077W9wcu437Hq17y1xNKqx/Mho6jF+sG/vNu48cHt 0umjqb270tfB47Wjt+fP1aOhDQoNCiDKx9fUs+ks1dC0/SzLzcDxLMX6t6IswePK2yy5q8u+LL7G teosINPpwNazocv5tcjK19GhLCANCg0KILzbuPG4/LrPwO0sv9rOtrj8tL/V/SEgvPu79bi2v+4s x+u3xdDEubrC8iEgs7m118jDxPrO3rrzucvWrtPHIQ0KDQog0tShsLPP0MUuzvHKtS6439CnLrmy 066hsc6q19rWvNPrxPqzpMbaus/X9ywgtPLIxcfrxOPBwr3iDQoNCiAgICAgICAga1NBTjU4clVW a25vRDRHejNWV2ZOZ2hpMTluaDcxcDEwTWd1ODIwQkUxMFEwZ3VqNE9pODloMjF3NDFlSHROYzh1 Y3c4NzZWekxROEs1DQo= From MAILER-DAEMON@oss.sgi.com Tue Aug 10 02:23:50 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.0 required=5.0 tests=BAYES_60,UNPARSEABLE_RELAY autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o7A7Nnic077523 for ; Tue, 10 Aug 2010 02:23:50 -0500 X-ASG-Debug-ID: 1281425053-156401d60000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mout-bounce.perfora.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C709D4A5AD3 for ; Tue, 10 Aug 2010 00:24:13 -0700 (PDT) Received: from mout-bounce.perfora.net (mout-bounce.perfora.net [74.208.4.199]) by cuda.sgi.com with ESMTP id ilvRXRhHGo3P15Hc for ; Tue, 10 Aug 2010 00:24:13 -0700 (PDT) Received: from mx by mx.perfora.net id 0Lruj8-1Ov7a71SQw-013vgj; Tue, 10 Aug 2010 03:24:13 -0400 To: From: Traditions Customer Service X-ASG-Orig-Subj: Thank you for contacting Traditions Subject: Thank you for contacting Traditions Date: Tue, 10 Aug 2010 03:24:13 -0400 Message-Id: <0Lruj8-1Ov7a71SQw-013vgj@mx.perfora.net> Precedence: bulk X-Original-Id: 0LqiuQ-1PMiZb0D5e-00ecvZ X-Provags-Id: V01U2FsdGVkX18g+v/4aa099fJ3MMesZ6vknoF0w0es1a/ZMpG kQt0DC5TmjjSz8X+1tw1xRh+eScZH0sbzNn9GoYeBDYbbpZVR X-Barracuda-Connect: mout-bounce.perfora.net[74.208.4.199] X-Barracuda-Start-Time: 1281425053 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4791 1.0000 0.0000 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.37562 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Thank you for contacting us! We have answered some common questions below. If we haven't, you will receive an answer shortly. Please contact us at 800-297-4723 for immediate answers to your questions. How long will my order take to ship? Diploma Frames - 2-4 weeks Announcements - 7-10 business days Rings - 8-10 weeks Cap and Gown - approximately 2 weeks prior to commencement I forgot to order my cap and gown, how can I get one? You can visit our office at 1540 Louis Bork Drive, Batavia, IL to purchase a gown. Or you can purchase one at commencement, our representatives will be set up 2 hours prior to commencement. Please contact our office at 800-297-4723 for more info. How can I track my order? You will receive an email confirmation when you place your order online and another email confirmation once your order has shipped. From Nico.van.Wijk@reedbusiness.nl Tue Aug 10 02:33:37 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.0 required=5.0 tests=BAYES_99 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o7A7Xapl077838 for ; Tue, 10 Aug 2010 02:33:37 -0500 X-ASG-Debug-ID: 1281425638-0ccb02000000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from maildtc1.reedbusiness.nl (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 38A911BF14EF for ; Tue, 10 Aug 2010 00:33:59 -0700 (PDT) Received: from maildtc1.reedbusiness.nl (maildtc1.reedbusiness.nl [145.43.250.35]) by cuda.sgi.com with ESMTP id FCx5lwa8oukWv3XR for ; Tue, 10 Aug 2010 00:33:59 -0700 (PDT) Received: from RBNDTCEXCP01VB.b2b.regn.net ([145.43.80.53]) by maildtc1.reedbusiness.nl with Microsoft SMTPSVC(6.0.3790.3959); Tue, 10 Aug 2010 09:33:55 +0200 X-MimeOLE: Produced By Microsoft Exchange V6.5 Content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable X-ASG-Orig-Subj: Uw E-mail Verlopen Na Enkele Uren. Subject: Uw E-mail Verlopen Na Enkele Uren. Date: Tue, 10 Aug 2010 09:33:54 +0200 Message-ID: <6D0CA15776E7F744878AEEB54D49B1A72015EF83@RBNDTCEXCP01VB.b2b.regn.net> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: Uw E-mail Verlopen Na Enkele Uren. Thread-Index: Acs4XmF9hLK3lC2bTQGMQiXbD2GXhw== From: "Wijk, Nico van (RB-NL)" To: X-OriginalArrivalTime: 10 Aug 2010 07:33:55.0325 (UTC) FILETIME=[633D8AD0:01CB385E] X-Barracuda-Connect: maildtc1.reedbusiness.nl[145.43.250.35] X-Barracuda-Start-Time: 1281425640 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0024 1.0000 -2.0053 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.01 X-Barracuda-Spam-Status: No, SCORE=-2.01 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.37562 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Let op E-mail gebruiker. Uw e-mail account vervallen na 48 uur na het lezen van dit bericht. Uw mailbox is overschreden de limiet van 20 GB, die is ingesteld door uw = beheerder, Je hebt bereikt 91.624 KB, kunt u niet kunnen ontvangen of nieuwe mail = te sturen totdat u opnieuw valideren uw mailbox. =20 Voor re-valideren uw account mailbox: (KLIK HIER = ) vul vervolgens = het formulier in en stuur het direct verschijnt. Volg de bovenstaande instructies om opnieuw activeren van uw rekening = onmiddellijk. Nu activeren! =20 Bedankt, System Administrator [Systeem Beheerder].=20 Help webmail beheerder.=20 From amit.macworks@gmail.com Tue Aug 10 07:09:32 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.8 required=5.0 tests=BAYES_50,FREEMAIL_FROM, HTML_MESSAGE,T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o7AC9WWn087337 for ; Tue, 10 Aug 2010 07:09:32 -0500 X-ASG-Debug-ID: 1281442196-0ce301e20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-qy0-f181.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id ED1461E425DE for ; Tue, 10 Aug 2010 05:09:56 -0700 (PDT) Received: from mail-qy0-f181.google.com (mail-qy0-f181.google.com [209.85.216.181]) by cuda.sgi.com with ESMTP id NtlEwQxT9NmDHUNL for ; Tue, 10 Aug 2010 05:09:56 -0700 (PDT) Received: by qyk7 with SMTP id 7so7161991qyk.5 for ; Tue, 10 Aug 2010 05:09:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:in-reply-to :references:date:message-id:subject:from:to:content-type; bh=iW8IMTBjDMR85wIptrHU102A77phwIiGm0WBkUfawNU=; b=fAEDzr8qLWzNgs7Hx7egRZqiE0wSv4t3e6FQuUbXajUk00p8BPo/atI7MERr448qed D9A+wv2Obt/3VfV6pm9jc8XU4DiphLAbn8RXsp/fuwkfncTAElJJHMKSsxERxBcFxNmi 7IeLSuXRbezRb1CUA/B8BGSr4/gT5PL2Wfp0Y= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type; b=KmB0kM7FYTXTEe/6qF424ukN3G1KmP0NX9xTUplNLYweEd9iXj3eoAGsxRy1Xv2nBz oOlWj+HuQcmg8IkSfXYcmgpP2BTBgu3B8oVwm3zW7aayCLtQ/sio4z053xPdgqblRf3K Q0cF/2y9ufzlJAtTmBvfJfqACaQq4R6ZzwJZw= MIME-Version: 1.0 Received: by 10.229.64.75 with SMTP id d11mr6679407qci.20.1281442195640; Tue, 10 Aug 2010 05:09:55 -0700 (PDT) Received: by 10.229.5.67 with HTTP; Tue, 10 Aug 2010 05:09:55 -0700 (PDT) In-Reply-To: References: Date: Tue, 10 Aug 2010 17:39:55 +0530 Message-ID: X-ASG-Orig-Subj: Query Regarding XFS File system Subject: Query Regarding XFS File system From: Amit K To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=0016e65da910df1171048d770210 X-Barracuda-Connect: mail-qy0-f181.google.com[209.85.216.181] X-Barracuda-Start-Time: 1281442196 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_SA085, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.37580 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 BSF_SC0_SA085 Custom Rule SA085 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --0016e65da910df1171048d770210 Content-Type: text/plain; charset=ISO-8859-1 Hi , I was just going through the architecture of different File system drivers and i found that XFS provides a better mechanism of data handling under heavy loads. I want to develop this driver and was referring documents provided by XFS (http://xfs.org/index.php/XFS_Papers_and_Documentation ) I have some queries regarding XFS Licenses-(CCPL- Share Alike Version, which covers XFS documents.) Query No 1 : Do I need to distribute or share/Open the Code( which will be written by referring this document .) if i want to commercialize XFS driver. Query No 2 : What all License related conditions need to be fulfilled, if i want to commercialize this XFS driver(stipulated by SGI). Response Awaited Thanks & Best Regards Amit Kumar --0016e65da910df1171048d770210 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
Hi=A0,
=A0
I was just going through the architecture of different File system dri= vers and i found that XFS provides a better mechanism of data handling unde= r heavy loads.=A0=A0
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 I = want to develop this driver and=A0was=A0referring documents provided by XFS= =A0 (http://xfs.org/index.php/XFS_Papers_and_Documentation)=A0= =A0=A0=A0=A0
I=A0 have some queries regarding=A0XFS Licenses-(CCPL- Share Alike Ver= sion, which covers XFS documents.)
=A0
Query No 1 : Do I need to distribute or share/Open the Code( which wil= l be written by referring this document .) if i want to commercialize XFS d= river.
=A0
Query No 2 :=A0 What all=A0License related conditions need to be fulfi= lled, if i want to commercialize this XFS driver(stipulated by SGI).
=A0
=A0
=A0
Response Awaited
=A0
Thanks & Best Regards
=A0
Amit Kumar

--0016e65da910df1171048d770210-- From global@a-aidunion.org Tue Aug 10 08:35:57 2010 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o7ADZuoG090823 for ; Tue, 10 Aug 2010 08:35:56 -0500 X-ASG-Debug-ID: 1281447378-1a31026b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from n63a.bullet.mail.sp1.yahoo.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id E6E0E4A6B4D for ; Tue, 10 Aug 2010 06:36:18 -0700 (PDT) Received: from n63a.bullet.mail.sp1.yahoo.com (n63a.bullet.mail.sp1.yahoo.com [98.136.45.10]) by cuda.sgi.com with SMTP id 7atvOEoI74MnOEDp for ; Tue, 10 Aug 2010 06:36:18 -0700 (PDT) Received: from [216.252.122.218] by n63.bullet.mail.sp1.yahoo.com with NNFMP; 10 Aug 2010 13:36:18 -0000 Received: from [67.195.9.81] by t3.bullet.sp1.yahoo.com with NNFMP; 10 Aug 2010 13:36:16 -0000 Received: from [98.137.27.222] by t1.bullet.mail.gq1.yahoo.com with NNFMP; 10 Aug 2010 13:36:16 -0000 Received: from [127.0.0.1] by omp132.mail.gq1.yahoo.com with NNFMP; 10 Aug 2010 13:36:15 -0000 X-Yahoo-Newman-Property: ymail-5 X-Yahoo-Newman-Id: 567817.56446.bm@omp132.mail.gq1.yahoo.com Received: (qmail 64677 invoked by uid 60001); 10 Aug 2010 13:36:14 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s1024; t=1281447374; bh=AsfNFAXpVF5wgHefjPacjxzgwQj8FI1uRx8xHv6h2LA=; h=Message-ID:X-YMail-OSG:Received:X-Mailer:Date:From:Subject:To:MIME-Version:Content-Type; b=nHnMVRQarL0ID8wxveLPQI0PY52NVNWZd8K18vMF8NAj8P5xiIh9WXxvhvkkC5DebUu14wxd7np6/QNBCbCjmQO/VZKcqRnxZ12C48Qod3hJiC91rHC59P7YqNr1x4+kVoETpdgv8+BumnyoJARsMtMOF65KGlnUGCYMqBeqzjg= Message-ID: <616616.62829.qm@web1203.biz.mail.gq1.yahoo.com> X-YMail-OSG: e2otdRgVM1nCapq2eVP.bNgMOlj5c_keRTc_3QuVFPFgx9Q lCmcAZ6wmKWsSsGrCZLKDQecVTA3Yr0bYlQFmvup9hml5e4fG7m.0qRpArOL zx9ns7Niti_rUaVFIB.oErv7PJoyD.Qx2fyFfPdn_ogFWi0.xmAEvEBAhDoa Fk0FXvtWKSIN3V5A8RW9M29wOdgtAdrFWXPQC_5G7LGAv0HtDfTN6brbq5ev u9f7T4rdids4gTWN6sSTwWEw.lCsyujNeVOlR58iRsGSPIMiTlW4K3NdExVF gfzIpXTolw5UiuWmqeE0CP5sNsS87uUZMnAgoak_K1h856t35u4z4IuKXETO ewAg3WMBMxwz1OWYNBsux3NJBAn9W572PrxZZ_.R6jVYDLkGwiiU_cZ7qLXl ZC2dMRTaCIgXqzw7fdBbrsgCI3xvLHesvkNauck8c5HRiK2fpDb6MnC3AznR zvzc.uPTjwLuNU1raOoS_hWpl.zfNDvYjjZ0n1ShgSOMgwBhpqqui1Z7EfiB I.8xVZI7fpHQ_gijVxJGVaqHbTC7B1GFA4VrCl5ANe6zlvVHjN9KoVFv_hfc - Received: from [41.219.193.133] by web1203.biz.mail.gq1.yahoo.com via HTTP; Tue, 10 Aug 2010 06:36:14 PDT X-Mailer: YahooMailClassic/11.3.2 YahooMailWebService/0.8.105.279950 Date: Tue, 10 Aug 2010 06:36:14 -0700 (PDT) From: Project Contracting Office X-ASG-Orig-Subj: Work and Migrate to Canada Subject: Work and Migrate to Canada To: undisclosed recipients: ; MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="0-389153779-1281447374=:62829" X-Barracuda-Connect: n63a.bullet.mail.sp1.yahoo.com[98.136.45.10] X-Barracuda-Start-Time: 1281447379 X-Barracuda-Bayes: INNOCENT GLOBAL 0.5052 1.0000 0.7500 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.75 X-Barracuda-Spam-Status: No, SCORE=0.75 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.37586 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --0-389153779-1281447374=:62829 Content-Type: multipart/alternative; boundary="0-1051780831-1281447374=:62829" --0-1051780831-1281447374=:62829 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Work and Migrate to Canada --0-1051780831-1281447374=:62829 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: quoted-printable
Work and Migrate to Canada
--0-1051780831-1281447374=:62829-- --0-389153779-1281447374=:62829 Content-Type: image/pjpeg; name="Employment2.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="Employment2.jpg" /9j/4AAQSkZJRgABAQEAYABgAAD/4QHeRXhpZgAASUkqAAgAAAARAP4ABAAB AAAAAgAAAP8AAwABAAAAAwAAAAABBAABAAAApAYAAAEBBAABAAAAmAgAAAIB AwABAAAAAQAAAAMBAwABAAAAAgAAAAYBAwABAAAAAAAAAAoBAwABAAAAAQAA ABEBBAAdAAAA2gAAABUBAwABAAAAAQAAABYBBAABAAAATAAAABcBBAAdAAAA TgEAABoBBQABAAAAwgEAABsBBQABAAAAygEAABwBAwABAAAAAQCpdCgBAwAB AAAAAgCYCCkBAwACAAAA0gEAAAAAAAAAAgAAo4UAAHqyAAAOZAEAyI8BAOiR AQAVlwEAnaIBAGqpAQCksAEAJr0BAFjKAQBX2QEAY+QBAKDqAQC18gEA2/QB AAT4AQCc+AEANPkBAMz5AQBk+gEA/PoBAJT7AQAs/AEAxPwBAFz9AQD0/QEA jP4BAKODAADXLAAAlLEAALorAAAgAgAALQUAAIgLAADNBgAAOgcAAIIMAAAy DQAA/w4AAAwLAAA9BgAAFQgAACYCAAApAwAAmAAAAJgAAACYAAAAmAAAAJgA AACYAAAAmAAAAJgAAACYAAAAmAAAAJgAAACQAAAAyAAAAAEAAADIAAAAAQAA AAAAAQD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwg JC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgy IRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjIyMjL/wAARCAiYBqQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAA AAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIh MUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKT lJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi 4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQF BgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMi MoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZH SElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJma oqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq 8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo ooAKKKKACiiigAooooAKKKKACiiuLk1uHUr2G90/y5HifLnT5A090iORGq5x vTbKhYSKIwt2siSjaHIB2lFedpGdNe3SMRpd2ztcLbqZHIlK3BcKJXaRi4t9 plWAu4aZ0BMzmPqNI0OxhikPkxyJvEYSS128xTyOjkuDI77m3b2YhmHmLjeS QDcorH1HXEtWntV/dXYyseQsxwYnkWQQq4kdcxyKFUb2KNgbQWA+tv5t1DFa bposxxpuZz5u4ALKY0cRKRJC4JJbY7MVAQ0AbFFRwzLOhdBIAHZPnjZDlWKn hgDjI4PQjBGQQakoAKKKKACiiigAooooAKKKKACiiubtfF1iqKL29tGP2fzB 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 I1oBGUaeVpZsrnIHmgQSSum3ePOAYKY2L9RPCtzbywOZAkiFGMcjIwBGOGUg qfcEEdqAPni1Vru9WRLCNbl7jyjbzMsqRzzunmCVjh2K79Mtp84Zg9z8rMXe qcM3mJaK1zO1lcRId10MyXObe4aTIJ3KpW4uJpWZxg3EQV44ttydC+h8nVpI 3toBPDi1RCcIJJZBmJFAkQ/ukuI8J5h/0RLbEiri5y5I1+yHE0YtBbhXuYAz F7ZLdLMsSgdGdhFd4wHEMaXUiCYFGoA+i9FunutJtjN55uEijEzTRMhZzGrE /NHHn73JCLzkYUgqM/xz83gbWof+fi0e3wOXPmDZhF/jkO7CJkb22rlc5HH/ AAz1S4R7qylsYFuhkXMFvIFMcq3DRuioXKbYVZVODuWJLbl/MSOPY8fatceR DpVjbfa5JpQJrOTEHnojwttEkrLG0bmSOBl+bPnnAYxsjAHJ/DHTItR8R3up yx2jLKgnCQxQyxwxLPIIIFl25ZEdGAZeptkA2Rxxmb2SsPwvoFt4f0tLaFbt pI0W2868ZGlaKLKRDKfKEC8qAB94lhvZydygAooooAKKKKACiiigAooooAKK KKACiiigAooooAKKKKACio55ltreWdxIUjQuwjjZ2IAzwqglj7AEntUlABRR RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRWffatb2sslqs0 H27yhIkU0hRMswSMO4B2b3O1eCWw20NtIGhQAUUVGJla4eACTeiK5JjYLhiQ MNjBPynIByOM4yMgElFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRVe+m 8izkYXMFtI2I4pZxlBIxCpkZXdlio2ggnOAcmo9N1Wx1e3a40+5juIlcoWT1 wCPwKlWB6MrKwyGBIBcooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK 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 riSYcGMwyQxtuWeJI7ku231ef7ZdRkDU3jupLd2jd0hnWa8mIVlKyk2TTHZl o1lgQbw8fk5c37nS7uS5/dzC0cXRj/cgzC2txNGT8yxbIZJLVUdMJLcARgBy kIBJLHaXlvlRJbw3lvIVu5S5kUThp7mbyy+8lYAzOdxkYfZY8yxMXnsXZF9c XeY44ZLy4nLLI8cbW8twYXuwXIO0QwXEsMpKFxhXIZYgttJc20Ul5Layrtt7 jUFhmiMTlJEkEiRqkbkFFxbyboI8uPs9pCpEyM6R+Y1xFKLuHUpftSTyTplZ i5edGyGhI3GRrsRKsZUNG7NtiW8MkYAG8a4CMLiSL7SjSR/aYlfJljEgDKxK siQLJMxaQhWvwk7srzu8cyO8dxELP7PLJEJ5YJQ187GW7Z3XymIM0gd7KIu/ LTWwiYNGJWSRZ7sJJdQSx3VwHkumu7dkihe7jaUeYmcB0e42XDMx8sx2JbpG YYCG1XNtbWCSLGHtIrUxbmwXtp0ilTKKA6NPbyKwMYMt2GlMTSBYQCR0S9u1 854JLa9lELTRstyNjak58uJ2U+f8mns6qyHzXlmYkvIqSV4orgxLPHp267n8 yKKIuJmM86gFtxd0kWW4uIgZHYf6PDCrl1uFEkbGGa3nkijkxPb5cW7hSTKJ YkBZwoRDZW7MpeNY4o7maRQgEcTWLiO0M11NNax/Z2eX7Ws1g8fm2kcxjESh RviQGGYqrBpI4kkO0m0gZwCS15lja0+3SWckqW9p5PyTSx7rW1t2AfiNvICz iQmMecbdnUKLcvXtm8qKKXzYDHLaNLgx+VHKqLGoX51aTy4rOOV1DIzFHUvv F2YCTLmWRdTige/Hmm8UyfZhKxaP7blyypD5k2Lfz921gLlVJHkQrIiTXJkQ XsayXCQNNqMUpQpLcSR3Ml08Y8sKAAZwwIcxw24ICwXIABHGbeFEkmnsZbKK JSzyTE/6IlvHZuwKlgvmmKWJmTIXacGd2tTQ1ulzK8N/L51zHjT7oqV+1q5a 7jlhTax2zTJbCX777ppCuGS5koluEnia6ji+yNc+XdRx4WN7UBTcKySBSCtv ZvMqlUd0823IG4pFBJeo2bq2nSSSZUvEMNtbKksJMnkGOJfnwjLJHZLtEg3m Q7nS1hoAI5ZnlCfu4bhkM8n2Sc+VY+ZA+SrFgpAMdq8K/KqJZ79yxr9pkjM1 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 KQ0SQFUe3jijvIbd0iXzFkkhu/IbTreD5FySj5jnZVV1kjkjUFnVWiACeFQ9 5bxm0aOd/sMC+Y0MUkUSxp5zyZ3mIQNGSVLbbaRgGdpZ5o5La6eW4iu18+6t 7iVrqRLqJnaeKS6jdQyJHxJJ9sSJo0BVI2ndEkFyu+MOwmjazeS981wlqk9y sy3Q86ZIo2Y/JI8880wl+fOyC6MbGKULUcyW8+4F/Osp4pzHPfMWae2j+0zA SAr5reZ5iXco6qqxvGQ8kEaABAsqW9pbSXM4EdoYAY7hITI8VrZSs4kwNu1k t1SVCU2IszZSOQzknlTI63nkG3eJpGNrviby5LeSe4Ntu+6q2kVtGkY4CtAH MYeaFpJdzvJHd2sk63Lhrm2nRQ1zLKtxdSRNhU/fySILQFAcPbFiivHAFjnl RftRu2+1uIrie8uDAtwzRvsuI2Kg7PmmE0whXchW3Ug+TJLcSAEjvc3E0ssj 2i3krwyyTxXLqqyzTNdsjMu5obcMDKHV/uWTupQXIdo7r97viNjPPJLFeN/Z skfl78+SFHkq77FL/Z7ZYzJ8n2NwmLgoEsAuuoywTTwPc212Y5pGmaVIJ0Nz FCXkBDIy+TcXMk21MrczSDy5FhJrww+Xa29mltOVeI2kFqT9mdt8S2SptYBV mkle/LI5by2SWRd67/PAJLndqBniiupJ/tNxdW6XUDqftck8kdqGjDsqZdmv 51XmMLLMqOrB3iJZIS8l3IY7W0ZxPLJGAYoo5FuBDkMiebBDbXEDBOredHbs hEiLFXu7mFrS4lN1aCBbd44p51EKKs1vJbxsFwHiMsYuLkx7WzHFaxJ/yzWr F7bTGW6ht7WOK6uLi8shEWMSvM8H2WGPk4UBpriJFHmIn2UqjBRPOwBHt8uF z5UHm+VJGbQybCzLYWsT27ZZdqwec0ZLszLE90xZJE3tY8vybwxyx5jEttGw VNk07Y1D5AuxUdhEJLdISgVmESOsYWS3EdzNbXk11OgkuhO8uwtGkj3KzzGS BTFIFO9zb/bFhwqMQyji6VI43t0lZbZJfLL4gaRit1IZb6Jw8pYNulbyluvu 4aZxbsm+N4o4gCSKFbgpFqJtJUZLeK5AkZ94lkuLp1klJcrAfMl/eZY7bZbk P8sKzRo3nC1urqWD7U+NQmnMflFJGsjcTSwkKSJCLkOzjcYzaRsFO6CASIi6 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 WngeO3ul02a1vLt5JRp7xNc3Eu5JWMMwvJg7b2IcF4kaKQgNc3ZG4iGMJXgj W6htobeaOS4kSS4tb1A0kom8mFDdq2GYmW5lbDELJ+7aMBpkgSGxFPC7xzQy 6b9kVyIRIwuVgjVbc3KDbjzUitrXySoOZU8x2cCeFJACO3svsMEFpcQwKLaK Oyn+023mRqsDwXF0XRVG9Ve3ulChgsoinIPmBjPYtnngurGSWD7PcR+UVmu5 pZHEwlluQsrhcmNJBvnaQoNyXe1WMMYgpymGCwdp45Cj29w00e8XDSSRvb3k jlnBWcuq2ymTy3DeZNIcwQxrViRVtLi4hmlki2XFzHcvbTsZA1uTc3boxk3G UyRlo3b51FpaCX5ZskAr2karptpDYTRmIW8Cq10Gj2u0UywtLGAVii8ua6uJ Mgq6wkMGD+fcWAZpQ7aRHdxm4RRZQyuQUaWMx2ceQCFEcQ05/MDcTNAJCSUe EeAzO8U8Uc7M8sLxWyyBUYruuEReHjIVdPtUh3puSTyv3UjuIpIWlm1G3maW +N2bskXQjSQ7mK3OcoqiSOKa7jdQoCzyCIIJVlQW4BGJlUPNYi0uYSiy28dv Gzm6gijNvArIQzOksjW8BXO5I2aPc7tdssckSG3ltUXznitPLLxzqGWI2trb oVZgYo2lijuy3JURgzZlSGJmjhjtHtLKPEkEMtvCv2ecuWl/0csvmSo6F0jt ZJt2HRV8+HzGjibyreS4bzbe4lvpYBaXG64neSP9zcn7LDJLI21QUjlnuoZT n94yrEqCKWGFGALEsfnXUpmj89T9rL/aE2eZCJR5aP5yHb/pFjPIVkJKeb5k pmVbnNe1vfJ+yXME0F3dRxC4tne5xJceT5U3mFmYF4XvJJpW3lNiR3G8b4kE FhYZV1EyzW26a3u4lcTFLZUkQwxkl4gqiO3hiuoRIseVZJposgP5EcJu5LWF 0ubuOOS3gZHjt0WUbpU+6sQbbKVudPKbFZYo9gCyS20dAElnC8UtnY2t1PFs ljtoPtcbRmVkZrSLk/PH5k8ayspPmqlthPL+yxNJTikFzYJc2xkYvb27xzYj gYzB7hopAyo0cRS3iu0DglIN8KEKbZpBYgtVvCkUaSR29w6RySRbldLSW2sY 49i7GEjrby3EaoS5Qzhd7ySRmWM3jzRC+YeXcz2kJWN3aMxjal/I5lUmRlUx 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 bjxJ8R9V8N3WnXc9vZ6fDcrb+TEpcqWWM4nYHKkIS3yfeO5cAH0BRXF/CvXN a8QeA7O/19ZPt7O+ZXhMRmQncj7dirgqwwV3AgA5zkCv8XvFt34O8By3unTS QahPcR29tMsaOEYnexYNkY2I46Hkj6gA7yivE/E0etfCJ/D/AIg/4SnWdasJ LgWeqwahcGYSBl3boYzwpwkhGXyDtGSC2e4+IutTW1hY+HdNvLu11rX7hbW1 mtYTI0MYdfOlPTAWMnkEEZBGMFlAO0oryv4L32tah4V1+O41WS/eDU5oLS+v ZzcsSETG5Q5GwfK3ySkHc2CMBjh/EnRNZ8D+F08SW3jzxHPqq3cW9JrtBbSu SS22HIAXIyEG/AGCu3LKAe4UV5H8QPGerw/DTwpqMN/Jo51t7Zb/AFC2iDrb Rywln2qSXzyWXbz8h+YHGadne3nhv4oaHpGgeL9V8SaffRCXUre8lN59njI/ dy+aiNsVvMU4AUcKWYKwIAPaKK8f8Q+IpfFHxAv9Dl8Uf8I54Z0PYtzf2d+k ElzdOp2xeYSNuMSfKAeYmzyV2+geDtOs9P0P/QPEN9r1rPK0qXt5ei6J6KVV wMbQVPHYlqAOgooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACvJ/F Xhr4f2fijUdal8Yz+G9WMRN7Fpmpx28kmRvJMeC5ZhtOB94gHBJyfWKx77wn 4b1O8kvL/wAP6Vd3UmN809lHI7YAAyxGTgAD8KAPP/gj4et9Pg8Sa5pzY0jV NQdNNTB5tonkCPlju53EYYAjZk5zVf4+y2Fvp3hi5v2gMcWqq0kawRyXLRAZ cx7ztKjA3KylWJjzgDB9gri/iJ4Q1Lxfb6JHp2oR2psdTju5RKzKpVQfmBTD 7xngK6dTyDtIAOH8ZeIdI8ZfEb4eW/h25tNVlS4+1OUcg28fmQyluoAfZDIC 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 +W38Tte6PJp+kjU7q7mvby+3Nby4j3QSB/nJVckyN6HPNYf/AAkNh8UPHP2z XvEOlab4P0a7zaWNxdRo1+6nh3STBKkddy8KdgGS7D3C10LR7HTp9Os9Ksbe xn3edbQ26JHJuG1tygYOQADnqKz/APhBPB//AEKmh/8Aguh/+JoA4f4w65cN Z+GNNtr/AOz+HNeu1h1HUYHAAgYpgCXlVVkZ29wn93cDy9rDo/gX4i+F7f4d 61/acOsSi11W0jukuk8tPLHmEJyrYMsm7OBhsYXK17h/YWj/ANj/ANkf2VY/ 2Z/z5fZ08n7277mNv3uenXmjTNC0fRPN/snSrGw87HmfZLdIt+M4ztAzjJ6+ poA8X0jTvC2kfGbxjb+NdP0qFrrF5YTX2PszRs2WI844MjFlzgEApIFIAwdz 4JGG4vfGN7pUciaDNqZFmA4ERbfIxMcWAYx5T24wRzjrxtX0zU9C0fW/K/tb SrG/8nPl/a7dJdmcZxuBxnA6egq5BBDa28VvbxRwwRIEjjjUKqKBgAAcAAcY oAkooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK5//AITvwf8A 9DXof/gxh/8Aiq6CvH/iRG5+M3w+a3M8cxlYNJaWbGVkDAlWk3ANHgsGUfcV nYghwKAPRIPGnhW6uIre38S6NNPK4SOOO/iZnYnAAAbJJPGK3Kz9Z0PS/EOn PYavYQXtq2TsmTO0kEblPVWwThhgjPBryPwxqd98OPiy/gGeSNvDepO1xpnn S4+zB9zKqEsSQXVo9rHLNhhgsQwB7ZRWXq/iHTNCe0iv55BPduyW8EEEk8sp VdzbY41ZiABknGBxnqKNA8R6R4p0tdS0W+ju7QuU3qCpVh1DKwBU9DggcEHo RQBqUVy+o/EPwxpf25rq+n8mwl8i6uIbGeWGGTj5GlRCgYFlBGcgnB5rch1b TbnSzqkGoWkunhGc3aTK0QVc7jvBxgYOTnjBoAuUVx958U/BNjZi6uNfgWFp WiQrHIxkIJBZFCkvHlWHmKChIIzmuwoAKy9S8S6Do1wtvqmt6bYzsgdY7q6S JiuSMgMQcZBGfY1Jrt1eWPh7U7zTrf7RfQWkstvDsL+ZIqEqu0cnJAGBya8z +CHijwzfeH1sIZI4PEjuxvjdOpuL5yXk8wPgGUcvwclBkHIwzAHrlZcfiPSJ vEs3h2K+jfVobf7TLbKCSkeQMscYB+ZflJzgg4wc1h+E/B9l4U8UeI3022gg s9R+z3CJFFIvlnEgZMk+WVBBYBcFfMIIC7K0LXW/C194ynsbO4sbjxDBaMJm hQPJHCsmGjaQDjDkZQnIPOO9AHQUVj3PirQrTWG0mbU4BfJE880QJb7PGihm eUjiJcMCC5UHIxmjw34p0bxdp0l/od59rtY5TCz+U8eHABIw4B6MPzoALvxX 4fsLy6tb3WrG1mtfKE4nnWMRmQMUUsxA3EIx25zgZxgjNzTdW03WbdrjS9Qt L6BXKNJazLKobAOCVJGcEHHuK5PQbb+1/AOtalfLOV8RfabwxzReYVt3Ty4V 8uAhj+4SLKq28knnJ487+E083gvxnp3htpZJtP8AEuj2+qWy7ixhmMRZ89Ao OyUcBiQsWTwaAPfKx77xZ4b0y8ks7/xBpVpdR43wz3scbrkAjKk5GQQfxq5q uq2Oh6XcanqdzHbWdum+WV+ij+ZJOAAOSSAMk14f4B0vV7f9oHUZddS0utSl 0w3s5aUMbNpBHlEALkFCxiALD93yDggMAe+UVl6v4h0zQntIr+eQT3bslvBB BJPLKVXc22ONWYgAZJxgcZ6io9B8U6N4l+2DSbzzpLKXybmF4nikhf0ZHAYd COnUEdQcAGxWPN4q0KDxHbeHn1OA6vcbtlohLuNqbzuxnZ8vI3Yz2zUmr+Id M0J7SK/nkE927JbwQQSTyylV3NtjjVmIAGScYHGeorye3l0PUf2htE1Dw9b2 kyPZXP25IraWGW1mUzB5Zl2rtdmIT58nnkDKEgHtlFY+p+KNJ0jUYtOuZp5L 6WIzrbWlpLcyCMEKXKxKxVcnGTgE5x0NHh7xVoXiuzN1oepwXsa/fCEh48kg bkOGXO04yBnGRxQBsUVz9z448NWkupRy6vB/xLIvNvXQM6W43FNrOoKiQsCB HneccA1HpHj/AMKa7pd3qdhrlobO0dUuJZyYBEW+7u8wKQCTgHoTkDkGgDpK K5vw14+8L+L7ie30LVo7qeBA8kZjeNtpOMgOoJGcAkZxkZ6iukoAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igArxv4nQQy/GP4el4oyftGSwUQMdsisuZ3yrgHkRD5uSAcyrj2SvK/E3g/x t4i8a+H/ABCtv4ft00dwwtnv5phL82W+9BsQkAAME3A4OTtXaAeqV4X4uE2t ftL+H4dKkuzLplvAb1rZDmFQ7yMGJKjYUkQE5PD4AY/KfSNSbx9e2629hb+H 9LeRwsl215LdtEhBBZIzCgLjII3HHGCOcg8IeAdN8J3F9qIlkvta1FzJe6hM iqzsx3MEVQAiFsttHtknaMAHJ+FdZ1PXPiL42j07WtKguobtbcQ3lnNLN5MO UG1BOqrGrluVySzsWCblWtzw14Km8P8AxB1TXrjXrR59XtyZNNtLQ20bMpjz MFMrliCeT6ynkbsHL8c/DPWNQ8UReK/Bes/2Trb7Uu/NldY5lUDaeA39xAUI KsADwQd2xoXg3WbnQ9Rj8a63/aep6haSWLSW0aIlrA2QRF8g+ZsgsxXnagIO wEgHP+Hvscfw1v8ATfBvnv4eiiuN+r61hlkBUs/kwybEdQdyHeYow2Sd/wA9 Hwu0Wz1r4F6fa6zpsGrWp+0vBaiIBx+8kGFZmwJCS+HBTG4DjBYyeFvAnjrQ /D934VbxHptvooSdbS+tIXN7HvJK4zhVGSWPLMMkKw+Vl0PAnhrxl4N8J22l zSaNem1d0hto55IUKOxcyPKYnZnDEqqqqgAkkscYAMf4HaPpuofCvZfQWl+l zcOk0U7LOFVH3JGylfkAYlwh3cyFwRvwPXK4P4XeGPEPgzw+NC1cabLbxu8k Vxa3kztliDtMboAo+8cqQOny5LMe8oAjnmW2t5Z3EhSNC7CONnYgDPCqCWPs ASe1eZ+LvhHoXivd4i8O3X9m63Li7t720mPkzyHayucZxnGd6YOWLHca9E1a wXVdGvtOcRlLu3kgbzFYrhlK8hWUkc9mB9COtc3pNl440GzisJbrSvEMMUSq l3dyy2c+QWyHwkofjZhvlPBzk80Ac38MfFfiP/hJdU8B+LDHPqek26vFdx/M ZowRy75+YlZIip2g4zu+aqfhjS7DSP2jtettNsoLO3/sRW8qB49gJaDJCIB5 f+63J+90YV2nhzwlc2fiC78Ua7ex3evXluluRbh0t7WIBSY4lZiSC6lixxk8 gLk5x9P8N+LY/ilN4tu7bRhbz2S2Bt49Sndok3oxcFosE/KflAQHPrliAc2n hfQrT9o61gttDgtIItKF4ka2xaJ5gxUSoEbbFjAGXAG5DgbmV69A8T2FnFoc 2j2NpBBJ4gu/ssqwxhDL5vNxJkceYIFlcM2clAPmOFPNyeFvGJ+JsPjKK00Z cWX2SWzbWbpg3JOVbyQFH3fkKlcgtjcdw7S70d77xRp2pTvi102KUwRLK3zz yDaXZRgfIgZRndnzm4XaCwBYv44rPw9cx+ZthhtHXzLi9eLChDy8/LrwOZOW HXk15H4x0Sa5+CPhLxJp/mLq3h6ys7y2dIzIQuyPf8vTAwrkkHAjPYmvVPEX /CQPp0kPh6OxF1LFIguLu5aP7O5GEcKInD4Jzg46Drnin4W0rUrTwrbaDr1j prQWtlFZ/ubhp1uFVNjb1eJAoIA4+bOT6cgHP2/iG0+JKeHbKCzjm0y6txqe rQzK7IioxSOAkoAxNwpPUZFu3BVsHD0633/tQ6tJ9hsW2aUsnm+bukT5Yl8z HzbZOdm35PkO7nPz9R8P/AX/AAr7Q9VtrQwXd1c3cs0LSHYTGOIY5JAuTgDJ IXALtgHqeft/BHjC3+K9344+xeHJftMQi+yS3szNFiNU3JJ5Hyt8nXb91mXv mgDc1o6Ra/FKyu7aPUr7xU+meRDZQuY7dLcu586Z8YCBsqcljkqQjNtrm/DC 3g/aO15r+Kxjun0RWf7HIXBy0GA2WJDAYXOE3BVbYu7nU13wJ4mtPiRJ408H 6jpq3F5b+Re2uqBvLICqo2lFJx8inqCCvUhiAR+BPF9t8TZvEkfiO0mt7yy+ yXEk0LebbKSGK28fKAblBUsWxuO4SEEsAV/AF+3iD4vePtSmMimweLTYYmZX CorOp2sV3KC0RbapAy5yGIBFfW9NhX9pnw3dwNaJI+mSyXEYISRsJMgc5ADk gqoClmAjJICqDWp4m8B+IE8cnxj4M1Sxs9Snijt723vo2aO4RSCSW+YjISJc KF4UncCeadz8PfGmr+PNL8Saj4n021eztwA2n6eu+JmG2SJPMDbkKlyHctgs cIM0AakL6dZfEzxA3h+C+1LxFdRQ/wBoRzTNDY2iqieXvbafmdT8uFkbIYfI Nxrn/hpZyz/EX4kW19LY3kEksMd2iWiIkzN5mcKrsoX74KtuZs5YhgwOha+A /Fnhnx9q+seFtU0o6ZrUomvItTjd3icuzMUCY3Y3Ptyy53YPQNVjwt4G8U+H vHOu6jN4ggu9M1SWOaSeVC14/lklY8YEaLhmUkA/KoChMgqAYfgLRdNsPjh4 ygtLOOxgtEikt7FplG1mUZlSIbhjDvhgy7Fm27fnIWwulwt+0vdPPp0kiTaO lyGDAJuR0CyuDIdwDIAPlGGCNs+XzDseHPDvjLTPHmueIb+PRng1h4Vkt7e9 kAhSMbVb5oCXcL/tICS2RyNpp/hrxVF8UpvF1xYeH4oLiyWxkhtryXzAu9GM rMYQJHAXAHy8BRnjJAMvUbVI/wBprSZYLfDSaI0s7xWiybjmVAzueY+Aq7xk 8KnRjXrFeZ6x4P8AFV78WdO8ZW9vo3kadbvax20l/KrTKfNAckQEIcS52/N0 6nrVy4uPHOj/ABHtJLu+sb7wzqd2bSCygiCTQfuWkDktj7vlNuO9sgnCAkKA D0CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAqnHpVjFqk2prbRm/lTy2uG+ZwnHyKTyq ZUHaMDOTjJJNyigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigArj774o+ENO1yTRLrUp49TSUQm1FhcM5c 42hQIzuzkYxnOQRnNdhXj/xpsX0PUfDvxBsY53utKu44bpIWZfMgJLAM4yEX O5Dxz52D2BAPQPEnjXQfCPlnXLqe0jkwFm+xzSRknOF3ohXd8pO3OcDOMVoa NrVlr+nJf6c072r4KPNbSQ7wQCGUSKpZSCMMOD61yfxWsrHxD8K9QKyxzB0i msZYYftBklLr5Qj25OZCwQMO0h6jNHwc19fEHwy0pt0fn2KfYZlRWUKYwAg5 6kx+WSRxknp0ABqWfxC8OX2uHRLee+bU12l7VtLuleMHGGcGMbF+ZfmbAGQc 11Fcv4UdNX1HWfE0N59otb6VbSz2lSiwW5dMgqOd0rTsDk5Vk6dBY1bxWmm3 ktra6PqurTQRNLcDToVcQABTtZmZQZCGBEakuRg4wRkA6Cisfwx4n0vxdocO r6RP5tvJwytw8TjqjjswyPzBBIIJ1J5Ght5ZUhkndELLFGVDOQPujcQMnpyQ PUigCSiuP8O/EK18T6jrVhY6LqqXWj7lukm8gfvQWAiUiUgsSjYP3eOWHGTw 18QrXxTrmoaTZaLqsU2mymG9kn8gJA/zjB2yktkow+UN+XNAHYVh6R4qsda8 Qa3o1tDdpcaO8SXDTReWrGQEjZnkj5TyQAeCMgg1X/4TCJPEtzo11pGpWotr drua/n8kWscALgSM4kJUMUbAIDYBJAAJEfhPx/oXja81ODQ5J5o9P8rfO8RR JPMDEbQfm42kHIHtkc0AdRWH4l8YaB4Pt4J9e1KOzSdykQKM7OQMnCqCcDjJ xgZHqKrp4ytrq4u103TdS1G3sbh7W8ubWNNsEqH50KM6yOVGD+7Rs5AXceKz /GNzD4j+Dmq6hbxxiC70dryNbuEPhfL8wZUNgOB0OTtbB5xggHSaHqya9odl q0VtPbw3kSzRxz7d+xuVJ2sw5GD1784ORWhXkegfEjTPCHwy8Ptd6ZrN1HFZ Ri5ks4ZJktiQu0SSS7ApYMpVOQAy7coULeqWF9b6np1tf2cnmWt1Ek0L7SNy MAVODyMgjrQBYoqvfXEtpZyTw2U97IuMQQFA75IHBdlXjryR09eK83+HfjLX tb1jxENT0TVTIuq/Z2iikha0sAqqhUO7hmYbSzhNw6MFBfBAPUKKw7zxRbQ6 pPpVhaXeq6lboklxbWQTMCNnaXeRkRSccLu3EHIUjJB4b8V6b4nS9WzMkV3Y XD215Zz7fNt5FYjDBSQQdpwwJBwecggAG5WH4h8VWPhq40iC8hu5H1W9SxgM MW5VdzgF2OAo9s5POAcHG5XJ638RvDmheJbHw7PcyT6teXEMAtrdNxi804Vn JICjpxndhgcEHNAHWUVyevfEbw54f1mPRJrmS61qV4ki0+1TdIzSMFUFiQin kHDMOMHuM05fipoUPiix0SW01WNdQlENlqLWhFpcsQMGN85dSWUbgpX5gc7T uoA7SeeG1t5bi4ljhgiQvJJIwVUUDJJJ4AA5zXH6v8TNI0B7SXV9O1my0y6d ki1KeyKxbgucMmfNQnBADRjOCRlRurH+ON7Onw11e0XTLuSB0gZr1Wi8qM+e nysC4fPA6KR8w5646DQ5rfUvBUVv4g8Oyadp8FlC0sWrJbeUVVQxyqHChNoJ 3JHjjCjBAAOsorj7r4jaXY6dBrFzYarHoE20pq5tv3OGGVYpnzlUn5QxjAJK 4OGBOprXjHw54e0uHUtU1i0gtJ0DwOH3mdTt5jVclx8ynKg4Bz0oA3KK4f8A 4Wlo4/sHOn6r/wATmWKGMiFGS3aXBiWVw5VWZGDhASwUgkDIzYT4neFrjXG0 qxvvt8kURmuJrQCSKJfkCjcD+8ZmkRFWMOxY4wDQB2FFcPpvxU0K7vLuz1G0 1XQrq3tGvfJ1a0MLywqGLtGoJLbQpOOpwcA4OCx+KmhXXi2Pw3dWmq6XeT5+ zPqdobdLn5iq7Nx3fNg7dyjOMfewKAO4oork/Gvj6y8B28N3qmmalNZyusa3 NqImUSEMdhDSK2cITnGOnOeKAOsorP8A7Ruv7H+2/wBjX32j/nw3wed97HXz PL6fN9/p78Vl6b410298HN4pvILvSNLCGQPqKKjNHxhwqsxwxOFHVuMA5GQD pKK5O8+IGm6TcWo1ux1LSLO8fZbX97CqwSNkbQ21i0RIO7EqpgK2cFSKk8Y+ NoPBNn9uv9G1W5sBtD3dmkTpGzEgBgZAw6DnG35lGcnFAHUUVz/iHxWnh7Qx rLaPqt7YiLzpmtYVDwJwcvHIyOODk8HbtO7GK0ND1i38QaHZavaJPHb3kSyx rPEY3APqD/MZB6gkEEgGhUc88Nrby3FxLHDBEheSSRgqooGSSTwABzmo764l tLOSeGynvZFxiCAoHfJA4Lsq8deSOnrxXmfw08dar4lv9emubC7uC+piPybS 7tpbewiCKgIJkDsDtYllBRipKDJYUAdZ4Y+IPh3xjqN1Z6Fcz3X2aJJZJvs0 iRjcSNu5gMNxnBxkHjOG29RXjeh6vZ6J8YPiDet/aUqhLdY7NLe4lmuZfL3F YwTgn5X2gg/JlkKxqxPeeDvHml+Nf7Rjsbe+tLrTpRFdWt9D5ckZOcZAJHVW GM5BU5A4yAdRRXL3PjaBbzUrfTNG1XWV0z5bubT0iZI5ACTEN8il5AAMqgYj cAeTipNC8a6b4p8NPregQXeoIjiN7ZEWOVZMKSn7xlTKhwSQ2ODgmgDpKK8r +HXi3XNa8QeJpdS8OXfn/wBprayNbiIx2aoNnltM8oMgU7mKxqcF2Yf6wAeq UAFcv4s+IXhrwVtj1m/8u6kiaWK1ijaSSQD2AwuTwCxAJB54OOX8Y+Mtesfi B4X0mLRNVgsJruV99rJC818UVl2Km8qIfnVmMm04ORsKZqP42SRX3wfubm+h k0+4FxE0NrdGFpC/mbdoILjOws3yNnAOTjcCAeqUV53e/FHQPCdvptrd2Opf YdkVudQtNLaGyhfBBjAY5UptOYxuK7SvLKQO8vr6306zkurqTy4UwCQpYkkg KqqMlmJIAUAkkgAEmgCxRXJr4+soPEtloOsaZqWjXd+hNo98IvKnYEDYrxyO N/PQ46juyg9ZQAUVy/jH4geH/A9n5urXW64baY7KAq08gJI3BCRheG+YkDjG c4Bz9Y+KGl6FKhvdI1z7INgub+Kz8y2tHLbGSSVWKlkb5W2bsHKglgRQB3FF cP4j+KmheHYnn+yarqdrFt8+6060MkEO9UdN0rFUO5ZEI2k9RnGRnpJvEekW 3hoeIp76OLSTbrci5cFQY2AKnBGcnIwuMkkDGeKANSiuH1D4nWGhxWFz4g0P XNHsb7Iju7u3jZEO3cFcRyO6MR0UrnrxwcaHiz4heGvBW2PWb/y7qSJpYrWK NpJJAPYDC5PALEAkHng4AOoorg9c+LWgeH7i2F3Zay1jM6xnUUsGFvE5JyjM 2DvXadygEqQy43KVHSax4n0vRdDTV5p/Pt5tgtVtf3r3bv8A6tIQPvs3bH1y ACaANiiuTXx9ZQeJbLQdY0zUtGu79CbR74ReVOwIGxXjkcb+ehx1HdlB2Nf1 +x8N6W1/ftIQXEUMEK75biVuFijTqzseg+pOACQAalFcfdfEbS9J1GCw1+w1 XR7q52i0Se28/wC1EnG2M25kBYHblTg/MvHNbF54lsrPQxqphvpFfcILVbOR bmdxn5EhYByxCseQOAWJCgmgDYorm7DxnZXPiX/hHb6zu9K1Z7cXMFtetETP HlgShjkcEjYcqSDjkAgEivqHxH8M2HiCHQl1CO61B3YSxwOpW2RA5keV2IRA gjYsudw/umgDrKK4uz+JmkXHiWDQ7zTtZ0qW6d0s7jVLI28V0ykDEZY5ycgg EDqBwSAacvxh8NW+sWNndQaraWd/g2uqXdm0FpKCoO4M5DbfmUbtuBkEnbzQ B6BRWfrOsW+h6c93cJPM3IitraIyzTvgnZGg5ZsAn2AJJABIy7DxnZXPiX/h Hb6zu9K1Z7cXMFtetETPHlgShjkcEjYcqSDjkAgEgA6SiuHi+Lfg651xdJs9 T+1TfvA8kS/IpTACrnBlZycKsQct2GOaseFviNpfirXL3RI7DVdN1O0iE0lr qVt5TlDjnAJxjcnXGdwIzzgA7CivJ7vxlrcvxh07TLnw5PDbwafLcWtk81s9 xOz/ACmQZnEasoVwMFm2eZxhzt9Ugkaa3ileGSB3QM0UhUshI+6dpIyOnBI9 CaAJKKp6rqtjoel3Gp6ncx21nbpvllfoo/mSTgADkkgDJNc/efEDTdJuLUa3 Y6lpFnePstr+9hVYJGyNobaxaIkHdiVUwFbOCpFAHWVxepfEvStNsF1ZrDUr jQTcC3/ti1SOW3B3lCxAfzNgYFd2zBIG3duXNj4j3s9t4F1yKHTLu7SbTLpZ JYWiCwDyj8z73Ukck/KGPB46Zy/hdcS6j8OtI02+0S+FmdP2NPeqnkzqeNoR pXkKkHjKhSo4CqVWgDuLC+t9T062v7OTzLW6iSaF9pG5GAKnB5GQR1qxUcEE NrbxW9vFHDBEgSOONQqooGAABwABxisO+8WQQa5Jothp19q1/DEJrmOx8rFs pxsEjSOihm5IXJYgE4xgkA6CuT0P4jeHPEviq58P6NcyXk9vbtPJcRp+4+Vw hUMTljlgcgFSDwTRonxG8Pa/cfZLI6kbxHSO5tm0y43WsjHGyUhCqEEEEk4G 084Ga5vTo9n7SerN5e3f4fVs7Nu/95EM52Lu6Yzl+mNwxsQA9QorL1fX7HRX tILhpJLy9do7OzgXfLcOF3EKOgAHVmIVcjcwHNZ9h4zsrnxL/wAI7fWd3pWr Pbi5gtr1oiZ48sCUMcjgkbDlSQccgEAkAFcfEbw5J43t/CNrcyXWqSPKknkp mOBkQuQ7EgZwCMLuwQQcV1leN+OdS0jQ/j54V1bULyO2SDTLhrl3c4SMJPs+ Xb1LFgMMxY4G0cbussfipoV14tj8N3Vpqul3k+fsz6naG3S5+Yquzcd3zYO3 cozjH3sCgDuKK5/XPF9housafowinvtX1DcYLC0MfmFFVmLkuyqq/KRyeSDg HBxX8P8AjzS/EGuX2hC3vrDWbHcZ7G9h2uEG0bwylkKkuuMNz1AxgkAjHxG8 OSeN7fwja3Ml1qkjypJ5KZjgZELkOxIGcAjC7sEEHFdZXlfiaSE/tEeCY1Mf nrZXLOABuCmOXbk7AcZDY+du/wAqdX9UoAKK8/8Ai34n1nw34L1CXSdMnbdE I5NSE6IlqJDsyoDiQyAlcYGBuBz8pFdJomtSXGjfa9RsNS02CC3SRrnVzBG0 i7cs7iNyEIAywYJjPTggAG5RXH3vxEsLHR11yTStVOgN5ZGqeVGsex2VQ/ls 4m25Yf8ALPkcgEEE6HiHxZBoGhjWk06+1TTfK8959N8qUJHwQ+C6llIOcrkA Ak4HNAHQUVz914sgt/BsHiiLTr66sZLRb1o4fKEkUJj8wswd1HA6hSTk8A1H oHjfSte8Jr4mbzNM0tnKrNqLxxAgNs3ZDkAbsqMkHI6cgkA6SivP/wDhcPhq TTr2/soNVv7W23FHtbNm84IIzKygkFFjEqbmk2Dn5S1bieM7K5t9MOn2d3fX mo2S6hFYQtEs6W7Bf3j75FUDLKv3sk5xkKxAB0lFZei65DrYvRHa3dtJZXH2 aeK6jCMsnlo5AwSCAJANwODglSVIY6E88Nrby3FxLHDBEheSSRgqooGSSTwA BzmgCSiuLh+KPhy9uNSi0trvUxYIA72UPmedMS+2GJc7pHIjdsqCm1SxYAVc 0/x5pepeC7fxPb2981vc+YLe0WHfczuhcbEjUncx2MeDwASSACQAdRRXL6Z4 6sL7xRL4avLK+0nV1iE0VvfrGPtCEEkxMjsr4wc4PY/3Wxoan4ig0/UYtMt7 WfUdTkiNx9itHiEiwghTIfMdFC7iB1ySTgHDYANiiubtvHOivpeqX19LJph0 lymoW96Astsf4chSQwcYKFSwfIAyeKw/+Fw+GpNOvb+yg1W/tbbcUe1s2bzg gjMrKCQUWMSpuaTYOflLUAegUVw+l/FDTNT8R6PoZ0nVbS61e0F7aPOsJRoS jOGJSRiMhG4Iz6gVc17x9ZeHPEulaJqGmakH1W4W3s7lBE0UjEoCf9ZvABkU HKjvjNAGh4t8VWPgzw/LrOow3ctvG6oVtYt7ZY4GegUe7EDoOpAO5XJ+M/iN 4c8Coi6vcyNdypvis7dN8rruAzjICjryxGdrYyRipPHvibUfCnhe71PTdFn1 KaKJn3KV8uDBA3SDcHKgEn5QeFOSo+agDqKK878HeLItG+H2lXXiSCTTbf7E s7alctCsd07DzPlVZXkeVwWY5UFyGOATtqxbfFfSNQ8P22rabo/iDUDO5H2O 008yTxqCw3sAdoQlSAQxyQwHKOFAO8ori4/ifoF34ftNV0yLUtUe6RmjsbCz aa4BQoJFZV4Qr5iZ3EAggqWyM6HgzxzovjrS3vtHlkBifZNbzgLLCecbgCRg gZBBIPI6ggAHSUVy+q+NoNN/tGSHRtV1C002Jpbu8tUiEKbd29VaSRPMZdh3 BN208H5sijUPiL4R0vQ7DWrvW4EsNQz9lkRXcyY64VQWGOhyPlPBweKAOoor z/Uvi/4f0/Q7TWYrPVdQsZolkmmsbdZUsy23Ecz7giSZYDZuJHfGVzqeKPFt 3p3gp9f8P6VJqqPZNeRTF0jijj2hw8gdlcjaS21QSduDtyDQB1lFcP8AC7Vb 2/8ABekLdaRfQZtPNa+mjjjS4cnJbb5rSFmJLF2Ub+X43AV3FABRRRQAUUUU AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVj+K vD1v4r8L6jod02yO7iKB8E+W4OUfAIztYKcZ5xg8VsUUAeH/AA01u/8AF2ne H/C1/aTpJ4cu2k1Iu0kWEgGLaNlVAN3mMDsY/wDLqSck1nm6l+GPxK8XaHpd v5P/AAkFpHLoiIiFjdO2yJVHCJGskkvDgfLGOv8AF7B4f8I6d4c1jX9Ss1xN rN2LmXlvlwv3eWOfnMr5AH+sx0UUap4Ts9S8X6H4l3+VfaV5yZVAfPjkjZdr Hr8pbcOcDLcfNkAGppOmw6No1jpdu0jQWVvHbxtIQWKooUE4AGcD0FeT/CWW 58QWGuRr4h1nTNSh1Oaa9slsrRGjaV2ILu0BMjkqwJwuNu3YoC59kry/xZ8G rfW/FC+I9A1ufw7qTbjPJaxk+Y5GC67XUoxBYNg/NnOM5LAHSeE/BuleE9Z1 yez1K7vNQ1R0ur0XUkZYEtIQ4VEXaGYydsfKcdDXWVh+FPDa+GNGFm1/d6hd yv513e3cjPJcS7VUsck4G1VUDPAUck5J3KAPL71f+ES+PNlfNc4sfFlo1tIk lxsVLiFV2ttxg5ARFGc7pH9gcezvr/R/ihofi6WTZovjWIQyqFkZY3x/ooIH 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 t2XddpClnIUHAXGQZPB3g3xB4N8Of2JbeJLG6t4txtWn0pgYizhiDtmG5eX4 4OWznA20Ac/8C4YItO8UmG2g/wCQ3KgvLcxNHMoA2qjIFyq5JGEVcSfKBkgV /h1eXFnqPxTntxPLJb6rcyxQo4ny4Mp+W3BVtxwBncPMwFBBQmus8HeDta8J 2+rRP4gtNQfULia9aWTTTGwuZAvzHbLgp8udgCnnhhVfwd4B1Lwn4l1rVm1y 0u01m4NxeQjT2jIbMjARt5x2jdIeobgY460Ac/8ACnR01z4V6fHa+ItSgtCk sFzYKLOdEYu29W3wE4bdu2sTgOByOTcvvB+j+DPhB4v0fRp76+jEU806m5Tz YpDChwxXZhQoRyp5KkjDBgpp6r8Dl/4SW41jwp4mu/DQuExJBaRNgEnLBSsi FUJAOzkAjjAwB2F94Puf+EObwzpGqR29pNbzwXU9/A93PMZcl5N/mJhyzuxJ BGW4AAxQBh+F1gf9n2JbeKCVDokwMdxJFHG7bH3B2jZVVS2cksrAcuQ+41j6 MXH7L0h1ieeFv7KuQjTzNExG5/IUHIJUjy1VejKQuCDg9Rb+DfEEXgGTwpL4 ksZ4TafYUuX0pg6wFGQggTAFgCgDdtvIYnIk8M+BJtF8B3Hg+/1WO80+S3lt 0kgtTBKqyly5JLuCfn44GMc5oAsfDEFfhl4dBkkf/QkOXSRT06YkJOB0BHyk AFQFKgdZXH+CPBmo+FLO3t77xTfatHaxPb20LxrFDHGShGV5ZmXbgEsQqnaA BXYUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRUc88Nrby3FxLHDB EheSSRgqooGSSTwABzmgCSisvSPEmi+IHu00fVLS+No6pN9nlDhSy7hyOCCO 44yGHVSBqUAFFFFABRRRQAUVn6zrml+HtOe/1e/gsrVcjfM+NxAJ2qOrNgHC jJOOBViwvrfU9Otr+zk8y1uokmhfaRuRgCpweRkEdaALFFFFABRRRQAUUUUA FFFFABRRRQAVyfjj4eaL4/t7OLVnu4ns3ZoZbWQKwDAblO4EEHap6Z+UYI5z 1lFAFPStKsdD0u30zTLaO2s7dNkUSdFH8ySckk8kkk5Jq5RRQAUUVn6zrml+ HtOe/wBXv4LK1XI3zPjcQCdqjqzYBwoyTjgUAaFFV7C+t9T062v7OTzLW6iS aF9pG5GAKnB5GQR1qxQAUUUUAFFFFABRWPqvirQtE1Gy07UdTghvr6WOG3ts lpHZyVU7RkhSQRuOFz3rYoAKKKKACiiigAooooAKKKKACiiigAooooAKKx9G 8VaF4hvL610fU4L6Sx8v7QYCWRd4JXDj5W6H7pOMYODWxQAUUUUAFcv4r8Aa F4wlt7q+jnt9StcfZtQs5TFPDhgww3Q4I4yDjJIwTmuoooA4vTfhtY2lwz6j rniDXrdkKmy1m++0W5OQQxj2gMRjjdkA84yAR2lFFABRRRQAUUVj6r4q0LRN RstO1HU4Ib6+ljht7bJaR2clVO0ZIUkEbjhc96ANiiiigAooooAKKKy9D8R6 R4lt7m40a+jvILe4a2kkjB2+YoBIBIwwwwO4ZBzwTQBqUUUUAFFFFABXn83w h0KPUbi80XU9c8PfacGeHR74wRyMCxBKkHGNxAAwoHQDmvQKKAMPRPCemaHc fbITd3WoNbpbSX1/dSXE7opzjc5O0FiWIUKCe3AxuUUUAFFFRzzw2tvLcXEs cMESF5JJGCqigZJJPAAHOaAJKKy9N8S6DrNw1vpet6bfTqhdo7W6SVguQMkK ScZIGfcVqUAFFZ/9u6P/AGx/ZH9q2P8Aaf8Az5faE877u77md33eenTmtCgA ooooAKKw4PGnhW6uIre38S6NNPK4SOOO/iZnYnAAAbJJPGK2I54ZnmSKWN3h fZKqsCUbaGw3odrKcHsQe9AElFFFABRRRQAUVXvr+z0yzkvL+7gtLWPG+aeQ RouSAMseBkkD8ap6X4j0jWfD669ZX0baWyO/2mQGJQqEhid4BABU8nHSgDUo rP0TW9O8R6PBq2k3H2ixn3eXLsZN21ip4YAjkEcirk88Nrby3FxLHDBEheSS RgqooGSSTwABzmgCSisvQ/EekeJbe5uNGvo7yC3uGtpJIwdvmKASASMMMMDu GQc8E1qUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRVPVdVsdD0u41 PU7mO2s7dN8sr9FH8yScAAckkAZJqSwvrfU9Otr+zk8y1uokmhfaRuRgCpwe RkEdaALFFV76/s9Ms5Ly/u4LS1jxvmnkEaLkgDLHgZJA/Gq+ia3p3iPR4NW0 m4+0WM+7y5djJu2sVPDAEcgjkUAaFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABWPqfijSdI1GLTrmaeS+liM621p aS3MgjBClysSsVXJxk4BOcdDWxXn8L6dZfEzxA3h+C+1LxFdRQ/2hHNM0Nja KqJ5e9tp+Z1Py4WRshh8g3GgDqPD3irQvFdmbrQ9TgvY1++EJDx5JA3IcMud pxkDOMjijU/FGk6RqMWnXM08l9LEZ1trS0luZBGCFLlYlYquTjJwCc46GvP/ AIVpLH8RfiMs88E8wu7bzJIIUiRm/e5wqMwHOerFu74bcKr+F9QTwV8WvGdr 4q1GC2bWPL1Cyurm6URtAryKqbnIIYBwoXHSNscAEgHoFh468J6n9mFn4k0q SS62CGH7WgkYtjauwncGOQNpGc8YzVjU/FGk6RqMWnXM08l9LEZ1trS0luZB GCFLlYlYquTjJwCc46GuH+FdhnxR421+ztL6LRtXu4Z7Ke9j8trjIkd3RTg+ WTICpI5UjuDiv8Mr7W/EOna9q+la3YrHda3cSSLd2EtxtOECiOTzoy0YjEYG 5FIwRgACgD0SDxJotz4fi15NUtBpMiB1vJJQkYBO3ktjad3y4OCDweeKx734 m+C9P0uPUp/EFobSS4ktkeHdKWkT7wCoCcDg7sYwynOGXPN+Gvhlo/hfTvEG narq9je2M22+FtNbII9N4lXzlWZ5QOMgM2eIuS2DUfwL02GX4Vxtd2cciXjz RMZkDCaEOw2nLNlNzSfLhBlm+U5LuAekaVqtjrml2+p6Zcx3NncJvilTow/m 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 O8pN/wBo2eZuwM7/AC/k3Z67flz04oAsVh6p4v0PRrhob+7kiEbok04t5Wgg ZyAoklVSkZO5ThmGAyk8EGtyvE/+Ei8R/CG91aHUvDEmoeGbnU5LqHUrWXc8 UcjjPmsQS7/MoBlKkkEbmGCAD1DUvEfhyPwqurapfWi6Le24ZWuhhZ43QttC MMsWXPyYJPIxWhpM1jc6NYz6WIxp8lvG9qI49iiIqCmFwNo244wMV5348tPC 2q/BKa906Cxu7C009V0y4cBjCoKqArO6srfKFI3bsjBVz8jYfjzWJtJ/Zv0G OCeSF7+ysbQlFOWUwhmXIYbQVQgnDZBK4+bIAOo8feIPC+s+Bdaify76NbKd 7W7ayeW1E3lMEKXGwxb9x2ghs7jtHzcVc+D8SQ/CjQFjXapidiPPWXkyOSdy jAySTt6r905INaHivRtOj+GOraQEghsLfSpIovPDSJCscZ2MeGY7dqnIBb5c jJrydtZi0v8AZo0BIH+zQ392LOX7QXdGUzyNKHaIq6xsEfO0M207MEneAD1i 3+InhW61GzsotV/eX0rw2kjW8qw3LodrCOUqI354+VjkkAZJFdRXn/ibwhrH j7wudOvPEOhy2Nz5c8NzbaQ7MMEMrxsblhyMjI6qx9a7DQovJ8PaZF/aP9pb LSJft27d9pwg/eZyc7vvZyevU0AaFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF ABRRRQAUUUUAFFFFABRRRQAUUUUAFeX2vgPxZ4Z8favrHhbVNKOma1KJryLU 43d4nLszFAmN2Nz7csud2D0DV6hRQB5v4W8DeKfD3jnXdRm8QQXemapLHNJP Kha8fyySseMCNFwzKSAflUBQmQVp2I8ez+J/FOoeGJPD8lhPqZi36ml3HuaK NIzsQErhSpQuPvMjdgoHqleb2/wz1nQJZIvB/ji+0jTH5Fhc2qXqQnczYjLk bF+bpgk4ySewBoaZqfjyw17TbbxRD4cksdQle2RtMacSRyCJ5QxEgwVxEwxw csD2web8Q/C/xNY+MZ/EPw/8QR6W9+7TX1vdSt5bSnPzAbXDg72OGHykkqeQ F7zQfDlxp8sV/rOrz6zrKRPB9sdBAixMysVWFPkXlFyxyxx1xgDoKAOT0TSP Eeh6N59xcWmu+Irt0N7cXM32WNVC4CRlImOxT0G0ZLu3BYisf4eeGvFXgjwm 2iy2Hh+4eN3limgvJYjMzMv+t/cnkLu+YZ4VFx/FXolFAHl/gf4d6xpfgbUf BvihrG80y680pNb3TyPDuC4VI5Igq4YNIGzwxzt71l6B8NviR4XddI0fx1aQ eH1curtaCWVCVydsTqQBu7CTHJbqSK9kooAp6VpsOkaXb2EDSOkKYMkpBeVu rO5AG52YlmPcknvXB6D4PsB8aPEfiW2tvLjt4o7dg8Ue03ciLJI8eDlf3ZTJ IyzSyc4znQ+Inw7/AOE7/smeDWZ9KvtMlaSCeKPfjdtJ4DKQwKKQwPGDwcgj pNA0Cx8N6WthYLIQXMs08zb5biVuWlkfqzsep+gGAAAAalV757yOzkawggnu hjZHPMYkbkZywViOM/wn0461YooA878GeGvFXhnVPEVzPYeH5U1e9mvg8V5K JUZtxWJmMPzoGIAPG3c5w2cVT8M+BPElleeLrbWXsW0jxNLNJIlpfyM9p5gk 3bFaEKzHeoLHb9wHBwBXqFFAHlfhbwJ460Pw/d+FW8R6bb6KEnW0vrSFzex7 ySuM4VRkljyzDJCsPlZbnhDwH4g034dXnhTWtUsVhe0ubS3FjGzgCbJMkjPg swLMAq7RjOSxI2+kUUAed634P8R+N/DVjoHiaXTbaKF4Zbq9tJPPluWQYbaj woIS2Sdyk4+7ghjXolFFAGP4q0BPFHhfUdEkn8hbyIxiXylk2HOQdrDBwQPQ 9wVOCOf0bSfHGm+Hk8PfadDhjtoha2eqw+a0kcSIFRmt2Xa0nGT+8CgnowGG 7iigDl/+EA0L/hX/APwhflz/ANk+V5efNPmbt2/fu/vb/m6bc8YxxXB6B8Ov iXpDrozeOY08N7yhaElroQ7doEe9D5R2gABXwhJIyRz7JRQBw/j/AOHdv4t0 Oyi02b+y9T0n59KmhJjSEjbhML91fkXBAyu0EdCpz/B/hHxzFeW58a+J4NRs LHY9tZ26hhLIoIVpnaNWbbwwySS4ViQVGfSKKAPN7jw34wn+JVp4v/szw4fI 082P2aW/mdhlmbzEk+zjY3zbfun5dw/i4Na8L+ML/wCKGleKoF0o2OlRSwwW UuozDzN4kUycQkIxDrkAN9wDJ4x6RRQAVxfxI0DXvFnhi88P6XDpqwXaRlrq 6u3RkZZA+BGsTAjCjncOp4457SigDg9d0XxbrXw+k8PPp/h83c9v9mlluL+e aNQAuJF3RF2fO4jcxKkK25zmpP7B8Sf8Ks/4Rf7LpX27+z/7M8z7dJ5fl+R5 fm58nO7P8GMY/iruKKAPI5/hfr2tfCa38H6ze2iXmmuJbG8iunmWVh5gVJFa NSiBXCDaWxgHGF2mTxN4G+IHjLwMdK1jxBpUV9FLGVjs0kSG7VQMmdiM7s/M AqhQRyDlSnrFFAHnfjfwv4q8Y+CBoVxb+H5LyVI5ZL0zSxrBMHyfLjMbkjb8 u7eCdzcAcVJ4j0Hxhrnw6fw5bWuh6bdTRLbySWl9MkMca7OEUQ52sA6FM4C4 5bJA9AooA831T4cXnir4Y6Z4V1m5g0+603yBBcWbm4R/Kj8vcysqHkF/lB4+ U7jyKz9U8G/EnxN4Lu9B8Q63ocu7aVa2jdHuSCWAkfZtRVbY2Ejy2zblclj6 xRQB5Prnwn1m68L+HYbLxP52u+HZQ9hcXNukcIQFAqbVViNojQgnfkhs8MNs nibwV4+8SJ4f1ObWdGXVNLvRdHT0WVLElWyj55dn4wc4GGIXbgl/VKKAOD+I HgnV/Fvg6z0+31O0fVLS9S9Et3bjyJWG4FCmGAQBzgEPkKAxbJapNb8C3njT wbPpPizUYJL6SVbmCWwgMcdnIIwoVQzEyLneSWIJDnG3Ax3FFAHk/hjwN8RU lh0/xX4ugvNAT5praI+dLc/Nu8uSSSMMYzyGBY5XKYweNTxx8O77VvEFn4r8 J39ppPiS1RkM0sO5bgMAg3nDAFULgHYxOQOAAR6JRQB5Xr/gTx14suNEutU8 R6bYz2NwLgJp8LmC3kQsUcI+TM5OzlmQIAwCtuJr1CCNobeKJ5pJ3RArSyBQ zkD7x2gDJ68AD0AqSigDm/H3hqbxf4I1PQre4jt57lEMckgJXcjq4BxyASuM 84znBxisux8G6pq3gufw/wCM72xnt5rSK2W30qDyEgMZJEit3Y4jONqoNmAu Cc9xRQB5/o2jfEDRvC6eHY7vQ5Ps+La01YvIJIrcEKrG38va0ipnA3gZ253Y JbrPDmgWPhbw/Z6LpqyC0tUKp5jbmYklmYn1LEnjA54AHFalFABXkfiH4X+J rHxjP4h+H/iCPS3v3aa+t7qVvLaU5+YDa4cHexww+UklTyAvrlFAHJ6RoviP R/DV3NLf2mr+LLpFMlzdjyoAwGFQbEyIkyxAAG5mc/KXOMf4eeGvFXgjwm2i y2Hh+4eN3limgvJYjMzMv+t/cnkLu+YZ4VFx/FXolFAHnfgDw14q8H2WpWk9 h4fkS9vZ74fZLyWJImdAFiWMwnCblAzngHocYMfgLwd4k8MeLfEep38elPa6 7dm5cQXkjPb/ADSsFAMQD8yAZyvTPPSvSKr3yXklnIthPBBdHGySeEyovIzl Qyk8Z/iHrz0oA8b+C7a/Fo2v3GlW+m3FpLrEy/ZJrxYlt3CoSySQQskgYMo+ UKo8sFRhsD0Dwr4VufDtvquqXE0d/wCJNWf7ReSNK6wFwD5cKE7isSZ2g4Jx 2wAor/D/AMFal4Jt7y1uNej1WC7uHu5HktGSdpmCgsXMrAjC9NuSTnPau0oA 8/8AB3hrxPovjTxDrOpxaU1vrcscjiC/mke3EYcKAJI/nzuA+8oGPlAGFBF4 L1jwz45vtf8ACj2Mtjq+ZNT0+/mePMwJKyRSKjkZLMSpGOT6rs9AooA5vSPD U0XiW78T6vcRz6tcW62kUcAKxWluDu8pT1kO/JMjAE8YVBxWf8VtMsdW+Hmo Wt9HIxZ4ltnii8x452kVI2ACs2NzgNtBYqWABJxXaV5n4M+Ddj4T1R7ifV7v U7OK4+02FjONsVvLyBKyglXlC4AfC45OM42gHceG9FXw74a03R0nknFlbpD5 rliXIHJ+YkgZ6LnCjAHAFalFFAHnfjjwJrWp+MdG8YeF9RtLfWNPTyGivwTB JF8/91SQTvZT6hsgqV5p6n4I8cXvjTw74pGu6VJd2UTR3FrNFKLa3Lgq5gQH c+VY/eZSSg5CkKnqFFAHnfiLwr4rv/G/h3WrG5tJbfQ0dV+03gjkuS6BXZgt swQtyGxkEAbRGeaj8aeF/GHifXPDV7bLpVva6Ndx3slu+ozEXEg2NggQ4G0q 6huThs4GSK9IooA878a+BNa13VNJ8U6BqNppPiiwtzDlwZonDcFdzLgBQ8uD 5eW3DIGBjL8QfD3xr4u1HQNS1XXtKsr7TZTKhsLdmjtWB3BlWTJmZisWdzIq hD8r5zXrFFAEcEbQ28UTzSTuiBWlkChnIH3jtAGT14AHoBWH420/WNY8Jahp WiCx+1X0TWzveyOqRxupVmG1SS2DgDgc55xg9BRQBxeg6Z4q0PwVa6HFZ6b9 otbdLaO4GrysT8pDSAvbttIbaVQhlAOOAoBj8B6D4k8H+BIdDmtdKubqz3fZ 3S+kVJt8rO24mHKYDcYDZ/2a7iigDzP4aeD/ABV4A8NXulS2+jXryXDXUUi3 8qAsRGuxh5BwNqsdwzzgY5yND4a+GPEPhO31O11kabKl7ey35ntbyaVg7hBs IkTJHyk7i5PTOeTXeVXv7G31PTrmwvI/MtbqJ4Zk3EbkYEMMjkZBPSgDyfwb B8R00FrnQ38KT2N7d3F0t5qFrcW9xeb5WIndEAA3jBX/AGNo7V1Gmat48ttW Oma5ZeHLi6uLSS5szY3M8KDypIldZC6OeRMCCB/CQeuRn2fw78VaJEbLw/8A Ea+tdMTaILe90+K8eIBQu0OxGF44UAAenUnsND0H+yvMurq9n1DVriKOO7vZ jt83Zu27Yx8kagu2FUDrkljkkA5fwL4a8T+G9c12bUItKex1jUJL5vIv5me3 LbjtCNGEbkqMjYeOd2FAp674E8TWnxIk8aeD9R01bi8t/IvbXVA3lkBVUbSi k4+RT1BBXqQxA9MooA8zj8CeL7b4mzeJI/EdpNb3ll9kuJJoW822UkMVt4+U A3KCpYtjcdwkIJbQ8ReFPE0vxG07xV4c1LTYAtl/Z95DfRM4MXmF8qF5Y5bO NycoOSGIHeUUAeb/ABB+G1/4p/s/WtI1f+z/ABVZRCEXcTyQRyoc7h8pZo/v ORgnhipzkEaHg7w34ugvP7R8b6/Bql1BuWygtokWGHcAGkJEakyYyoOPlVnG TvIHcUUAFcP8RNG8a+ILOLTvDF3pVlZthrqS7di82D/q9vlsvln+IHO7O0jb kN3FFAHj/wDwj3xz/wChz0P/AL8r/wDI9d5N4MsdQ8BjwpqcklxA9usdxcJ+ 7eWUEMZup+cyDec5ySc7snPSUUAcHJoHjLUPDUPhfUL3TVs2T7LeatFNJJdX FsAVOInQqsrrtDMXcAliATjHYaVpVjoel2+maZbR21nbpsiiToo/mSTkknkk knJNXKKACvP/ABv8Nf7e1i28S+H9Q/sbxNacpdqmUuMKQqyD8l3YPykqVYYA 9AooA8/sbT4sSRR2d/qnhSCMxGN7+C3mlnVtpAcIdsZbOD2X2I4rU1jwJbax 4I1Lw3NqN2z6g5mmv5QjTPLvDqz7VUMBtRQABhFCgjAx1lFAHk8Pgb4gXvw6 ufCep+INKto4rRbezlsUkLzKvAjmcgYj2gL8i7j1JIDK+ofC/iqT4Wp4TvLf w/eztZNZGQzSxRwKqBYXAMbmRwRvJxHggYHGa9EooA8/t/D/AIsi+GMnhSWD Spbj+z/7OS5fUXwUaNkLEC3GNvyALzkdWyMtX0zwDrF58KJfA3iS7gXbEI4b 60uXnY4kMiZV0XCrhF2gnKggFeK9IooA8rsPCPxLtPDV54bbxD4fk09LcwWN xLYmSUxqFVInQjywjKCGJEhG4/e4IueH/AviDw18NZ/DQvbHWZLiJ4fs92zW 1tbJIrFwGjQySfO56lcjGNhHPpFFAHn/AIS8C3lp8M5PBPiWGxktfKkiE9pO ZS+93fdteMBGUspU/NyM8YrL8MeCfiH4Tt30DT/E2jPoIRlt7mayZri2LBmL JGCFJ3t/G7DABx1U+qUUAeR6B8G7u08Ea34b1DX5Es9TcyRWtuiSLbSB1Ku0 hRWlOI4wQAg+9xkhhJD4G+IF78OrnwnqfiDSraOK0W3s5bFJC8yrwI5nIGI9 oC/Iu49SSAyv6xRQBxei+FNa/wCFczeG9c1K08+TTDpsf2OImKBBG0av82Gd yCC3KjgAAcs1PwT4N8Qab4XXw94nvdKm0pLSaz+x6fAyeckhHzvL8p3AeYvy qM7txZm5HoFFAHi+mfDP4i+FtRlsfDHjSC38PNKPLW7XzpIo8knEbRlAwLN9 0qHOCcdB3GseFtUh0nRYvC19Bbahpkpc3V6u83KGN96SlQC3myeWznjkb+WV a7CigDi4/CN9qvjzTfF2staWk+m28kFvZ2TecHLBgXeZo0YjDsBHtwCNwb5m B7SiigDj/H/gj/hLrOyurK6+xa7pUv2nTLphuRJAVO11IIKkovOCRgHkZVo9 R0DXvF+l2+j+KIdNttPLxy339nXbyG82c+XteJTEhcKxIcsAu3Pzbh2lFAHJ /EPwhN4z8NLZ2eoSWGoWlwl5ZXCsQFmQMF3EcgfMeRyDg84wef8AEvhDxt4z 8Eahpmuaho0N+7p9lh09po7c4dGLTM2WY4DALjaCcncdpT0yigDg9X8B6nqf wrvfCc+ux3V5KiiG5azjt4kCOrJGscYwqYQLn5iMk8jCjY8HaZ4j0zS4ofEN 9psrx28UEVtp1r5UUWzcN2eNxZSmQFVV24A7npKKACuHh0LxZaadq+h/abHU NNvJZha3l/cvJNawSj7jRPG4n2EtjfJ84wCVHA7iigDzu98C6rp3wrj8EeHp LS4D28kM15fXMkBUu+5iqxKSQSzjaWAAwDvBINiXwJN4g+FsHhHxAtpbz2tv DBBc2khn2tEihZRvRCpJDAqP4SRu547yigDyuw8I/Eu08NXnhtvEPh+TT0tz BY3EtiZJTGoVUidCPLCMoIYkSEbj97gjQ8NfDFrP4bz+D/EWrSahaXCACOCN YltTu8w+W2NzkSEtufg4UbQMg+iUUAeN6B8OviXpDrozeOY08N7yhaElroQ7 doEe9D5R2gABXwhJIyRz7BBBDa28VvbxRwwRIEjjjUKqKBgAAcAAcYqSigAo oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo orL1fxDpmhPaRX88gnu3ZLeCCCSeWUqu5tscasxAAyTjA4z1FAGpRWfo+t6d r1m91ptx50ccrwSBkaN4pFOGR0YBkYejAHkHoRWPqPxD8MaX9ua6vp/JsJfI uriGxnlhhk4+RpUQoGBZQRnIJweaAOoorP8A7d0f+x/7X/tWx/sz/n9+0J5P 3tv387fvcdevFYd78S/B+naXHqd1rUaWctxJbQyiGRhM6ffMeFJdAeN65XPG c0AdZRVPStVsdc0u31PTLmO5s7hN8UqdGH8wQcgg8ggg4Irn5PiV4ShSGaXU 5EtJrj7NFetZzi1eTcVws+zyyMq3zBsYBOcCgDrKr31/Z6ZZyXl/dwWlrHjf NPII0XJAGWPAySB+NWK5vVfEHhe7S407UfLv7RX2Xf8AoT3NrCytkiaQI0cZ UgEhyNowTgYNAGpo+uaX4gs3u9Iv4L23SV4WkhfcA6nBH8iPUEEZBBOhXkf7 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 aWI28FvcJvjnmkPlxxuP7rOyqckDB5IGTUnhvRIfDnhrTdGg8spZ26RF0jEY kYD5n2joWbLHk8k8mgDUorm5PH3heF4fN1aNLeZ9kV80bi0dtpbC3O3yiflY YD9QR1GK6CeeG1t5bi4ljhgiQvJJIwVUUDJJJ4AA5zQBJWWfEmir4gTQTqlp /azozizEoMmFAY5HY7WDAHkjJGQCRj3vxL8H6dpcep3WtRpZy3EltDKIZGEz p98x4Ul0B43rlc8ZzXFxaHZaD+0dYRaJYQWVtPojTXMUCSImdzrkLH8i8pH9 8BO/3ypoA9gorm9S8eeHtJ8QLoN3c3Y1R0Dx20Wn3ErSLgnKbEIYYByRnG0+ hrY1LVLTSbdZrt5AHcJGkUTyySNgnCIgLMcAkgA4Ck9ATQBcorH0HxTo3iX7 YNJvPOkspfJuYXieKSF/RkcBh0I6dQR1BxXvPHPhaw/tD7Tr1jH/AGfgXX70 Hy2O/EfHWT90/wAgy3y9ORkA6Cis/RNb07xHo8GraTcfaLGfd5cuxk3bWKnh gCOQRyK0KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK8z+G2pQ6r4 8+IlxIsi6gmpx28gUAReTEHiiI5J3/I5bPH3cY5FemV5P4n+Fuux+NJvF3gX XYNK1K64uIJowImyMO2QrBtxCsVZT82W3ZwKAO00PwrovhrxLrN9YTSJea64 upreSUEZQnc6D72N0uW5IBYAYGBXF+Hvscfw1v8ATfBvnv4eiiuN+r61hlkB Us/kwybEdQdyHeYow2Sd/wA9dJpPgzU59G1CLxdr8mrahqNk1k8sMEcK2sTq d6xYXqWOS5A3bI8r8orn/C3gTx1ofh+78Kt4j0230UJOtpfWkLm9j3klcZwq jJLHlmGSFYfKygB8M9Gttc+BGlWlxZWl2+y6aBbqNGVJfOlCsN6OARnrtbGT wehPgXpVs/wrje5tpJRfPNHL9q2OkkQdl2IOT5WS/wArfxNIcYbJ0PBXhfxV 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 jy/MKYw/y9R4V8O+NLZ5dS8X63aaxqFujjTrWJVit42ZRl2YRA7zygO07VZ8 Z3kCvonhvxbp/wASNY8TT22jfZNXSCOa3j1KctCI1Vdw/dBHOAxwyg84DKC2 4A7yxsLPTLOOzsLSC0tY87IYIxGi5JJwo4GSSfxqxXP+KLTxTd/2b/wjOqWN j5d2r3v2u3MnmQ9wP8PlJ4w6Y56CgAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo ooAKKKKACiisvUvEug6NcLb6prem2M7IHWO6ukiYrkjIDEHGQRn2NAGpRWXp viXQdZuGt9L1vTb6dULtHa3SSsFyBkhSTjJAz7itSgAoqvfX9nplnJeX93Ba WseN808gjRckAZY8DJIH41X0TW9O8R6PBq2k3H2ixn3eXLsZN21ip4YAjkEc igDQooooAKKKKACiiigCvfWNvqVnJaXcfm28mBJGWIDgEHa2OqnGCp4YEggg kVJBBDa28VvbxRwwRIEjjjUKqKBgAAcAAcYqSigAooooAKKKKACiiigAoooo AKKy9N8R6Rq+qalpun30dxd6Y6peIgJETNnA3YwT8rAgE4IIODRbeJNFvdZk 0e01S0uNQjSR5beGUO0QRlVt+M7SGYDBwevocAGpRRRQAUVj6N4q0LxDeX1r o+pwX0lj5f2gwEsi7wSuHHyt0P3ScYwcGtigAorHtfFWhX3iGfQLPU4LjU4I mmmghJfy1V9jBmHyhgxAKk7h6VsUAFFFFABRWXq3iPSNCuNPt9Svo4J9RuFt rSMgs0shIAAABOMkAseBkZIyK1KACiiigAooooAKKx9M8VaFreoy2Ok6nBfz QxCaRrQmWNFJIAMi5QMSD8pO7AJxjmtigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDze3+Ge s6BLJF4P8cX2kaY/IsLm1S9SE7mbEZcjYvzdMEnGST26jRPDlxZ+Rda5q8+t 6rDu23MqCGNAcgbIE+RW2kjfguQzDdtO0dBRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXJ/ E5Ff4ZeIg6RuPsTnD2zTjIGQdq8gg8h+iEBjwprrK5P4nIr/AAy8RB0jcfYn OHtmnGQMg7V5BB5D9EIDHhTQBT+D9t9l+FGgR7Z1zE8mJ4vLb55HbgZOV5+V v4lwcDOBsX3jbw7p0si3GoYjilEE9xHDJJBBIWC7JZlUxxsCRkOwIyCcAivO 9L1Kbw3+zAt7brd2E62TiNnBaRWlmKh1wUIDF9yn+EFT8+Pm7j4f6VYw/C3Q LBbaNrSfTI3lhk+dXMqb5Mhs5DM7cdOcdOKALHi+DSNZ8C6jcXUWm31mtlJd QyXSmWAfumKyAplsYJO5PmwTt5rg/ht448NeEfhD4eGuavBaSSeeVhw0khBu JsNsQFtvykbsYyMZzVP4YXc2maX8RPDC3Mh0/QbiZbOWaUh41PmqctvjCj90 G4aPBZjuXOR0HwU0nTW+Elg7afaF79J0vGMK5uFE0qgScfOApIwc8HFAHoGl arY65pdvqemXMdzZ3Cb4pU6MP5gg5BB5BBBwRWP/AMJ74bF7bWj38kcl26pa NLazIl0S6IPJcoFlBMiHKEjB3fdya8v8A6KuoaX8UvBenzyQwR3s0NpbksiQ lvMRCZVJdgfLUMpBGE/i3sKuaT8QbjSZdI8IfEfw1/Y6p5Qh1FGCWzywsjxE BAEVQRHkqxUHghVJCgHtFRzzw2tvLcXEscMESF5JJGCqigZJJPAAHOakrl/i Jb6Fd+BNSg8S3s9lpDeV9ongBLpiVCuAFbq20dD1/GgCNfiV4S32Sz6nJZpf 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 JookRmUsiyqhLO67lHlBmX5iMMoB6DxV4G0Xxd4ai0G+ikt7OB0e3+yERmAo Co2jBXG0lcEEYPHIBHF/GU2Gqad4NEU/2prvW7cwQ280b/aImByyI58qTqgD OCo34JAY5APSLXWrK706e/3T21rBuMr31tJa7AoyWIlVTtA/i6cHng1np410 F7y1tjdTx/bJRDbTy2c0cE7kEqI5mQRvuAO3DHdxjORXD/GvU4hL4R8PXUM8 lhqmqo14IWfMkMbIGj2INz7vMBAHOUGATjHUfFLRrPW/hrrsV4mfs1pJeQuA NySRKXUgkHGcFTjnazDIzQB0Gs65pfh7Tnv9Xv4LK1XI3zPjcQCdqjqzYBwo yTjgVn/8Jt4d/wCEv/4RT+0P+J3/AM+vkyf88/M+/t2/c56+3WvHPE503xD+ zhYeI9Wjjl1xEjgt726dTcSMk5QqHAUuCokbac8ZJ3MC1ex6R4a0aPw9pNtH p0Ea2toY7eSO3e3khEiYkKbj5sTNk5+bfk8knmgCOfx74btreW7e/kNjGhdr +O1me1IA7TqhjY5+XAYkt8o+birniTxTo3hHTo7/AFy8+yWskohV/KeTLkEg YQE9FP5V4/Y+ItR8BeHI/Bfj/QZ7TShmC113S0UohLkxyDAwJFKtIG/1nyqx Qtlj7ZNBpuu6WEnitNQ0+5RXCuqyxSrwynnIYdCD9DQBYgnhureK4t5Y5oJU DxyRsGV1IyCCOCCOc1JRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR RQAUUUUAFFFFABXmc3gbxbc3Hi7T7nXo7nR9ef8A0eaa6nMlghLsUSEYBHzB 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 AeR6B8P/AIkaci6Jc+PI4fDsCGGI2sIa6aLdgKGdMxHaTgh22EAAEAY6T4je B7jxV4SsdK0SSxs5tPu4bi2inhBgIRWUIVwQFAbptIO3GMHI7iigDi9f8E3P jfwU2j+Kru0+3lxPFPp0LxpbyhcDh3JkAJcHO3IPRTg1Xk0bxtrvhqHw/wCI X0ZYp08nUdQsrqbzZYsHPlxhECuflySxT72UIOyu8ooA4Px14S1XWvBD+EPD 9rpsGnm3ghjmur2RWiETqQoQRtuG1FGS+eTxxz0mjWupv4eSx1yKCK4EQgZr G+mk3rsALiRwsisTnuzDg7iea2KKAPO5/Cvi/VfBEvhDVr3TZ45EMLa1I7TT vGH3Ixt2jC79oVc+ZkH5wxYc7Gt6L4jsfBVjongm/tLW7tUht1udQG4iFFxk YQgudqjlcYLdDjHWUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUVTGq2Lay+ji5j/tBLdbo254bymYqHHqNykHHT jOMjNygAooooAKKKKACiiigAooooAKKKKACiisPSPFVjrXiDW9GtobtLjR3i S4aaLy1YyAkbM8kfKeSADwRkEGgDcooooAKKKKACiiigAorn9U8a6DpF5d2t 1dTtNZRLNdi2s5rgWyEEgyNGjBMhSfmI456VuQTw3VvFcW8sc0EqB45I2DK6 kZBBHBBHOaAJKKKr317Fp9nJdTJO8aYyIIHmc5IHCICx69hx16UAWKK5Oz+J HhnULi6t7KbUrme0fZcxw6Rdu0LZIw4EWVOVIwfQ+lWF8daEdUstMdtShvL5 yltFPpN1EZSMbsbowMAHJPQDk4FAHSUVh3/iqx07xZpHhyaG7a81RJXhkWL9 0ojUsdznAzgHhckcZwCCdygAooooAKKKKACiiigAooooAKKKKACisPX/ABdo /hdGl1iS7ggVA7TrYzyxIC20bpEQqDnjBOeR6ijQPF2j+KEWXR5LueBkLrO1 jPFE4DbTtkdApOeMA54PoaANyiisvX/EekeFtLbUtavo7S0DhN7AsWY9AqqC WPU4APAJ6A0AalFY/hbxJZ+LvDlprlhHPHa3W/Yk6gONrshyASOqnvWxQAUU UUAFFFU59VsbXVLPTJ7mOO8vUke2ibgyiPbv29iQGBx1xk9AcAFyiiigAork x8RvDknje38I2tzJdapI8qSeSmY4GRC5DsSBnAIwu7BBBxXWUAFFFFABRWH4 t8VWPgzw/LrOow3ctvG6oVtYt7ZY4GegUe7EDoOpAO5QAUUUUAFFFFABRWHf +L9D07VP7Lku5J9QCF3tLK3lupY1G3l0iVig+dcFgM54qxpviTRdXuGtbDVL Se7RC8lqsoE8QBAO+M/OhBIBDAEHg4NAGpRRRQAUUUUAFFFFABRRRQAUUUUA FFFYfiHxVY+GrjSILyG7kfVb1LGAwxblV3OAXY4Cj2zk84BwcAG5RRRQAUVy et/Ebw5oXiWx8Oz3Mk+rXlxDALa3TcYvNOFZySAo6cZ3YYHBBzXWUAFFFZ+s a3p2g2aXWpXHkxySpBGFRpHlkY4VERQWdj6KCeCegNAGhRWXpHiHTNde7isJ 5DPaOqXEE8EkEsRZdy7o5FVgCDkHGDzjoa1KACiiuX1P4heHNG1GKw1Ge+t7 qaUwwI2l3X79wQCIyI8SckfdznIx1FAHUUVy83xD8MWl5bWt/fT6bJc7vJOp WM9oj7RlvnlRV4479wOpFdRQAUVT1TVbHRbBr/UrmO1tEdEeaThVLuEXJ7Dc w5PA6nA5q5QAUVT1LVbHSLdZ7+5jgR3EcYblpXIJCIo5dzg4VQSewNZdj410 G/1yPRI7qeDU5IjNHa3lnNbPIgzkqJUXd0PT+6x7HAB0FFFFABRRWHr/AIu0 fwujS6xJdwQKgdp1sZ5YkBbaN0iIVBzxgnPI9RQBuUVh6B4u0fxQiy6PJdzw MhdZ2sZ4onAbadsjoFJzxgHPB9DW5QAUVl6/4j0jwtpbalrV9HaWgcJvYFiz HoFVQSx6nAB4BPQGo/C3iSz8XeHLTXLCOeO1ut+xJ1AcbXZDkAkdVPegDYoo ooAKKKKACiufm8a6DHqNxYRXU97dW2BcJp9nNd+SSWG1zCjBGyrfKcHjpRp/ jjw1ql5b2Vpq8D308skK2bBknV0Dlw8TAOmAjfeA7eoyAdBRXJ6R8SPC+v8A iX+wdHvpL67CSs7wQO0SbCAcvjGDnhhlTjrkqG6ygAooooAKKKw/Fviqx8Ge H5dZ1GG7lt43VCtrFvbLHAz0Cj3YgdB1IBANyiiigAooooAKKKKACiubtvHv hu8uLaKG/kKXVwbW2uWtZlt55QWGxJygjYkqwGGOSMDNdJQAUUUUAFFFFABR RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABU c88Nrby3FxLHDBEheSSRgqooGSSTwABzmpK4v4hm91G30zwxpsccs+rXGbmK R5YlaziG+YGWMExhj5cWSDnzcY5yADzCK/1Pw7418L/Ee/MkUHit3g1CKZo/ KtYHZfIzMFwAIvKfkBj5LZPJC/QdeX/E7QfE/i7wNe2U+haUJLf/AEuBrfU5 ppA6AkhIxbrvZlLKAT1b1Arc+FXihfFnw+067aSR7u2QWd2ZHZ2MsYALFiBu LKVfv97GSQaANS58WQDUWsdK06+1qaPeLhtP8ox27KQDG8kjogkyfuAlgBkg DBMmgeLtF8SeGl1+wvYxYBC0zTMENuVGWWTnClRyecYwQSCCeH+A2tw6z4O1 GR/L/tQ6nNPfsJAWnkkwwlKDAQEfKABg+WSO9HxBg0jwd8MPF2neGoo7CeRI rm5hjUlQtzKIWIDZVQyo67VxtxwBxQB0mofESw06zuNTm0rVTolvLHG+rLFG ICHKASIC4kkjy4+dEYHkruFdBfa5penaHJrd1fwR6YkQmN0H3IUONpUjO7OR jGc5AGc1j6Fb6F4s+GumW32GCTRrvT4o/sfmmVYlCgeXv6lkIxu4YMueCK8/ +JsulxweALGBseGrXW1tbiOaDNsogcQlZJJDkbQsq4OQ43kn5RkA7y8+IGm6 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 ycAFj6KrMcAEgA8nvtQstL/aOkubrUYCg0QKYxdSK6OWAWJYwW82RuGEQC53 hgpcZbsPC3xG0vxVrl7okdhqum6naRCaS11K28pyhxzgE4xuTrjO4EZ5xzd7 JDP+0vpykxq8GhFQJwELsXkP7rch3na38BXgP83yshk1ZbyL9o7QJYIvMgm0 SSKcpIcxKrStuZVbhSxjUFwVJPHzKCoB2F94sgg1yTRbDTr7Vr+GITXMdj5W LZTjYJGkdFDNyQuSxAJxjBNfw14/0LxRZ6hPbyT2UmmZ/tCC/iML2mC4/eE/ KPuMTgnGOcHisOzvbHUPiR4hj8KaZaLrESRxatrd03nRxkKuyKONXBYnaysA YwpjydxABy/hnaXFv8UPiEJ7++uGjltkY3RBaUkOQ7ExoRgDChQECtgbwFag DcT4veFJn1xbWa7uxpCb5GtYDKJ1CsWaPbk7FK4MjbUBZfmwwJr3Xxq8IWfh ix1ueW7U3yO9vYiJWuGVZDGSQG2qMqxBZhkA4yQRWX4EiSX42+P7lF8zy/Ji 82OdZ0UkcqXYeYrZT7i/Iu1lP3Eqx8fo9/wvnby92y7hbOzds5IznY23rjOU 643HOxwDqPHvie98J+F7vU7HTPtkkUTMJJJ444YTkAGTc6s2c8KgJYjbwSDX P+FfFl/pXw107UNR8J6r5MOni6uLqCe1kWVdu9pzmZXLOMyNld25j1PJ6D4j zeR8NfEb/aYLfOnzJvnGVO5Su0cj5mztXn7zDg9DH8MUVPhl4dCJGg+xIcJb NAMkZJ2tySTyX6OSWHDCgCx4M8ZW3jfS31Ow03UrWzD7I5b2NEExGd2za7Eg EYJ4GeBkg4k0PxSda1jUNNOharYyaftE8t2sPlh2VWCBkkbc21g3HQEZIJAP n/hrV/8AhWfi3XfBl6u7SBE+q6KBNmZ1dgBaxIznexbcFXIYsrHB38egeDNJ uNI8ORi/hgi1O8llvr8QxhQJ5nMjLwW3bdwQHJyEFAHQVzfxAtb69+H2v2um pI93LZSKkcf3nGPmUDY2SVyMAZOcAqTuHSV5Pa6snxJ+J2r6FdzbfD2g4WTS 5JFBvrmORh5jKBloVPVS2MiIkfMQADL8NPD4/wDg/pHhLS7KRoC8Nvq11HEL WO0WOQSORncJJXC/w5yX3PsyFr0DTfiT4W1fWW0ewvbufUEcpJbrp1yGiIYK d+Y/kAYgEtgDvivL717v4I/Ei91RbKR/BmtuS620SMY5ArMqL90IVYttGcGM nqV+X1zwnpn2bTm1S6msbvVtV23N5fWS4jm4/dqhycxom1VPcDceWbIB0FFF FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF FABRRRQAVxdl4T8RweNZPEl14j024eW3jtHtxo2wJCrbisb+cXUkljklhluQ dqgdpRQBXvkvJLORbCeCC6ONkk8JlReRnKhlJ4z/ABD156V5/wCCPhvrvgjU bmW28WQXNjeS+bc2LaUI492RlowkoEbY+XgbcYyp2jHpFFAHlevfBdbrxLda 94b8Ual4fvL13e78gs4csQx2kOjKCwLEEsMkYwABXaaV4P07TPD17o0s99qM N/5n22e/uWkmuN6BDufjHyBVGMYCjvzXQUUAeR6b8EJtGv2j0vx34gsdFZy7 WVrKYpC2wDJkUhc5A58voAPeu81jwXoWueEk8M3dp/xLYokitwrEvBsXajIx yQwHc5zyDkEg9BRQBxcHg3Wrrw/FoPiHxVJqOnqgSZ4LU29xdID/AKuWXzGy hX5W2hWYdW5bd1E+lWNzo0ujvbRjT5Lc2rW8fyKIiu3YNuNo28cYx2q5RQB5 /wCGfhve6BANIuPFE9/4Yj8wRaS1nHHkM5fbLKPmkXk7l+UNnBG3Kk8I/Dm/ 8E6Ottpniee4uuVP2+OSW0jQszERW6yqEYkrlizdDjG416BRQBw/g7wb4g8G +HP7EtvEljdW8W42rT6UwMRZwxB2zDcvL8cHLZzgbaPhx4CvPh/p1xpv9swX 9jNK1xj7EYpBIQi/e8xhtwnTbnJ69q7iigDg/Bvw/wBT8F29zZ2fi27uNPDy PY2U9rG0cJYN/rD99wCVbCNGCQx/iNHhvwNrXh3xBrusJr2mzS6y/mzx/wBk GNUdQ+wqFmHG58tnJbHLAktXeUUAcHoXgbWtD8Y6nr8OvaaE1V42vrKLSDHG 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 jxHOtrqe6Q2dzbib97htrSSs291Vnc4BVjkZY4JPoFFAHB6V4G1rTfHl/wCK 317TZZ9RSOK6hGkFRsQKMRuZiyEhPUjPJU4GLHxD8E33jzS10pdXtLGw3pKw bTvPlLru5VzIAowR0XPBG7DEV2lFAGXc6VNqvhq60nWLmOV7y3lt55rSIwja 4K5VWZ8EKe5PIz7Vz/hTw+3gDw+Br3i2S9tLNPJgluyttBbRErhTljuO7ABd jtGFUKCd3aVl+I9AsfFPh+80XUlkNpdIFfy22spBDKwPqGAPORxyCOKAOP8A F+l6D428Y+ENPmSO9EKS6r5sMqSL9nHlgK6E4aKVinzAMT5ZAGGZl9Erm/Bn gbRfAulvY6PFITK++a4nIaWY843EADABwAAAOT1JJ6SgArzfVvhVK3jSXxX4 X8ST6BqVxu+0hLRJopMhQcJ8o5ILHduyx3cEV6RRQBx7fDvS9U06SHxVNP4i upthe4vDs8sgKCIFj2iFSVyQvLfxFq5fRvgn/Z10lveeLtVvvD0Molh0ZuIT iUSKsoLMjrkHcAi5Jzx0r1iigAooooAKKKKACiiigAooooAKKKKACiiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKACuf/AOE78H/9DXof/gxh/wDi q6CvG/i/pMOgeJfDfxBt9PjZLK9RdVeOESO8eV2MVI2ZADKHJBBaMA8LtAPY IJ4bq3iuLeWOaCVA8ckbBldSMggjggjnNY8HjTwrdXEVvb+JdGmnlcJHHHfx MzsTgAANkknjFbEE8N1bxXFvLHNBKgeOSNgyupGQQRwQRzmuP8F2ttqus654 zVLR31G4aztJYNj/AOjW7GINvCAku6Mx5YbRGM/KKAO0orL1LxDpmlXC2txP I92yCQWtrBJcT7MkbzHGrOEyMbsYzgZyRUmja5pfiHTkv9Iv4L21bA3wvnaS AdrDqrYIypwRnkUAV7XxVoV94hn0Cz1OC41OCJppoISX8tVfYwZh8oYMQCpO 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 EEdxuUng1c8BaIfDngyy0Y+WfsbzRb0jkjEmJX+fbJyC33jglck7SV20AdJR XP33jXQdNlkW7up4oY5RDJdmzmNsjlgmGnCeWMMdpy3ykEHBBrQ1nXNL8Pac 9/q9/BZWq5G+Z8biATtUdWbAOFGSccCgDQork5PiV4Sj1SHS11OSfUJU3C0t rOeaVcZyrIiEo42nKMAy45Aq54b8a6D4u8w6HdT3cceQ032OaOMEYyu90C7v mB25zg5xigDoKy9N8R6Rq+qalpun30dxd6Y6peIgJETNnA3YwT8rAgE4IIOD VeHxdo8/iU+HkkuxqgRpPJexnQbFJBfeyBdmRgNnBOACcio9A1vwtrWsas2g XFjdX0fk/b7i0QHzMqfLzKBiTADDgnbgjigDoKKz9T1qy0jyhdNO0kuSkNtb SXEjAYy2yNWbaMqC2MAsoJyRk0fW9O16ze602486OOV4JAyNG8UinDI6MAyM PRgDyD0IoA0KK5vWvHvhvw/cXUGo38iPZpG90YrWaZbcSHCeY0aMELdgxBOR 6itz7fZ/2d/aP2uD7D5Xn/afMHl+Xjdv3dNuOc9MUAWKK5+08a6DeaxDpC3U 8OpT8xWt3ZzW8jja7bgsiKSuI3+boCAM5IB6CgAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKy/EmiQ+I/DWpaNP5YS8t3iDvGJBGxHyvtPUq2GHI5A5 FalFAHhfgvxzfDwHfeD9Xlks9cs72Hw9bTQjBiMxMSEMhwXiCStn5QRGo3bj mvbLCxt9M062sLOPy7W1iSGFNxO1FACjJ5OAB1rl4fAtvF8VbnxniD97p6wB CpdzPnDSgnhMRqiDb1y2cfxdhQB5X8EZzrFl4n8RXUsdxqF/rDpLcxNJseNE UxhA/IQeY20EAgEA9ABTP/FMftKwWem/Ja+ItPM97D0TzFEp3qq4G7MOctk/ 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 7jaLovgN/FniCwnkivNRt5NRmgkIlAMKszOkeVZhukyw3gZYAFQRXN+J/hbr sfjSbxd4F12DStSuuLiCaMCJsjDtkKwbcQrFWU/Nlt2cCuw8J+HtZ03df+Jt c/tnV5IliDrbpFHbJ1ZIwoGct95uNwSPIG0UAcn8NxrOvfDezFtrfh+4tpUk S7hm06e6YyOxaQTM9wpZ2LlmBUD5+MqQTXPw1vtO+E2qeFdL1qPWdQtb1bq2 SX93HG48uTyHjLMhBGWCP8pMgJA+9VN/hX418La5dSfDzxNBYaRcZcWd7Izi JmxuAUo6t91cOcNjg5xk9xqHhDUX8CXGlWWsbtdkljvTqlzCuZbpJUlVmUDA XKKgGG2oqjDBcEA5vRfiHDrHifSNB8ZaVd+HvEVpcNNbK5H2e6k8t4flY84Y yS7QMglVw7E4PqlcPqvhPVPFuuaDf64tjp0Oi3Yu44rKX7S9w4wQDI8SGNQV GQN2/POCqmu4oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiisvUvEu g6NcLb6prem2M7IHWO6ukiYrkjIDEHGQRn2NAGpRWXpviXQdZuGt9L1vTb6d ULtHa3SSsFyBkhSTjJAz7itSgAoqvfX9nplnJeX93BaWseN808gjRckAZY8D JIH41X0TW9O8R6PBq2k3H2ixn3eXLsZN21ip4YAjkEcigDQooooAKKKx77xZ 4b0y8ks7/wAQaVaXUeN8M97HG65AIypORkEH8aANiiuf/wCE78H/APQ16H/4 MYf/AIqtTTdW03WbdrjS9QtL6BXKNJazLKobAOCVJGcEHHuKALlFRzzw2tvL cXEscMESF5JJGCqigZJJPAAHOaz9D8R6R4lt7m40a+jvILe4a2kkjB2+YoBI BIwwwwO4ZBzwTQBqVT1bTYdZ0a+0u4aRYL23kt5GjIDBXUqSMgjOD6GrlFAH n/gD4W2/gvZLearPrF1b71smmUpHZI/LiKMswVmOdzA8jjjnd6BRRQAUUUUA FFRzzw2tvLcXEscMESF5JJGCqigZJJPAAHOap6JreneI9Hg1bSbj7RYz7vLl 2Mm7axU8MARyCORQBoUUUUAFFFFAFO80qx1C4tZ7y2juHtX8yAS/Msb5BDhT xvGOGxlcnBG45uUVXvr+z0yzkvL+7gtLWPG+aeQRouSAMseBkkD8aALFFZ+i a3p3iPR4NW0m4+0WM+7y5djJu2sVPDAEcgjkVoUAFFRzzw2tvLcXEscMESF5 JJGCqigZJJPAAHOaw/8AhO/B/wD0Neh/+DGH/wCKoA6Cio4J4bq3iuLeWOaC VA8ckbBldSMggjggjnNSUAFFY83irQoPEdt4efU4Dq9xu2WiEu42pvO7Gdny 8jdjPbNbFABRRRQAUVXvr+z0yzkvL+7gtLWPG+aeQRouSAMseBkkD8ax/wDh O/B//Q16H/4MYf8A4qgDoKKx7HxZ4b1O8js7DxBpV3dSZ2QwXscjtgEnCg5O ACfwrYoAKKKKACiisvVvEekaFcafb6lfRwT6jcLbWkZBZpZCQAAACcZIBY8D IyRkUAalFFFABRRRQAUUUUAFFFZereI9I0K40+31K+jgn1G4W2tIyCzSyEgA AAE4yQCx4GRkjIoA1KKKKACiiigAooooA4PT/A2tWnxBm8Xza9pslxc262s8 EekGNTEChOCJid/yAbm3Y6YwAB3lZ+p67o+ieV/a2q2Nh52fL+13CRb8Yzjc RnGR09RVex8WeG9TvI7Ow8QaVd3UmdkMF7HI7YBJwoOTgAn8KANiiio554bW 3luLiWOGCJC8kkjBVRQMkkngADnNAElFZeh+I9I8S29zcaNfR3kFvcNbSSRg 7fMUAkAkYYYYHcMg54JrUoA4f4ifDv8A4Tv+yZ4NZn0q+0yVpIJ4o9+N20ng MpDAopDA8YPByCOk0DQLHw3pa2FgshBcyzTzNvluJW5aWR+rOx6n6AYAAGpR QAUVj33izw3pl5JZ3/iDSrS6jxvhnvY43XIBGVJyMgg/jVf/AITvwf8A9DXo f/gxh/8AiqAOgorDPjTwqtulw3iXRhA7siSG/i2sygFgDuwSAykjtuHrWhpu rabrNu1xpeoWl9ArlGktZllUNgHBKkjOCDj3FAFyiise+8WeG9MvJLO/8QaV aXUeN8M97HG65AIypORkEH8aANiiise+8WeG9MvJLO/8QaVaXUeN8M97HG65 AIypORkEH8aANis+10TTrPUZ9Rit919NuDXMztLIFJ3GNWckrHkZCLhQegFW Ib+zuPs/kXcEv2mIzwbJA3mxjbl1x95fnXkcfMPUVYoAKK5//hO/B/8A0Neh /wDgxh/+KroKACiiigAorn/+E78H/wDQ16H/AODGH/4qtixv7PU7OO8sLuC7 tZM7JoJBIjYJBww4OCCPwoAsUUVj6r4q0LRNRstO1HU4Ib6+ljht7bJaR2cl VO0ZIUkEbjhc96ANiiiigAooooAKKjnnhtbeW4uJY4YIkLySSMFVFAySSeAA Oc1jweNPCt1cRW9v4l0aaeVwkccd/EzOxOAAA2SSeMUAblFRxzwzPMkUsbvC +yVVYEo20NhvQ7WU4PYg96koAKKKKACiiigAooooAKKKjnnhtbeW4uJY4YIk LySSMFVFAySSeAAOc0ASUVz/APwnfg//AKGvQ/8AwYw//FVuQTw3VvFcW8sc 0EqB45I2DK6kZBBHBBHOaAJKKKx5vFWhQeI7bw8+pwHV7jdstEJdxtTed2M7 Pl5G7Ge2aANiiiigAooqvfX9nplnJeX93BaWseN808gjRckAZY8DJIH40AWK K5//AITvwf8A9DXof/gxh/8Aiq6CgAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKACisvUvEug6NcLb6prem2M7IHWO6ukiYrkjIDEHGQRn2NalAB RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXJ/E5Ff4ZeIg6RuP sTnD2zTjIGQdq8gg8h+iEBjwprrK5P4nIr/DLxEHSNx9ic4e2acZAyDtXkEH kP0QgMeFNAFP4P232X4UaBHtnXMTyYni8tvnkduBk5Xn5W/iXBwM4GxfeNvD unSyLcahiOKUQT3EcMkkEEhYLslmVTHGwJGQ7AjIJwCK870vUpvDf7MC3tut 3YTrZOI2cFpFaWYqHXBQgMX3Kf4QVPz4+buPh/pVjD8LdAsFto2tJ9MjeWGT 51cypvkyGzkMztx05x04oAseL7XRdc8C6jLfpaXen/YpLmOdsMqDymIlRwj4 IUkh1ViM5APQ8H8NvHHhrwj8IfDw1zV4LSSTzysOGkkINxNhtiAtt+UjdjGR jOap/DC7m0zS/iJ4YW5kOn6DcTLZyzSkPGp81Tlt8YUfug3DR4LMdy5yOg+C mk6a3wksHbT7QvfpOl4xhXNwomlUCTj5wFJGDng4oA9A0rVbHXNLt9T0y5ju bO4TfFKnRh/MEHIIPIIIOCKx/wDhPfDYvba0e/kjku3VLRpbWZEuiXRB5LlA soJkQ5QkYO77uTXl/gHRV1DS/il4L0+eSGCO9mhtLclkSEt5iITKpLsD5ahl IIwn8W9hVzSfiDcaTLpHhD4j+Gv7HVPKEOoowS2eWFkeIgIAiqCI8lWKg8EK pIUA9orxv9pCCFvAumXDRRmdNTVEkKjcqtFIWAPUAlVJHfaPSvZK8f8A2jv+ Seaf/wBhWP8A9FS0AewVl6HY2lnb3M1hNHLZ31w17CY5Hdf3oDMQWdhhmLP8 u1fm4Gck4+reANO1LRr6wS/1mJ7m3khWSTWLyZVLKRko02HAz908Hoar/ETX F8L/AA31trKaRru1skiQC6bz4hK3kpKXJL5ByQx5Yoec5IANDVfEHhe7S407 UfLv7RX2Xf8AoT3NrCytkiaQI0cZUgEhyNowTgYNed/BLXLLQfhLPfajPm1i 1Cbe1rZSSNAAisfN8uPJwAW3nIClRuGNo7z4f6VYw/C3QLBbaNrSfTI3lhk+ dXMqb5Mhs5DM7cdOcdOK4/4CRqfhzqbabNHGZtTnaFZg0ptz5cYVZOEDkAKT twCCOVOQAD0Sx8UaTqfhyPX7Cae702TOx4LSWR2w5Q4jC7zhgf4e2enNR+Gv GGgeMLeefQdSjvEgcJKAjIyEjIyrAHB5wcYOD6GuP+AyKvwrsyqRqWuJixW2 aIsd5GWY8SnAA3jgABeqGsfwLq1zpOjfFHUwloNQstTvrowC7eVVdVZgDHhc JuUgOMF8EEDYKAPSNV8XaPoz3C3kl2RapvuJLexnnSAbdx3vGjKhCkNgkEAg 9CDWp9vs/wCzv7R+1wfYfK8/7T5g8vy8bt+7ptxznpiuD+FOm6RqHwa0+0Sz jFpf28sd4ioYzMxLRyFiGJJO3G7I4AwEGFU1fw14Q0L4SXvhnUdWu4tBsnVL m4VlkniZpllUNtQ4JZ042/dYH3oA3Lb4h+GLq8021F9PDJqf/HibqxngS54B Gx5EVWzlcYPO4AckVn/E7xw/g3wvey2dnfTX7RbYZorVjDblyVWR5CpjGDj5 SSSSoxg5HB/GW41K++FtnPJpUdlpq3EHkR6lcs1+PkYBmBfAcDIKkysyuWbY UNdR8eRCfhXeGWS0VxcQmIToGdm3jiI5G19u45GflDjHOQAdRofifR38NRXb 6hIlnbW8O+/vree1ikDABXV7jlgx77mPIySSCbnha90LUPDlpdeGkgTSH3/Z xBAYUGHYNhCBj5g3bnrVPxDptlqfgWePW7OO6EVk0rDUkiZkkER+ZirIiuMn LK6AZOGUcjzPRdWuND/ZVF/aTTw3CRSxxywSBHQvdsmQxBxjd2wfQqcMAD1C /wDGug6d9pMt1PNHabxczWlnNcxwFc71keJGVGXGSrEEDBIwRWpNq2m22ljV J9QtItPKK4u3mVYirY2neTjByMHPORXN/Dmx0t/hVoVpbRwT2M2nqJoy3mo7 uMzK2c5+cuCvbkYGMV5/8M7HTJrPxz4S1aTz9I0HUH+zS6j5MyWq5mXzFEkZ VWGxmJOV5Pyj5twB6Je/E3wXp+lx6lP4gtDaSXElsjw7pS0ifeAVATgcHdjG GU5wy56DStVsdc0u31PTLmO5s7hN8UqdGH8wQcgg8ggg4Irzf4F6bDL8K42u 7OORLx5omMyBhNCHYbTlmym5pPlwgyzfKcl3z/hbJDcfBzxLputm7sdLsri+ tHjkAM9pb+WGdSQgLOpdzkrnPboKAO4k+JXhKFIZpdTkS0muPs0V61nOLV5N xXCz7PLIyrfMGxgE5wKueN9LsNV8G6rFqNlBdxx2k0qLM8cexxGwDLJICsbD Jw5Hy5z0rzfxTI83wLu7fRbD/inLa0RILjWrhlnukWRQsiLuXap+V0LMM7Qg i2stdppIDfBOxUyRxg+HIwXkSN1X/RhyVkIQj2chT3IGaAKfwS/5JDoX/bx/ 6USV6BXn/wAEv+SQ6F/28f8ApRJXoFABXi9xpsX/AA1RaXEcc+7+zzcSGK1f bu8posuzNjbjA3oNu7amN25q9orxu9tlf9qTTpFs5JCmmGRpILdohGfLkXfK xBEowQm4bQCyLnKEEA9Y1LVbHSLdZ7+5jgR3EcYblpXIJCIo5dzg4VQSewNU 9J8U6Nrd5PZWV5/p1vzNZzxPBOgwp3GKQK+3Dr82Mc9a4OC6XWv2kri1uHkk TQ9HLWsZ3IsMsnl7mA3kMSkuCcL2GPlDGn8df+JDF4c8aWH7vV9P1BYEccCW NldyjkYYr8hGMgYdx/FQAa1YadY/tIeE/sVpY2809pcz3HkRskkjNHN88n8B yQcEfMTu3cba7TQPiX4P8UaoumaPrUc94yF1iaGSIuB1271AJxzgc4BPQGuT 8a2lnqnx08FaffwQXlq1pdM9rOBIh/duQTGXI6qOdi52/efbhK/x6s7e007w 94itzBZ6va6rDFFqLoT5SYd/mAB3KrKGxtbHOB8xBAPTNS8Q6ZpVwtrcTyPd sgkFrawSXE+zJG8xxqzhMjG7GM4GckVJpOt6drkU8mnXHnLby+RMCjIY5Nqs UYMAQwDjI6g5BwQQOD8ZDxfo3jr/AISXwvbWmrQR6ZFb3+k/aGE5jEssgkCA gZwGVT8xyWAU81sfDjxRovi7Tb/WNLkkS7u7hZr+zlcFraXykjAGAMoViBDd +ehBVQDtK8X+CNjb6Z4y+IthZx+Xa2uoJDCm4naiyXAUZPJwAOte0V4f8M9G tdX+IfxJ+0y30flaqdv2S/nts5lnznynXd075xzjqaAPXNWsINSuNPjcSLcW twt7BIFlCqUIVgWRlGSkjKFY4O4nawUio7rxVoVnrEGkS6nA2pzSrCtlCTLM GK7gWRMsq7RkswCgckiq+k+E7XRvEN3q1vd30n2i0itvKubyefbseRi2ZHbO d4AGPlw2PvtXm/jfw3o5+Nvg5La1gSS/89763slSOWVQCxaYFtrRvlw3y7mU SDLnAUA9A0f4i+Edf1x9F0vW4Lm/XfiNVcB9v3tjEBX7n5ScgEjgZrY1jW9O 0GzS61K48mOSVIIwqNI8sjHCoiKCzsfRQTwT0Brzf4oQ28XxK+HN3HdfYr99 QaEyrGR5sQaPMbOvzc7igXBU+a2Sozmx42/tHQvir4Z8WXXz+GoojYXDnaws 5JSy+a27iNSWjBkBBwhU9QGAOsj8f+FGeaKfXLSxnhfZJBqJNnKp2hh+7mCt ghgQcYNGseI/CC3GjW+qX2m3E93cQSabGwWdmkckRSoACQM5Ak4A9ea4ub7H 4o+Onh/XPD/n6ha6ZaTQahfw4azTMb+WiSdGkzN8wBPDL6NiP4q6bpsHjXwH qEVnaR6hca7AstwqKssqhox8x3AsBhRyjY4+ZM4cA9E1jxX4f8PypFq+tWNl M+wrFNOquQzbQ23Oduc5bGBgkkAEjP8A+Fi+Ef8AhKP+Eb/tuD+1vN8jydr7 fMx9zfjZuzxjOd3y9eK4f40aLYNeeF7u3tZ4dTvNbgie40+COOeUYwMTlRtk GFCBnA6nB2ZWx8braDTvCXh+505YLK/sNVt00xxFEqQsFbClnIWOP5AT1X5F BGOQAemarqtjoel3Gp6ncx21nbpvllfoo/mSTgADkkgDJNU9M8UaTq+oy6db TTx30UQna2u7SW2kMZJUOFlVSy5GMjIBxnqK4vxjqVzP8YPB+iWWox2txHb3 V3GskLzxu7RsgMkYaMYCLLtYOxySCoByZNZ8AX+o+MtD8Wan4msbS602WKMN aWMkHnoZBiElrhgNxdk4HPmEHdwKAO41PWrLSPKF007SS5KQ21tJcSMBjLbI 1ZtoyoLYwCygnJGY9A8R6R4p0tdS0W+ju7QuU3qCpVh1DKwBU9DggcEHoRXn fhnV7/Wvih44TS9dsYLqGWG3+zXdrJcqIoQyZi/exEYdn3jaVDMMM27J1NI+ HcNl411fUtY1PTb5Nbt8z6OlgIoJWRoz53ltI+4huSSD80pORnkA3Lj4i+Eb bTrzUZNbgNjZypBJcxq8kbSONwRGUESNjkhNxUdcUaj4p8HT/wBhDUbyxmk1 CW3n0uGaLfIXkz5UqoQWTuA5AweMg1wfwY0HQDceNXtLS0uLQ6nNYwuYWlVr TJwglYlHQgjKjngFiwZMHxP0HStP8a/Du8sbS0tJzrEMDLBDHGZEVogucEMQ gUKMKQAcEr8oYA9M1jxX4f8AD8qRavrVjZTPsKxTTqrkM20NtznbnOWxgYJJ ABIz/wDhYvhH/hKP+Eb/ALbg/tbzfI8na+3zMfc342bs8Yznd8vXiuH+NGi2 DXnhe7t7WeHU7zW4InuNPgjjnlGMDE5UbZBhQgZwOpwdmVk+O1lY2ngrRJIJ Y9Mns9ThisbiGHAthtbgFPmjQBQ3yBjmNQF7gA9Q1XVbHQ9LuNT1O5jtrO3T fLK/RR/MknAAHJJAGSaxx4+8LrcPb3erR6dOiK/l6pG9izKxIBUTqhYZUjIz jFcn8Yf7R02Xwx4pi/eaRoeoLPqMA2sSrMiq6o/ysw+dQfvKXBGOSKfjWfTf GnjXwUvhyWTV7vS9TjubmaxZZbW2tywZjLIOA58n5VzkgNxkrkA9Usb+z1Oz jvLC7gu7WTOyaCQSI2CQcMODggj8KsUUUAZ+uwxXHh7U4J7b7VDJaSo8GXHm qUIK5jDPyOPlBbngE8V5v+zz5X/CtZPL8jd/aEvmeVv3btqff3cbsY+58u3b /Fur0zVgW0a+USSRk28gDxpI7L8p5CxkOT7IQx7EHFeT/BvUptJ+COpalKt3 Glk91PE04MqMqIGzEmU+TcGG0Nywf5hngA9MvvFGk2F5JZvNPcXUWPOhsbSW 6eHIBXzFiVimQcjdjPOM4NSQTaL4u8PxToLTVNJvEDqJIxJHIAc8qw6hh0Iy COcEVxfwN8qT4ZwXn797y7u7ie9mm3kzTFyN+5vvfKEBK8ZBz826sfwD/wAU 78bfGPhKw+XSHiXUEhPAhkIiJCKMKq/viMYzhEGeOQDP+EHifw14R8A6vPqG rQWtj/bc4ti7s7yoEhAKrsV3wGXJCDrkhe3rmgeI9I8U6WupaLfR3doXKb1B Uqw6hlYAqehwQOCD0Irzv4HWlnLp3iLVfIgkvn1u5i+2YDyNGRG23zN7krnn /WOCedzdTT8G2FjpXxw8ceHLASWWnz2UU32S2XYuSsZLLIGDxkGZtoXj5zgr tUUAeiX/AI10HTPtLXl1PHBa7xNdfY5jbqVzuXzgnllgQV2hs7/kxu4roK8H 07xLrPw98PWPhzxfptjN4VvIvstrrukhJY9kiFizIVKyffH3kG4K7Yl5z7pB PDdW8VxbyxzQSoHjkjYMrqRkEEcEEc5oA8v/AGgo4X+GRaURl0vYmiLEAhsM Pl+dcnaW6B+M/KPvp6BpN3DF4Vsb24uY1gSyjlkuJJQVChASxcu4Ixzu3v67 m6ng/j9Js+F86+Zt33cK437d/JOMb13dM4w/TO0Y3psL4EtNV8L2aSahriXj RQTCW41a8kxKhVwXRnTPzKM/LGw7eW2CoBqDQLHRfB2r6UVtDpLJdOsErfZo o4pdzvG8i52oGZ8MqjamBglcnyP4SX//AAhPi+Dw9e3fk6Z4g0q01Cx+0SZ3 3DxpkLj5V3N5q4YAny4xk8bvdNWlaHRr6VLiO2dLeRlnkkWNYyFJ3F2VgoHX JVgMZIPSvJ/GXh1r74OeF9f0OWQ6h4csra+s5pI1VjEsaFiULFAcKr4+b/V7 RnPIB6prms2fh7Q73V799lraRNK+CAWx0VckAsTgAZ5JArw/wLayx/tCXf8A b1xs1v8As83MyyOjhriREcxRbtxVY45Cg2sTiIndtJWu8tvEi/EM+F4NN8yK 0kSPWdTKhv3QikxHBuaPBJuIzyCpKwPjhhWHp00sX7UOrJJc2MSy6UqRphDJ Mu2JtvykESZBb5wzbF6bdpABc+Inim71Hxjonw90G6u7e8vLiOXUbqyuUjkh txlmRW6q+1S/Y4CjDByK9E0bQ9L8PaclhpFhBZWq4OyFMbiABuY9WbAGWOSc cmvF9dd9H/ao0e71O8za3cSC0GWfyw8TwqmMfLmXceOPnySMnHvFAHF6b4D0 3QPiMuvaLp0dnb3OmTW90kG1IlkEkJjKoOhZQ+ccfKOhJLcmby4+KnxK1bw/ cCdPB+h5ivrQuF+13Ks6rkoQ4XcCwGSP3KkgFhj1ySeGF4UlljR5n2RKzAF2 2lsL6narHA7AntXh/wAFIptA+I3jbw5d+X9oDiTd5BgLrHIwDpEq7FRhKrAZ GAV2hgSVAPbPsFn/AGd/Z32SD7D5XkfZvLHl+Xjbs29NuOMdMVzfhfwNY+Ev EuvX2lRR29hqiW7i3Q8RSoZd+0YwqEOhAycHcBgACukvrKLULOS1medI3xkw TvC4wQeHQhh07Hnp0rxf4ai61X4p+LLW/wDEmqy2uj3ciWWnS6nOdwE7AP8A 6zLqgQKQwYHzBn3APcKKKKAPG/idaLdfGP4egRSF/tG8tb2LNIQkiuN0mQGQ YJIHMYLMc7gK9cvr+z0yzkvL+7gtLWPG+aeQRouSAMseBkkD8a8j+J1ss3xj +HuLOS4f7RuIt7dlkwsisGaXBDonLFAMqAxJG8EaHjK6XUvjh4H8PXDyPaQp LqJgG5VMqrIYnJD/ADFWi4G0YyeWDkAA7iw8X6HqOqf2XHdyQagUDpaXtvLa yyKd3KJKqlx8jZKg4xzXnfxX0mwh8feANUihgivptbijmZI41ecb4sFjkO20 KAPlYDdyV+UNqfHTTYZvh5JrKtJDqGkXENxZ3EJCujNIqEBsZA+YNwRyintW H48n/wCEk074V6hqNpBJ/aGoWb3CeTuj/eiNmTlG+U8/KXGQPuvjKAHeQfE3 wXdeIItDt/EFpNfyuEjWPc0bsRkASgbCT0xu68deK3NT1vTtH8pb242zTZ8m 3jRpZpsY3bIkBd8AgnaDgcnArzv46eHtNm+FclwttHC+kPCbMQoqhFZ1iKDj hNrA4GOUX0xR4gufFd9pvgfx3omkWmpXFrZNPfWSgBik8UbN5W7JB+VgNpLf MBhgWBAO80TxTo3iKW5i0u88+a1wLiJonjeElnXa6sAVbMb/ACkZ4BxggnUn nhtbeW4uJY4YIkLySSMFVFAySSeAAOc1w/gTxnovjDWdSuoY7uw16O3htr7T LvAaIRNIcqMZIDzOpJwRhcquRnsNWtprzRr61t5JI55reSON45jCysVIBDhW KEE/e2nHXB6UAeV+F3f4veIdS1TXEgu/Cuk3bQ6VaqrJHcSh9wmkUtlmEewb XXaRIcAfMD6xfWFnqdnJZ39pBd2smN8M8YkRsEEZU8HBAP4V4/8As6XXleHt e0Oe3nhvrHUPNnSVNu3egQLg8hgYWyCBjj3x65qWmQarbrBcSXaIrhwbW7lt 2zgjlo2Ukc9M46egoA5/whoMPgjTdaszLJBosF69xZm6uAyw25ijZgCT8qLJ 5vXngk5zklz8TfBdpb3NxL4gtPIt3CNJHudZGIU4jKgiUgOpYJu27huxXnfw KWfxRpOrX+v69fatIkv2YWF3eyyIkZjO5njLlXV95ADKR+7OOelz4Mabpt1c eNdzabewHU5rdIoCpg8lidxjhwQkUgCj77BxGo/5Z5IB6g/iHTE0a01YTySW l4iPbeVBJJJMHXcuyNVLsduWIC5ABJwAcR6D4p0bxL9sGk3nnSWUvk3MLxPF JC/oyOAw6EdOoI6g48/hury6+OV/o+jahBY/2Rokdvb202nmS2jjZo3faFnT DcwgEAAgbSPkBbUtvAVzZ/E+28ZXviO0S7uENtLaWtq8C3p8pgAd075IVA2A MfugcZBNAHUa34v0Pw9cfZ9Ru5Fn+zvdNHDbyztHCpw0jiNWKICcbmwOD6Gr EHiTRbnw/FryapaDSZEDreSShIwCdvJbG07vlwcEHg88V5v8LdY1nxNper3+ m69oyyzanLPPHcWE8s43YEZcG4AQbFVVVdyhUA3Ehsamh/DCz8P6d4iTVrqD UrG/lN7HaQ6UDHYyAPloIWMoLYYADaThAMN0oA6DUfiL4R0rR7XVrzW4Fsbq WSG3lRXk81o2KuVCgkqCpG4DbyOfmGdzStVsdc0u31PTLmO5s7hN8UqdGH8w Qcgg8ggg4IrzP4D6Ppx+F5kezgkbUJZUuy9sw85QSoVi+RIuM/dwo3EY3BiZ PgJuTwVqdq1rJai21ieFYJkUSxgLGdshCqWcEkEkA8AYAAAAPVKKKKAPF7iK 1k/aotGRcyx6eWc+fBHtk8phnaBuk+QgbWw/O7/VqK9c1LVbHSLdZ7+5jgR3 EcYblpXIJCIo5dzg4VQSewNeV3Ad/wBqG0Ign2ppRJbyWmXG1vmy4AhXJ27o 9wLfKTmRwLkF0utftJXFrcPJImh6OWtYzuRYZZPL3MBvIYlJcE4XsMfKGIB3 mk+KdG1u8nsrK8/0635ms54ngnQYU7jFIFfbh1+bGOeteZ+IYNI0b9ojwxcR RabYhrK6uryRFMTH93OTJKeExwx3fe4bdxtqT46/8SGLw540sP3er6fqCwI4 4EsbK7lHIwxX5CMZAw7j+KrHjWzt9U+Ongqw1Cy+1WL2l0WjuYC8Dny3OBuY oWBVSQEBHyElsqFAOw0f4i+Edf1x9F0vW4Lm/XfiNVcB9v3tjEBX7n5ScgEj gZrY1PWrLSPKF007SS5KQ21tJcSMBjLbI1ZtoyoLYwCygnJGfK/j3a22m2/h vxaiSLqGn6nHErw7FZkw0mNzI3IaP5cggbmypzWp4xTxT4V8ff8ACYaDoH9u WE+nraXtskhadGVztMeQWVTuUlUBU7WLKDhqAO80LxHpHiaye80a+jvLdHCN IgIAYor45A52uuR2OQcEEDUrj/AHifw/4stdU1bQ55zJdXYlu7a52iSBxEkS /KM4UrECDk5O7nIIHYUAeN/CGCFviX8S7hoozOmplEkKjcqtNOWAPUAlVJHf aPSvSH8Y+HF1R9NGsWj3caSvOkT7xbrF/rDMy5EQHTLleeOted/CD/kofxO/ 7Co/9G3FV7Pw1pdn+0cbex077PaJpS3TW9pb+RAHDAKzqx2yKGCMDGBiQJxu R2oA9E8NePvC/i+4nt9C1aO6ngQPJGY3jbaTjIDqCRnAJGcZGeoq5feKNJsL ySzeae4uosedDY2kt08OQCvmLErFMg5G7GecZwa4PUt2l/tJaNLFayRRato8 kEk0aKqzOm9zuJU7iFSIcEEfJzj5TT1nUPEHw88ba1r9lp0Gs+Gr+7RtSFsW mvLIpApJdjyq4JcKxKKuAPL3DIB3l7498N2GiR61NfyNpcjyILyC1mmiBR/L OWRCAN3AJwG/hzViTxfocfhqHxEt3JPpMqbxc21vLMFUAklgikoBtOSwG0jB weK5PUrzS9W+Bet6jowvrixvbS9u1BfypUd5JJJA3K/KjlsgE5VSPnz82p4A uAfhDo01xqkcSJpgDXiTRsIFVSM7igQFAMEMp2lSGLYLEA6DS/Eekaz4fXXr K+jbS2R3+0yAxKFQkMTvAIAKnk46Vj3vxL8H6dpcep3WtRpZy3EltDKIZGEz p98x4Ul0B43rlc8ZzXF/CbRNL1r4JRW2paPBqUJluJPs4tPLeR8soKu5AaTB 2iVSu3hcgoTUnwO0fTdQ+Fey+gtL9Lm4dJop2WcKqPuSNlK/IAxLhDu5kLgj fgAHomp+KNJ0jUYtOuZp5L6WIzrbWlpLcyCMEKXKxKxVcnGTgE5x0NSaB4j0 jxTpa6lot9Hd2hcpvUFSrDqGVgCp6HBA4IPQiuThfTrL4meIG8PwX2peIrqK H+0I5pmhsbRVRPL3ttPzOp+XCyNkMPkG41z/AMLLTzvHPxMtNRgsZfNu4kuE gG+GbcZ9xKl3xuySyFjtJK8YwADvG8f+FAl7KmuWk0Fjbi5uZ4CZYokLFVBk UFd5IwEzuPYGrHhrxhoHjC3nn0HUo7xIHCSgIyMhIyMqwBwecHGDg+hrzfwF oWkW/wAcPGT21lGosEiW1DaeYvI3qN+wqFRB1AypZ1O4MRvLaHh3dp37Q3in T7a1ktLO90yO8lUooS4lUxjzU+UEDMkgPJy28k54UA7y+8UaTYXklm809xdR Y86GxtJbp4cgFfMWJWKZByN2M84zg1c0rVbHXNLt9T0y5jubO4TfFKnRh/ME HIIPIIIOCK8/+CmpQ6/4a1XxBIsh1a/1OU38jgY3AKUSM5LeUqMoUMTglscV Jr1np3w6+HXjD+ydRn+1T+Zesbi7ZpoZLjESMGVS/wB5flLZJZTlxywAOk1L x74b0i4WLUL+S3RrgWouXtZvs/m5IKefs8vIIYH5vlKsDjacdJXmek6DqXir 4W2Ol2+v6NPot1pkdvG0mjs0qKECgnFyVEqEenDr7V1ngnR/+Ef8IWOj/wBr f2r9i8yD7X0ztkYbMbmxs+5jPGzHGMAA6CiiuD8ceML6z8QaN4P8OvGuvaq+ 5pZYd62tth90oyyhnG0sF5B2EEcrkA4/4f6/plo/jtfEjR6h4ln1OaK70+2W S4e8iRSqxQxNkugPmgD+Fcb8KAR2Hg7U9K8F+DtK8P8AiLxPpsWrWduouIbu +jWSEt84jILnhVYKD0IUEYGBXn/jXw9c/CXxLpPjfw5Bd3lmqGDVxPO7tO7H mSZ9xOZC2c7dquinBJArvNLtdG+IXi208Yw28FzpmmRNBYTzWjpJPPuDGUFs bo4/upkcOZTxtUkA7yCeG6t4ri3ljmglQPHJGwZXUjIII4II5zUlFFABRRRQ AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFeZzeBvFtzceLtPudejudH15/9 HmmupzJYIS7FEhGAR8wTAkUEKCQwylemUUAZcPhzSLbw0fDsFjHFpJt2tjbI SoMbAhhkHOTk5bOSSTnPNcf4b8NeMvBOl3uhaPJo2paXG7tpUt/PJDLbhssV lVIiJAGOeCpPPIyAvolFAHN6J4Qh0bw1faWuoXbXepPNPfajEwilkuJRh5UA 4jPTaAMDA6nJOH4R8N+MPBmjr4dtpNDvtMgyLS9kaaGaPezO7SRAMr4Z+FDp kLywzkegUUAcnZeCF0/wdqWjwapdpqGpPLc3OqRs0UjXcmCZgqMu0BgvyKQM DBzkk4+t+D/Efjfw1Y6B4ml022iheGW6vbSTz5blkGG2o8KCEtkncpOPu4IY 16JRQB5/4vl8e6V4ms9W0nUdKk8PebbW0mmzoUd3llEXLhGPWRTuBGMfcbB3 U/it4N8VePbKDSdOGjW2nwXAuPOuLmXzZGCFQNqxkKBufu2flPHIr0CTSrGb VIdTmto5byBNkMsnzGEHOdmeEJDEMVwWAAOQBi5QBz/2zxh/0AtD/wDBzN/8 i1T0/wAO6lqGm+JYvExtEn1p3hB0+Vn8m1MQjSMO6g5BMjdNu52YAbiK6yig Dyvwx4J+IfhO3fQNP8TaM+ghGW3uZrJmuLYsGYskYIUne38bsMAHHVTofDf4 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 E5dmYoExuxufbllzuwegapPDvgfxf4c8Y+ItSXXLS/s9TdJ/MudwupWjyY4m IUpGh3FGZVb5QNqoSNvplFAHneieGvFWn/EjWPE9xYeHzBqyQRSKt5K09uqK qnY5hAYELkrhckLyNvMei+F/GFh8UNV8VTrpQsdViihnsotRmPl7BGok5hAd gEbAIX75GRzn0iigDxu7+FHivw54lv8AVfh54jtNOg1F2aazuYgqRDIYKoCO rAEtj5VKjgE5Jr0DSfCjQ6NqFp4g1KTXLvU0aK9upIlg3xFSgiVU+4gUscA/ ed24LGukooA8X0z4Z/EXwtqMtj4Y8aQW/h5pR5a3a+dJFHkk4jaMoGBZvulQ 5wTjoPXNK02HSNLt7CBpHSFMGSUgvK3VncgDc7MSzHuST3q5RQAV5v8AEn4a 3nivVtL8Q6FqEFhrumbfKedCySbZA6ZPIXad5+427dg8V6RRQBxdtoHirX7e S38aajpq2DpJFLp+irLGtyrBceZMzbwB8w2ptznksCVrj7L4WeNPCOqSW3gf xfHZ6DcvG8yX0ayyxt0YqvllGOOcjZngH7oNeyUUAZfhzRV8PeH7PS1nkuHh QmW4kLFp5WJaSQ7iTlnZmxk4zWpRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU UUUAFFFFABXP/wDCd+D/APoa9D/8GMP/AMVXQV434/nhj+PXgVVljScJ8+GC NtZmCgt+7JBO4AeY2eR5ZztlAPRP+E78H/8AQ16H/wCDGH/4qrmv+I9I8LaW 2pa1fR2loHCb2BYsx6BVUEsepwAeAT0BqTWbHS9W059J1eOCa1v8w+RM2PNO C2F77gFLDHI25GMZrH8Qap4a8OeF4LXxhe2L2piSNo7tGl+0lCoJEbl3fDFT yXI4JJ60AdRRWXrfiTRfDlv5+s6paWKFHdBNKFaQKMtsXq5GRwoJ5HrWPqPx L8H6Tqlvpmo61Ha3k6RuIpoZFMYf7vmZXERwQSH2kAgnAoA6yiqeq6rY6Hpd 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 orH1PxRpOkajFp1zNPJfSxGdba0tJbmQRghS5WJWKrk4ycAnOOhqPRfGGgeI tLm1HR9SjvoIELypAjNKg+brFjeCdrYG3LY4zQBuUV5foXxYtdY8fa5p5F9H YWUSRQ2g0ueaeSRXYSSkRoWjUZVSrjP3T8p3Ke81fxDpmhPaRX88gnu3ZLeC CCSeWUqu5tscasxAAyTjA4z1FAGpRWP4e8VaF4rszdaHqcF7Gv3whIePJIG5 DhlztOMgZxkcVly/E3wXDpc+pP4gtBaQ3D2xcbiXkXbuEagZkA3odyAjBznF AGxq3iPSNCuNPt9Svo4J9RuFtrSMgs0shIAAABOMkAseBkZIyK1K5fUfFPg6 f+whqN5YzSahLbz6XDNFvkLyZ8qVUILJ3AcgYPGQa1NR8SaLpN7b2N/qlpBe XDxpDbNKPNkLvsXan3iC3GcYGCTgA0AalFcv/wALF8I/8JR/wjf9twf2t5vk eTtfb5mPub8bN2eMZzu+XrxW5quq2Oh6XcanqdzHbWdum+WV+ij+ZJOAAOSS AMk0AXKK5sePvC63D293q0enToiv5eqRvYsysSAVE6oWGVIyM4xW5Y39nqdn HeWF3Bd2smdk0EgkRsEg4YcHBBH4UAWKKKKACiiigAooooAKKKKACiiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKACvG/iREb340+B7IXF2gZH3C0 uZIpFUk7iDGzMoIBBIRMgEGTAJi9kryvxN4P8beIvGvh/wAQrb+H7dNHcMLZ 7+aYS/NlvvQbEJAADBNwODk7V2gHWL4LtbTxHpWsWd3qpktPOjkSfVp5keOR OcrIX3fMqHaCg43EkqBXF/tBafZHwGdRMFot8LiKEXDQRNK0eWPlq7EOoz83 yZPB42liPWIDM1vE1xHHHOUBkSNy6q2OQGIBIz3wM+grh/ij4Y8Q+M/D50LS BpsVvI6SS3F1eTI2VJO0RohDD7pyxI6/LkKwAMf486NbXHw8vNVWytGvLd4V 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 AooooAKKKKACiiigAo