Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 23 Aug 2022 17:27:55 -0400
From:      Mark Johnston <markj@freebsd.org>
To:        "Cavallo, Joseph" <Joseph.Cavallo@stratus.com>
Cc:        "freebsd-hackers@freebsd.org" <freebsd-hackers@freebsd.org>
Subject:   Re: Quick question about geom/g_mirror.c  g_mirror_sync_stop() function
Message-ID:  <YwVGWxwoW2Ha83V%2B@nuc>
In-Reply-To: <PH0PR08MB78917AF024CEBDF8EF790D1D8C719@PH0PR08MB7891.namprd08.prod.outlook.com>
References:  <PH0PR08MB78917AF024CEBDF8EF790D1D8C719@PH0PR08MB7891.namprd08.prod.outlook.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, Aug 22, 2022 at 10:30:15PM +0000, Cavallo, Joseph wrote:
> Hi Mark,
> 
> Thank you for your response while traveling.
> 
> In g_mirror_sync_stop() it quickly calls “free(disk->d_sync.ds_bios, M_MIRROR);”. But at that point can’t these bios still be in progress in the g_mirror_disk.d_sync.ds_consumer or in the g_mirror_disk.ds_consumer?

They can, yes.  Note though that disk->d_sync.ds_bios is an array of
pointers to BIOs, not an array of BIOs, so freeing ds_bios doesn't
impact pending synchronization I/O.  g_mirror_sync_request() will notice
in the BIO_WRITE path that the sync GEOM has gone away and will free the
BIO at that point, or earlier if an I/O error occurred.  Alternately, if
the mirror itself is being destroyed, g_mirror_destroy_provider() will
free any BIOs queued for the worker thread (see the special handling of
synchronization BIOs there).

> In the g_mirror_ctl_remove() path it calls “g_mirror_event_send(disk, G_MIRROR_DISK_STATE_DESTROY, G_MIRROR_EVENT_DONTWAIT);” That leads to “g_mirror_destroy_disk()” which quickly calls “g_mirror_sync_stop()”. I can’t find where it quiesces those bios so that it can free them right then and there.  Later it does the g_mirror_kill_consumer() but that would just jump out when it got to the g_mirror_is_busy() test unless it was all quiesced (I think).
> 
> I’ve run FreeBSD 13.1 with 2 64GB SCSI disks mirror (data volume). It looks like it defaults to 2 sync bios.  I did the remove of the disk getting synched in the middle of a sync, and of course it works fine 100% of the time. It does not crash. But I’m trying to understand how that is. How does it avoid the pitfall that I think I see?
> 
> Many thanks in advance. Take your time. Enjoy your travels.
> 
> --Joe
> 
> From: Mark Johnston <markj@freebsd.org>
> Sent: Saturday, August 20, 2022 2:20 PM
> To: Cavallo, Joseph <Joseph.Cavallo@stratus.com>
> Subject: [EXTERNAL] Re: Quick question about mirror.c
> 
> 
> [EXTERNAL SENDER: This email originated from outside of Stratus Technologies. Do not click links or open attachments unless you recognize the sender and know the content is safe.]
> 
> ________________________________
> Hi Joe,
> 
> I am happy to try to answer questions about that code, but I'm traveling and might take a few days to reply. Please include freebsd-hackers@freebsd.org<mailto:freebsd-hackers@freebsd.org> in the email, in case someone else is able to answer.
> 
> Thanks,
> -Mark
> 
> On Fri., Aug. 19, 2022, 12:08 Cavallo, Joseph, <Joseph.Cavallo@stratus.com<mailto:Joseph.Cavallo@stratus.com>> wrote:
> Hi Mark,
> 
> I reside in MA, USA.
> 
> I'm using the FreeBSD Geom/mirror project that you're a contributor to.
> 
> I have a quick question about the g_mirror_sync_stop() routine. Would you be able to help?
> 
> Thx,  Joe



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?YwVGWxwoW2Ha83V%2B>