Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 18 Feb 2015 14:30:37 -0800
From:      Mark Johnston <markj@FreeBSD.org>
To:        "Eugene M. Zheganin" <emz@norma.perm.ru>
Cc:        freebsd-dtrace@freebsd.org
Subject:   Re: io provider, b_bcount
Message-ID:  <20150218223037.GA20537@charmander.picturesperfect.net>
In-Reply-To: <54E43364.7050000@norma.perm.ru>
References:  <54E43364.7050000@norma.perm.ru>

next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, Feb 18, 2015 at 11:38:28AM +0500, Eugene M. Zheganin wrote:
> Hi.
> 

Hi Eugene,

> I'm trying to port the Solaris iotop script (not the complicated
> ksh-iottop, but rather simple iotop) to FreeBSD.
> 
> Here's the script:
> 
> #!/usr/sbin/dtrace -s
> 
> #pragma D option quiet
> 
> BEGIN {
>     printf("%-6s  %-20s  %s\n", "PID", "COMMAND", "BYTES/SEC");
>     printf("------  --------------------  ---------");
>     last = timestamp;
> }
> 
> io:::start {
>     @io[pid, execname] = sum(args[0]->b_bcount);
> }
> 
> tick-5sec {
>     trunc(@io, 10);
>     printf("\n");
>     normalize(@io, (timestamp - last) / 1000000000);
>     printa("%-6d  %-20s  %@d\n", @io);
>     trunc(@io, 0);
>     last = timestamp;
> }
> 
> It works fine on Solaris, but on FreeBSD I got the error
> 
> dtrace: failed to compile script ./iotop.old: line 12: b_bcount is not a
> member of struct bio
> 
> I figured out that since the bio struct is mentioned, I have to use the
> bio_bcount instead. Is this correct ?

Yes, that's the right thing to do. The io provider in FreeBSD doesn't
have Solaris-compatible argument types.

> 
> Second issue - when running this modified with bio_bcount script, I get
> the actual data, that seems to reflect reality, but I'm also getting
> tonnes of errors like:
> 
> dtrace: error on enabled probe ID 2 (ID 56400: io:kernel::start):
> invalid address (0x20) in action #4 at DIF offset 16
> dtrace: error on enabled probe ID 2 (ID 56400: io:kernel::start):
> invalid address (0x20) in action #4 at DIF offset 16
> dtrace: error on enabled probe ID 2 (ID 56400: io:kernel::start):
> invalid address (0x20) in action #4 at DIF offset 16
> dtrace: error on enabled probe ID 2 (ID 56400: io:kernel::start):
> invalid address (0x20) in action #4 at DIF offset 16
> dtrace: error on enabled probe ID 2 (ID 56400: io:kernel::start):
> invalid address (0x20) in action #4 at DIF offset 16
> 
> - and I want to ask - why. I get no errors on Solaris (and yes - the
> modification may be the reason). Is it safe to ignore the errors, or
> should the script be modified in some manner ?

It looks like this probe can fire with a NULL bio argument when
devstat_start_transaction() is called. In particular,
devstat_start_transaction_bio() always calls
devstat_start_transaction(), and there's a probe in both functions.

I'm not sure why this is the case. I think it's sufficient to have a
io:::start probe in devstat_start_transaction_bio(). I've cc'ed gnn, who
implemented the provider originally and might have some insight here.

The errors should be safe to ignore. You can hide them by adding a
predicate of /args[0] != NULL/ to the io:::start probe in your script.

Thanks,
-Mark



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