From: Philipp Reisner <philipp.reisner@linbit.com>
To: Andi Kleen <andi@firstfloor.org>
Cc: linux-kernel@vger.kernel.org, gregkh@suse.de
Subject: Re: [PATCH 02/12] DRBD: activity_log
Date: Wed, 25 Mar 2009 11:27:22 +0100 [thread overview]
Message-ID: <200903251127.23287.philipp.reisner@linbit.com> (raw)
In-Reply-To: <87bprrhzqw.fsf@basil.nowhere.org>
On Tuesday 24 March 2009 13:27:51 Andi Kleen wrote:
[...]
> > + u32 tr_number;
> > + /* u32 tr_generation; TODO */
>
> It would be difficult to "TODO" this because adding that field here would
> break the complete disk format, wouldn't it?
>
Yes, you are right. That is an ancient comment, I just removed it.
[...]
> > + ok = bio_flagged(bio, BIO_UPTODATE) && md_io.error == 0;
> > +
> > + /* check for unsupported barrier op.
> > + * would rather check on EOPNOTSUPP, but that is not reliable.
> > + * don't try again for ANY return value != 0 */
> > + if (unlikely(bio_barrier(bio) && !ok)) {
>
> That's a good example for some code that shouldn't be in upstream. If
> EOPNOTSUPP for barriers is really not reliable somewhere please just
> fix that somewhere (if it's still true and not some ancient bug), not
> add workarounds like this.
>
Ok. I will fix this, either way.
> > +int drbd_md_sync_page_io(struct drbd_conf *mdev, struct drbd_backing_dev
> > *bdev, + sector_t sector, int rw)
> > +{
> > + int hardsect, mask, ok;
> > + int offset = 0;
> > + struct page *iop = mdev->md_io_page;
> > +
> > + D_ASSERT(mutex_is_locked(&mdev->md_io_mutex));
> > +
> > + if (!bdev->md_bdev) {
> > + if (DRBD_ratelimit(5*HZ, 5)) {
>
> The kernel has standard functions for this, no need for own macros.
>
> > + ERR("bdev->md_bdev==NULL\n");
> > + dump_stack();
> > + }
>
> And a rate limited dump_stack seems weird anyways.
>
Ok, I changed that particular place to a BUG_ON(!bdev->md_bdev) .
I will etiher remove all the other DRBD_ratelimit()s we have,
or change the one of the kernel ratelemit variants.
[...]
> > + /* in case hardsect != 512 [ s390 only? ] */
> > + if (hardsect != MD_HARDSECT) {
> > + if (!mdev->md_io_tmpp) {
> > + struct page *page = alloc_page(GFP_NOIO);
>
> At least the conventional wisdom is still that block devices should
> use mempools, not alloc_page even with NOIO, otherwise they might
> not write out in all lowmem situations. There's been some VM work
> to address this, but so far nobody was sure that it is sufficient.
>
> > + if (!page)
> > + return 0;
>
> So you get a IO error or what happens here on out of memory?
>
Moved the allocation out of drbd_md_sync_page_io() into the attach
(DRBD speak for associating a backing device with a DRBD device)
code path. In case we need that ip_mpp page and we do not get it
we fail the complete attach now.
[...]
> > + if (rw == WRITE) {
> > + void *p = page_address(mdev->md_io_page);
> > + void *hp = page_address(mdev->md_io_tmpp);
>
> What happens when the page is in highmem?
>
We are sure that they are not in highmem.
md_io_tmpp was allocated with GFP_NOIO (which in turn does not contain
GFP_HIGHMEM) therefore it can not be in highmem.
md_io_page gets allocated with GFP_KERNEL (no GFP_HIGHMEM either).
[...]
> > +
> > + spin_lock_irq(&mdev->al_lock);
> > + lc_changed(mdev->act_log, al_ext);
> > + spin_unlock_irq(&mdev->al_lock);
> > + wake_up(&mdev->al_wait);
>
> The wake_up outside the lock looks a little dangerous.
>
Please share you thoughts, why this looks a little dangerous ?
[...]
> > + mutex_lock(&mdev->md_io_mutex); /* protects md_io_buffer, al_tr_cycle,
> > ... */
>
> Doing checksumming inside a lock looks nasty.
>
Well, that is a mutex, not a spinlock. We need to hold that lock here,
to reserve md_io_page. The trivial checksumming done in here is done while
copying the transaction data to the io-page.
Sorry, no way to shorten the lock holding time here, and BTW no need to.
> Didn't read further. It's a lot of code. This was not a complete review,
> just some quick comments.
Andi,
Thanks a lot for you comments!
I have updated the patch set
http://oss.linbit.com/drbd/mainline_submission/03-25/
and added one point to my todo list:
* Removed DRBD_ratelimit().
When I am done with the list, I will repost the whole set to LKML.
-Phil
--
: Dipl-Ing Philipp Reisner
: LINBIT | Your Way to High Availability
: Tel: +43-1-8178292-50, Fax: +43-1-8178292-82
: http://www.linbit.com
DRBD(R) and LINBIT(R) are registered trademarks of LINBIT, Austria.
next prev parent reply other threads:[~2009-03-25 10:27 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-03-23 15:47 [PATCH 00/12] DRBD: a block device for HA clusters Philipp Reisner
2009-03-23 15:47 ` [PATCH 01/12] DRBD: lru_cache Philipp Reisner
2009-03-23 15:47 ` [PATCH 02/12] DRBD: activity_log Philipp Reisner
2009-03-23 15:47 ` [PATCH 03/12] DRBD: bitmap Philipp Reisner
2009-03-23 15:47 ` [PATCH 04/12] DRBD: request Philipp Reisner
2009-03-23 15:48 ` [PATCH 05/12] DRBD: userspace_interface Philipp Reisner
2009-03-23 15:48 ` [PATCH 06/12] DRBD: internal_data_structures Philipp Reisner
2009-03-23 15:48 ` [PATCH 07/12] DRBD: main Philipp Reisner
2009-03-23 15:48 ` [PATCH 08/12] DRBD: receiver Philipp Reisner
2009-03-23 15:48 ` [PATCH 09/12] DRBD: proc Philipp Reisner
2009-03-23 15:48 ` [PATCH 10/12] DRBD: worker Philipp Reisner
2009-03-23 15:48 ` [PATCH 11/12] DRBD: misc Philipp Reisner
2009-03-23 15:48 ` [PATCH 12/12] DRBD: final Philipp Reisner
2009-04-08 10:17 ` [PATCH 08/12] DRBD: receiver Nikanth K
2009-04-08 15:10 ` Philipp Reisner
2009-03-23 16:51 ` [PATCH 07/12] DRBD: main Alexey Dobriyan
2009-03-23 22:26 ` Philipp Reisner
2009-04-08 10:16 ` [PATCH 04/12] DRBD: request Nikanth K
2009-04-08 10:16 ` [PATCH 03/12] DRBD: bitmap Nikanth K
2009-04-08 15:09 ` Philipp Reisner
2009-03-24 12:27 ` [PATCH 02/12] DRBD: activity_log Andi Kleen
2009-03-25 10:27 ` Philipp Reisner [this message]
2009-03-25 10:46 ` Andi Kleen
2009-03-25 10:57 ` Philipp Reisner
2009-03-23 15:58 ` [PATCH 01/12] DRBD: lru_cache Greg KH
2009-04-08 10:15 ` Nikanth K
2009-04-08 15:09 ` Philipp Reisner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200903251127.23287.philipp.reisner@linbit.com \
--to=philipp.reisner@linbit.com \
--cc=andi@firstfloor.org \
--cc=gregkh@suse.de \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.