looks good to me, Marcel. thanks for picking this up after the long time since we filed that bug!
On Fri, 16 Oct 2009 10:36:15 +0200, Marcel Telka <Marcel.Telka at sun.com> wrote: > Hi all, > > Please code review the following fix: > http://cr.opensolaris.org/~aragorn/6577647-nfs-intr/ > > Background > ========== > > Please read the description for the CR at > http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6577647 > > The fix just use cv_wait_sig() in case when the "intr" mount flag is active. > The fix is inspired by nfs_rw_enter_sig() implementation. > > > Unit Test > ========= > > Here is unit test for x86. I've got similar results on sparc. > > > # uname -a > SunOS va64-v20zh-prg06 5.11 onnv-bugfixes i86pc i386 i86pc > # export SERVER=v4u-150a-prg06.czech > # ssh r...@$server "mkdir /export/test; chmod 777 /export/test; share > /export/test" > # cd /tmp > # mkdir test2 test3 test4 > # mount -o vers=2 $SERVER:/export/test `pwd`/test2 > # mount -o vers=3 $SERVER:/export/test `pwd`/test3 > # mount -o vers=4 $SERVER:/export/test `pwd`/test4 > # mkfile 1g `pwd`/test2/test2 & > [1] 4220 > # mkfile 1g `pwd`/test3/test3 & > [2] 4222 > # mkfile 1g `pwd`/test4/test4 & > [3] 4224 > # echo "::pgrep mkfile|::walk thread|::findstack" | mdb -k > stack pointer for thread ffffff02d28b78a0: ffffff000f742b50 > [ ffffff000f742b50 _resume_from_idle+0xf1() ] > ffffff000f742b80 swtch+0x147() > ffffff000f742be0 cv_wait_sig+0x14a() > ffffff000f742d70 nfs4_write+0x3dd() > ffffff000f742de0 fop_write+0x6b() > ffffff000f742e90 write+0x2e2() > ffffff000f742ec0 write32+0x22() > ffffff000f742f10 sys_syscall32+0xff() > stack pointer for thread ffffff02d29cd8c0: ffffff0010ba9b60 > [ ffffff0010ba9b60 _resume_from_idle+0xf1() ] > ffffff0010ba9b90 swtch+0x147() > ffffff0010ba9bf0 cv_wait_sig+0x14a() > ffffff0010ba9d70 nfs3_write+0x371() > ffffff0010ba9de0 fop_write+0x6b() > ffffff0010ba9e90 write+0x2e2() > ffffff0010ba9ec0 write32+0x22() > ffffff0010ba9f10 sys_syscall32+0xff() > stack pointer for thread ffffff02d2c57c80: ffffff001041cb70 > [ ffffff001041cb70 _resume_from_idle+0xf1() ] > ffffff001041cba0 swtch+0x147() > ffffff001041cc00 cv_wait_sig+0x14a() > ffffff001041cd70 nfs_write+0x34b() > ffffff001041cde0 fop_write+0x6b() > ffffff001041ce90 write+0x2e2() > ffffff001041cec0 write32+0x22() > ffffff001041cf10 sys_syscall32+0xff() > # ssh r...@$server "svcadm disable svc:/network/nfs/server:default" > # echo "::pgrep mkfile|::walk thread|::findstack" | mdb -k > stack pointer for thread ffffff02d28b78a0: ffffff000f742b50 > [ ffffff000f742b50 _resume_from_idle+0xf1() ] > ffffff000f742b80 swtch+0x147() > ffffff000f742be0 cv_wait_sig+0x14a() > ffffff000f742d70 nfs4_write+0x3dd() > ffffff000f742de0 fop_write+0x6b() > ffffff000f742e90 write+0x2e2() > ffffff000f742ec0 write32+0x22() > ffffff000f742f10 sys_syscall32+0xff() > stack pointer for thread ffffff02d29cd8c0: ffffff0010ba9b60 > [ ffffff0010ba9b60 _resume_from_idle+0xf1() ] > ffffff0010ba9b90 swtch+0x147() > ffffff0010ba9bf0 cv_wait_sig+0x14a() > ffffff0010ba9d70 nfs3_write+0x371() > ffffff0010ba9de0 fop_write+0x6b() > ffffff0010ba9e90 write+0x2e2() > ffffff0010ba9ec0 write32+0x22() > ffffff0010ba9f10 sys_syscall32+0xff() > stack pointer for thread ffffff02d2c57c80: ffffff001041cb70 > [ ffffff001041cb70 _resume_from_idle+0xf1() ] > ffffff001041cba0 swtch+0x147() > ffffff001041cc00 cv_wait_sig+0x14a() > ffffff001041cd70 nfs_write+0x34b() > ffffff001041cde0 fop_write+0x6b() > ffffff001041ce90 write+0x2e2() > ffffff001041cec0 write32+0x22() > ffffff001041cf10 sys_syscall32+0xff() > # pkill -INT mkfile > # echo "::pgrep mkfile|::walk thread|::findstack" | mdb -k > # > > > > Thank you. > -- frankB It is always possible to agglutinate multiple separate problems into a single complex interdependent solution. In most cases this is a bad idea.