Message ID | 20201022051537.2286402-3-david@fromorbit.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | repair: Phase 6 performance improvements | expand |
On Thu, Oct 22, 2020 at 04:15:32PM +1100, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > To enable phase 6 parallelisation, we need to protect the bad inode > list from concurrent modification and/or access. Wrap it with a > mutex and clean up the nasty typedefs. > > Signed-off-by: Dave Chinner <dchinner@redhat.com> /methinks the typedef removal ought to be a separate commit, but otherwise: Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> --D > --- > repair/dir2.c | 32 +++++++++++++++++++++----------- > 1 file changed, 21 insertions(+), 11 deletions(-) > > diff --git a/repair/dir2.c b/repair/dir2.c > index eabdb4f2d497..23333e59a382 100644 > --- a/repair/dir2.c > +++ b/repair/dir2.c > @@ -20,40 +20,50 @@ > * Known bad inode list. These are seen when the leaf and node > * block linkages are incorrect. > */ > -typedef struct dir2_bad { > +struct dir2_bad { > xfs_ino_t ino; > struct dir2_bad *next; > -} dir2_bad_t; > +}; > > -static dir2_bad_t *dir2_bad_list; > +static struct dir2_bad *dir2_bad_list; > +pthread_mutex_t dir2_bad_list_lock = PTHREAD_MUTEX_INITIALIZER; > > static void > dir2_add_badlist( > xfs_ino_t ino) > { > - dir2_bad_t *l; > + struct dir2_bad *l; > > - if ((l = malloc(sizeof(dir2_bad_t))) == NULL) { > + l = malloc(sizeof(*l)); > + if (!l) { > do_error( > _("malloc failed (%zu bytes) dir2_add_badlist:ino %" PRIu64 "\n"), > - sizeof(dir2_bad_t), ino); > + sizeof(*l), ino); > exit(1); > } > + pthread_mutex_lock(&dir2_bad_list_lock); > l->next = dir2_bad_list; > dir2_bad_list = l; > l->ino = ino; > + pthread_mutex_unlock(&dir2_bad_list_lock); > } > > int > dir2_is_badino( > xfs_ino_t ino) > { > - dir2_bad_t *l; > + struct dir2_bad *l; > + int ret = 0; > > - for (l = dir2_bad_list; l; l = l->next) > - if (l->ino == ino) > - return 1; > - return 0; > + pthread_mutex_lock(&dir2_bad_list_lock); > + for (l = dir2_bad_list; l; l = l->next) { > + if (l->ino == ino) { > + ret = 1; > + break; > + } > + } > + pthread_mutex_unlock(&dir2_bad_list_lock); > + return ret; > } > > /* > -- > 2.28.0 >
On Thu, Oct 22, 2020 at 04:15:32PM +1100, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > To enable phase 6 parallelisation, we need to protect the bad inode > list from concurrent modification and/or access. Wrap it with a > mutex and clean up the nasty typedefs. The patch itself looks good, but if you touch this code anyway, the linked list here seems like an incredibly suboptimal data structure. Even just a simple array that gets realloced would seems better.
diff --git a/repair/dir2.c b/repair/dir2.c index eabdb4f2d497..23333e59a382 100644 --- a/repair/dir2.c +++ b/repair/dir2.c @@ -20,40 +20,50 @@ * Known bad inode list. These are seen when the leaf and node * block linkages are incorrect. */ -typedef struct dir2_bad { +struct dir2_bad { xfs_ino_t ino; struct dir2_bad *next; -} dir2_bad_t; +}; -static dir2_bad_t *dir2_bad_list; +static struct dir2_bad *dir2_bad_list; +pthread_mutex_t dir2_bad_list_lock = PTHREAD_MUTEX_INITIALIZER; static void dir2_add_badlist( xfs_ino_t ino) { - dir2_bad_t *l; + struct dir2_bad *l; - if ((l = malloc(sizeof(dir2_bad_t))) == NULL) { + l = malloc(sizeof(*l)); + if (!l) { do_error( _("malloc failed (%zu bytes) dir2_add_badlist:ino %" PRIu64 "\n"), - sizeof(dir2_bad_t), ino); + sizeof(*l), ino); exit(1); } + pthread_mutex_lock(&dir2_bad_list_lock); l->next = dir2_bad_list; dir2_bad_list = l; l->ino = ino; + pthread_mutex_unlock(&dir2_bad_list_lock); } int dir2_is_badino( xfs_ino_t ino) { - dir2_bad_t *l; + struct dir2_bad *l; + int ret = 0; - for (l = dir2_bad_list; l; l = l->next) - if (l->ino == ino) - return 1; - return 0; + pthread_mutex_lock(&dir2_bad_list_lock); + for (l = dir2_bad_list; l; l = l->next) { + if (l->ino == ino) { + ret = 1; + break; + } + } + pthread_mutex_unlock(&dir2_bad_list_lock); + return ret; } /*