Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 1 Jul 2010 16:09:36 GMT
From:      Jimmy Olgeni <olgeni@FreeBSD.org>
To:        FreeBSD-gnats-submit@FreeBSD.org
Cc:        rnoland@FreeBSD.org
Subject:   bin/148296: [zfs] [loader] Very slow probe in /usr/src/sys/boot/zfs/zfs.c
Message-ID:  <201007011609.o61G9aC7057520@freefall.freebsd.org>
Resent-Message-ID: <201007011610.o61GA6M8057555@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         148296
>Category:       bin
>Synopsis:       [zfs] [loader] Very slow probe in /usr/src/sys/boot/zfs/zfs.c
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Thu Jul 01 16:10:06 UTC 2010
>Closed-Date:
>Last-Modified:
>Originator:     Jimmy Olgeni
>Release:        FreeBSD 8.1-RC1 i386
>Organization:
>Environment:
System: FreeBSD backoffice 8.1-RC1 FreeBSD 8.1-RC1 #0: Fri Jun 25 21:42:58 CEST 2010 root@backoffice:/usr/obj/usr/src/sys/RELENG_8.i386 i386
>Description:

Code in /usr/src/sys/boot/zfs/zfs.c (zfs_dev_init) probes all
possible disks/partitions to reconstruct ZFS pools.

Until rev 198420 it used to probe 4 partitions, which caused no
harm. However, with rev 198420 it started to probe all 128 possible
GPT partitions, causing very long boot times.

The problem is that for each possible GPT partition (diskNpM) the
code tries to fall back to a MBR slice (diskNsM).

When the code falls back to probing slices it actually ignores the
fact that the diskNpM partition could not be opened, and keeps
probing missing partitions up to index 128 (which takes a while).

If the partition index is > 4, the code tries to probe slices that
cannot possibly exist (diskNs5, ...), thus doubling the already
long processing time.

>How-To-Repeat:
>Fix:

Since we are looking for boot partitions, I think it should be safe
to assume that there are no empty partitions before them.

I moved slice probing into a separate loop to avoid any issues with
fallback code.

With the attached patch my 8.1-RC1 zfs-only server got back its old
boot time.

*** zfs.c.orig	Thu Jul  1 17:14:42 2010
--- zfs.c	Thu Jul  1 17:40:03 2010
***************
*** 413,427 ****
  		if (vdev_probe(vdev_read, (void*) (uintptr_t) fd, 0))
  			close(fd);
  
  		for (slice = 1; slice <= 128; slice++) {
  			sprintf(devname, "disk%dp%d:", unit, slice);
  			fd = open(devname, O_RDONLY);
! 			if (fd == -1) {
! 				sprintf(devname, "disk%ds%d:", unit, slice);
! 				fd = open(devname, O_RDONLY);
! 				if (fd == -1)
! 					continue;
! 			}
  			if (vdev_probe(vdev_read, (void*) (uintptr_t) fd, 0))
  				close(fd);
  		}
--- 413,432 ----
  		if (vdev_probe(vdev_read, (void*) (uintptr_t) fd, 0))
  			close(fd);
  
+ 		for (slice = 1; slice <= 4; slice++) {
+ 			sprintf(devname, "disk%ds%d:", unit, slice);
+ 			fd = open(devname, O_RDONLY);
+ 			if (fd == -1)
+ 				continue;
+ 			if (vdev_probe(vdev_read, (void*) (uintptr_t) fd, 0))
+ 				close(fd);
+ 		}
+ 
  		for (slice = 1; slice <= 128; slice++) {
  			sprintf(devname, "disk%dp%d:", unit, slice);
  			fd = open(devname, O_RDONLY);
! 			if (fd == -1)
! 				break;
  			if (vdev_probe(vdev_read, (void*) (uintptr_t) fd, 0))
  				close(fd);
  		}
>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201007011609.o61G9aC7057520>