What is wrong with dtrace's stack()?

Lev Serebryakov lev at FreeBSD.org
Wed Oct 24 16:10:49 UTC 2018


On 24.10.2018 18:48, Ryan Stone wrote:
> sosend_generic+0x112c is the return address, so it's one instruction
> after the call instruction that called lock_delay.
  Yes, but this instruction (+0x112b) calls real protocol send function
via function pointer.

> What's the line number of sosend_generic+0x112b?

 It is here, uipc_socket.c:1589:

	error = (*so->so_proto->pr_usrreqs->pru_send)(so,
	    (flags & MSG_OOB) ? PRUS_OOB :
	/*
	 * If the user set MSG_EOF, the protocol understands
	 * this flag and nothing left to send then use
	 * PRU_SEND_EOF instead of PRU_SEND.
	 */
	    ((flags & MSG_EOF) &&
	     (so->so_proto->pr_flags & PR_IMPLOPCL) &&
	     (resid <= 0)) ?
		PRUS_EOF :
	/* If there is more to send set PRUS_MORETOCOME. */
	    (flags & MSG_MORETOCOME) ||
	    (resid > 0 && space > 0) ? PRUS_MORETOCOME : 0,
	    top, addr, control, td);

 I have these three DIFFERENT stack, which should be one for sure, as it
is confirmed by custom SDT probes now (I've added them and checked).
Addresses are different from previous examples due to some code was
shifted by SDT probes. 26462 times stack is Ok, but 4068+3993 times some
frames are lost. Same address could not call both tcp_usr_send() and
ia32_pause() and lock_delay(). Really, it should be one stack trace!

              kernel`lock_delay+0x72
              kernel`sosend_generic+0xf61
              kernel`sosend+0x79
              kernel`soo_write+0x6b
              kernel`fo_write+0x4a
              kernel`dofilewrite+0xcd
              kernel`kern_writev+0x79
              kernel`sys_write+0x8f
              kernel`syscallenter+0x774
              kernel`amd64_syscall+0x1b
              kernel`0xffffffff80cedfbd
             3993

              kernel`ia32_pause+0x7
              kernel`sosend_generic+0xf61
              kernel`sosend+0x79
              kernel`soo_write+0x6b
              kernel`fo_write+0x4a
              kernel`dofilewrite+0xcd
              kernel`kern_writev+0x79
              kernel`sys_write+0x8f
              kernel`syscallenter+0x774
              kernel`amd64_syscall+0x1b
              kernel`0xffffffff80cedfbd
             4068

              kernel`ia32_pause+0x6
              kernel`tcp_usr_send+0x131
              kernel`sosend_generic+0xf61
              kernel`sosend+0x79
              kernel`soo_write+0x6b
              kernel`fo_write+0x4a
              kernel`dofilewrite+0xcd
              kernel`kern_writev+0x79
              kernel`sys_write+0x8f
              kernel`syscallenter+0x774
              kernel`amd64_syscall+0x1b
              kernel`0xffffffff80cedfbd
            26462

> On Tue, Oct 23, 2018 at 5:34 PM Lev Serebryakov <lev at freebsd.org> wrote:
>>
>> Hello Ryan,
>>
>> Monday, October 22, 2018, 11:50:29 PM, you wrote:
>>
>>> Adding -fno-optimize-sibling-calls to the compiler flags will eliminate the TCO.
>>  Stacks are better but still strange. For example I have such stack (which I
>>  like better than previous):
>>
>>  kernel`lock_delay+0x72
>>  kernel`sosend_generic+0x112c
>>  kernel`sosend+0x79
>>  kernel`soo_write+0x6b
>>  kernel`fo_write+0x4a
>>  kernel`dofilewrite+0xcd
>>  kernel`kern_writev+0x79
>>  kernel`sys_write+0x8f
>>  kernel`syscallenter+0x774
>>  kernel`amd64_syscall+0x1b
>>  kernel`0xffffffff80cebf6d
>>
>> According to addr2line `sosend_generic+0x112c' is
>>
>> https://svnweb.freebsd.org/base/head/sys/kern/uipc_socket.c?revision=339419&view=markup#l1579
>>
>>  Which is call to protocol-specific send function. Where is this function
>> (it should be tcp for sure)?!
>>
>> --
>> Best regards,
>>  Lev                            mailto:lev at FreeBSD.org
>>
> _______________________________________________
> freebsd-hackers at freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> To unsubscribe, send any mail to "freebsd-hackers-unsubscribe at freebsd.org"
> 


-- 
// Lev Serebryakov

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 963 bytes
Desc: OpenPGP digital signature
URL: <http://lists.freebsd.org/pipermail/freebsd-hackers/attachments/20181024/800d6b3e/attachment.sig>


More information about the freebsd-hackers mailing list