On 2016/08/12 8:39, Paul E. McKenney wrote: > On Fri, Aug 12, 2016 at 08:23:15AM +0900, Akira Yokosawa wrote: >> On 2016/08/11 10:54:03 -0700, Paul E. McKenney wrote: >>> On Fri, Aug 12, 2016 at 12:14:20AM +0900, Akira Yokosawa wrote: >>>> Hi Paul, >>>> >>>> As I said the other day, I added a rule for ".fig -> .eps" in Makefile and >>>> evaluate the increase in time of the first build (or builds after >>>> "make neatfreak"). >>>> >>>> To reduce the build time, 2nd patch moves several currently unused ".fig" files >>>> to ".unused" sub-directories. >>>> 3rd patch removes ".eps" files in the repository whose sources are ".fig" files. >>>> 4th patch updates ".gitignore"s to reflect the removed files. >>>> 5th patch updates FAQ-BUILD.txt to notify people that we now need the "fig2ps" >>>> package for "fig2eps" command on Ubuntu. >>>> >>>> The result of the evaluation is as follows. >>>> Time is measured by "time" command such as "$ make neatfreak; time make -j4" >>>> on a virtual machine with 4 cpus. The "real" times are collected from the output. >>>> The value in each cell is the simple average of 4 samples. >>>> >>>> |before (sec)| after (sec)| | >>>> no of thread | (1a508f6a) | (641b6a55) | diff (sec) | diff (%) >>>> 1 | 141.8 | 153.5 | 11.7 | 8.3 >>>> 2 | 83.8 | 89.9 | 6.1 | 7.3 >>>> 3 | 64.7 | 68.8 | 4.1 | 6.3 >>>> 4 | 55.7 | 59.0 | 3.3 | 5.9 >>>> >>>> As you may see, the time increase would be almost unnoticeable if you are >>>> building with more than -j4. >>>> >>>> Of course, modification of Makefile needs to be fully tested before merging. >>>> I've tested myself doing the above evaluation. >>>> >>>> If you are satisfied with the change, please consider merging. >>> >>> Hmmm... >>> >>> Pulling this, and then cloning into a new repository gets me this: >>> >>> $ make -j8 >>> SMPdesign/AllocatorPool.fig --> SMPdesign/AllocatorPool.eps >>> make: *** [SMPdesign/AllocatorPool.eps] Error 127 >>> make: *** Waiting for unfinished jobs.... >>> SMPdesign/DiningPhilosopher5.tex --> SMPdesign/DiningPhilosopher5.eps >>> >>> I get the same error if I do "make neatfreak" beforehand. >>> >>> What am I doing wrong? >> >> Does "make SMPdesign/AllocatorPool.eps" alone work? >> >> If it does, then there might be an issue in highly parallel build... >> Whew! > > Sorry, but no joy: > > $ make SMPdesign/AllocatorPool.eps > SMPdesign/AllocatorPool.fig --> SMPdesign/AllocatorPool.eps > make: *** [SMPdesign/AllocatorPool.eps] Error 127 > > Hmmm... How about if I install fig2ps? :-/ > > When I do that, it seems to build just fine, apologies for the noise! Ah! But other people would encounter the same issue. We need to check the existence of fig2eps at the begging of a build, don't we? I'll see what I can do. I'd like you to wait merging to master until I add the check. Thanks, Akira > > Thanx, Paul > >> If it does not, please apply the patch to be sent in the following mail >> on top of current "makefile-add-fig-eps-rule" branch, then do the single >> make above, and send me the content of a temporary directory named >> /tmp/xxxxxxxxxx (xxxxxxxxxx is a random name fig2eps generates) as a tar >> archive. >> >> If you do full build of perfbook after applying the patch, there will be >> a lot of temporary directories left in /tmp and it may be hard to find >> which one is that of SMPdesign/AllocatorPool.eps >> >>> >>> Thanx, Paul >>> >>>> Thanks, Akira >>>> >>>> ----- >>>> The following changes since commit 1a508f6ad8b6d4e722c8511c459ae7ae9d2591b5: >>>> >>>> Get .gitignore in right place for hash-table code (2016-08-10 16:14:18 -0700) >>>> >>>> are available in the git repository at: >>>> >>>> https://github.com/akiyks/perfbook.git makefile-add-fig-eps-rule >>>> >>>> for you to fetch changes up to 641b6a5541323d737b1e2ca31e9a805da19514f1: >>>> >>>> FAQ-BUILD.txt: Add 'fig2ps' as necessary package on Ubuntu (2016-08-11 22:50:02 +0900) >>>> >>>> ---------------------------------------------------------------- >>>> Akira Yokosawa (5): >>>> Makefile: Add .fig -> .eps rule >>>> Move unused .fig and .eps files to .unused directory >>>> Remove .eps files whose sources are .fig files >>>> Update and create .gitignore files >>>> FAQ-BUILD.txt: Add 'fig2ps' as necessary package on Ubuntu >>>> >>>> FAQ-BUILD.txt | 2 +- >>>> Makefile | 18 +- >>>> SMPdesign/.gitignore | 10 + >>>> SMPdesign/AllocatorPool.eps | 287 -- >>>> SMPdesign/LockGranularity.eps | 243 -- >>>> SMPdesign/MazeNumberPath.eps | 157 - >>>> SMPdesign/MemoryBarrierPairing.eps | 218 -- >>>> SMPdesign/ParallelFastpath.eps | 213 - >>>> SMPdesign/allocatorcache.eps | 225 -- >>>> SMPdesign/lockdeqhash.eps | 218 -- >>>> SMPdesign/lockdeqhash1R.eps | 784 ---- >>>> SMPdesign/lockdeqhashlots.eps | 479 --- >>>> SMPdesign/lockdeqpair.eps | 177 - >>>> advsync/.gitignore | 22 + >>>> advsync/.unused/MoreThanOneValue-15CPU-noresp.eps | 1306 ------- >>>> advsync/AbstractMemoryAccessModel.eps | 191 - >>>> advsync/DataDependencyNeeded.eps | 775 ---- >>>> advsync/DataDependencySupplied.eps | 738 ---- >>>> advsync/MemoryArchitecture.eps | 327 -- >>>> advsync/MemoryBarrierPairing.eps | 221 -- >>>> advsync/MoreThanOneValue-15CPU.eps | 1306 ------- >>>> advsync/MoreThanOneValue.eps | 200 - >>>> advsync/RCU-API.eps | 200 - >>>> advsync/RCUDeletion.eps | 253 -- >>>> advsync/RCUInsertion.eps | 210 - >>>> advsync/RCUReaderGP.eps | 181 - >>>> advsync/RCUReaderGPExtends.eps | 199 - >>>> advsync/RCUReplacement.eps | 414 -- >>>> advsync/ReadBarrierNeeded.eps | 673 ---- >>>> advsync/ReadBarrierSupplied.eps | 693 ---- >>>> advsync/ReadBarrierSupplied1.eps | 722 ---- >>>> advsync/ReadBarrierSupplied2.eps | 699 ---- >>>> advsync/SpeculativeLoad.eps | 603 --- >>>> advsync/SpeculativeLoadBarrier.eps | 595 --- >>>> advsync/SpeculativeLoadBarrierCancel.eps | 633 --- >>>> advsync/SplitCache.eps | 250 -- >>>> advsync/WriteBarrierOrdering.eps | 613 --- >>>> appendix/questions/.gitignore | 1 + >>>> appendix/questions/after.eps | 170 - >>>> appendix/rcuhist/{ => .unused}/linux-RCU.eps | 0 >>>> appendix/rcuhist/{ => .unused}/linux-RCUlock.eps | 0 >>>> appendix/rcuhist/{ => .unused}/rcuAPI.eps | 0 >>>> .../rcuimpl/{ => .unused}/AdvanceRCUCallbacks.fig | 0 >>>> .../rcuimpl/{ => .unused}/BigTreeClassicRCU.fig | 0 >>>> .../rcuimpl/{ => .unused}/BigTreeClassicRCUBH.fig | 0 >>>> .../{ => .unused}/BigTreeClassicRCUBHdyntick.fig | 0 >>>> appendix/rcuimpl/{ => .unused}/FlatClassicRCU.fig | 0 >>>> .../{ => .unused}/GenericRCUStateMachine.fig | 0 >>>> appendix/rcuimpl/{ => .unused}/GracePeriodBad.fig | 0 >>>> appendix/rcuimpl/{ => .unused}/RCUTreeInit.fig | 0 >>>> appendix/rcuimpl/{ => .unused}/RCUTreeLeafScan.fig | 0 >>>> appendix/rcuimpl/{ => .unused}/RCUTreeQSScan.fig | 0 >>>> appendix/rcuimpl/{ => .unused}/RCUbweBlock.fig | 0 >>>> .../{ => .unused}/RCUpreemptCounterFlip.fig | 0 >>>> appendix/rcuimpl/{ => .unused}/RCUpreemptLists.fig | 0 >>>> .../{ => .unused}/RCUpreemptListsCompare.fig | 0 >>>> .../rcuimpl/{ => .unused}/RCUpreemptStates.fig | 0 >>>> .../rcuimpl/{ => .unused}/RCUpreemptTimeline.fig | 0 >>>> .../rcuimpl/{ => .unused}/RCUpreemptValidation.fig | 0 >>>> appendix/rcuimpl/{ => .unused}/RCUrt-MBnowaste.fig | 0 >>>> appendix/rcuimpl/{ => .unused}/RCUrt-MBwaste.fig | 0 >>>> .../rcuimpl/{ => .unused}/TinyRCUCallbacks.fig | 0 >>>> appendix/rcuimpl/{ => .unused}/TreeClassicRCU.fig | 0 >>>> .../rcuimpl/{ => .unused}/TreeClassicRCUGP.fig | 0 >>>> appendix/rcuimpl/{ => .unused}/TreeMapping.fig | 0 >>>> .../rcuimpl/{ => .unused}/TreeRCUStateMachine.fig | 0 >>>> appendix/rcuimpl/{ => .unused}/srcuds.fig | 0 >>>> appendix/rcuimpl/AdvanceRCUCallbacks.eps | 316 -- >>>> appendix/rcuimpl/BigTreeClassicRCU.eps | 286 -- >>>> appendix/rcuimpl/BigTreeClassicRCUBH.eps | 305 -- >>>> appendix/rcuimpl/BigTreeClassicRCUBHdyntick.eps | 462 --- >>>> appendix/rcuimpl/FlatClassicRCU.eps | 254 -- >>>> appendix/rcuimpl/GenericRCUStateMachine.eps | 514 --- >>>> appendix/rcuimpl/GracePeriodBad.eps | 194 - >>>> appendix/rcuimpl/RCUTreeInit.eps | 490 --- >>>> appendix/rcuimpl/RCUTreeLeafScan.eps | 504 --- >>>> appendix/rcuimpl/RCUTreeQSScan.eps | 504 --- >>>> appendix/rcuimpl/RCUbweBlock.eps | 575 --- >>>> appendix/rcuimpl/RCUpreemptCounterFlip.eps | 291 -- >>>> appendix/rcuimpl/RCUpreemptLists.eps | 220 -- >>>> appendix/rcuimpl/RCUpreemptListsCompare.eps | 311 -- >>>> appendix/rcuimpl/RCUpreemptStates.eps | 4120 -------------------- >>>> appendix/rcuimpl/RCUpreemptTimeline.eps | 351 -- >>>> appendix/rcuimpl/RCUpreemptValidation.eps | 696 ---- >>>> appendix/rcuimpl/RCUrt-MBnowaste.eps | 273 -- >>>> appendix/rcuimpl/RCUrt-MBwaste.eps | 345 -- >>>> appendix/rcuimpl/TinyRCUCallbacks.eps | 233 -- >>>> appendix/rcuimpl/TreeClassicRCU.eps | 288 -- >>>> appendix/rcuimpl/TreeClassicRCUGP.eps | 730 ---- >>>> appendix/rcuimpl/TreeMapping.eps | 219 -- >>>> appendix/rcuimpl/TreeRCUStateMachine.eps | 358 -- >>>> appendix/rcuimpl/srcuds.eps | 268 -- >>>> appendix/whymb/.gitignore | 7 + >>>> appendix/whymb/MESI.eps | 293 -- >>>> appendix/whymb/cacheSB.eps | 216 - >>>> appendix/whymb/cacheSBf.eps | 247 -- >>>> appendix/whymb/cacheSBfIQ.eps | 271 -- >>>> appendix/whymb/cacheSC.eps | 150 - >>>> appendix/whymb/cacheSCwrite.eps | 170 - >>>> appendix/whymb/hostileordering.eps | 243 -- >>>> count/.gitignore | 5 + >>>> count/GlobalInc.eps | 429 -- >>>> count/GlobalTreeInc.eps | 501 --- >>>> count/PerThreadInc.eps | 421 -- >>>> count/count_lim.eps | 177 - >>>> count/globbal.eps | 331 -- >>>> cpu/.gitignore | 2 + >>>> cpu/3DI.eps | 193 - >>>> cpu/SystemArch.eps | 395 -- >>>> datastruct/.gitignore | 1 + >>>> datastruct/hashdiagram.eps | 301 -- >>>> defer/.gitignore | 10 + >>>> defer/GracePeriodGood.eps | 210 - >>>> defer/Linux_hlist.eps | 208 - >>>> defer/Linux_list.eps | 241 -- >>>> defer/Linux_list_abbr.eps | 139 - >>>> defer/QSBRGracePeriod.eps | 255 -- >>>> defer/RCUDeletion.eps | 253 -- >>>> defer/RCUListDeleteClassic.eps | 328 -- >>>> defer/RCUReplacement.eps | 470 --- >>>> defer/RCUenvAPI.eps | 214 - >>>> defer/rwlockRCUupdate.eps | 264 -- >>>> formal/.gitignore | 1 + >>>> formal/RCUpreemptStates.eps | 4120 -------------------- >>>> intro/.gitignore | 4 + >>>> intro/FourTaskCategories.eps | 261 -- >>>> intro/FourTaskOrder.eps | 321 -- >>>> intro/Generality.eps | 386 -- >>>> intro/PPGrelation.eps | 165 - >>>> locking/.gitignore | 5 + >>>> locking/DeadlockCycle.eps | 227 -- >>>> locking/LayeredLockHierarchy.eps | 222 -- >>>> locking/LocalLockHierarchy.eps | 221 -- >>>> locking/NonLocalLockHierarchy.eps | 221 -- >>>> locking/rnplock.eps | 305 -- >>>> toolsoftrade/.gitignore | 1 + >>>> toolsoftrade/shellparallel.eps | 210 - >>>> 137 files changed, 84 insertions(+), 41864 deletions(-) >>>> delete mode 100644 SMPdesign/AllocatorPool.eps >>>> delete mode 100644 SMPdesign/LockGranularity.eps >>>> delete mode 100644 SMPdesign/MazeNumberPath.eps >>>> delete mode 100644 SMPdesign/MemoryBarrierPairing.eps >>>> delete mode 100644 SMPdesign/ParallelFastpath.eps >>>> delete mode 100644 SMPdesign/allocatorcache.eps >>>> delete mode 100644 SMPdesign/lockdeqhash.eps >>>> delete mode 100644 SMPdesign/lockdeqhash1R.eps >>>> delete mode 100644 SMPdesign/lockdeqhashlots.eps >>>> delete mode 100644 SMPdesign/lockdeqpair.eps >>>> delete mode 100644 advsync/.unused/MoreThanOneValue-15CPU-noresp.eps >>>> delete mode 100644 advsync/AbstractMemoryAccessModel.eps >>>> delete mode 100644 advsync/DataDependencyNeeded.eps >>>> delete mode 100644 advsync/DataDependencySupplied.eps >>>> delete mode 100644 advsync/MemoryArchitecture.eps >>>> delete mode 100644 advsync/MemoryBarrierPairing.eps >>>> delete mode 100644 advsync/MoreThanOneValue-15CPU.eps >>>> delete mode 100644 advsync/MoreThanOneValue.eps >>>> delete mode 100644 advsync/RCU-API.eps >>>> delete mode 100644 advsync/RCUDeletion.eps >>>> delete mode 100644 advsync/RCUInsertion.eps >>>> delete mode 100644 advsync/RCUReaderGP.eps >>>> delete mode 100644 advsync/RCUReaderGPExtends.eps >>>> delete mode 100644 advsync/RCUReplacement.eps >>>> delete mode 100644 advsync/ReadBarrierNeeded.eps >>>> delete mode 100644 advsync/ReadBarrierSupplied.eps >>>> delete mode 100644 advsync/ReadBarrierSupplied1.eps >>>> delete mode 100644 advsync/ReadBarrierSupplied2.eps >>>> delete mode 100644 advsync/SpeculativeLoad.eps >>>> delete mode 100644 advsync/SpeculativeLoadBarrier.eps >>>> delete mode 100644 advsync/SpeculativeLoadBarrierCancel.eps >>>> delete mode 100644 advsync/SplitCache.eps >>>> delete mode 100644 advsync/WriteBarrierOrdering.eps >>>> create mode 100644 appendix/questions/.gitignore >>>> delete mode 100644 appendix/questions/after.eps >>>> rename appendix/rcuhist/{ => .unused}/linux-RCU.eps (100%) >>>> rename appendix/rcuhist/{ => .unused}/linux-RCUlock.eps (100%) >>>> rename appendix/rcuhist/{ => .unused}/rcuAPI.eps (100%) >>>> rename appendix/rcuimpl/{ => .unused}/AdvanceRCUCallbacks.fig (100%) >>>> rename appendix/rcuimpl/{ => .unused}/BigTreeClassicRCU.fig (100%) >>>> rename appendix/rcuimpl/{ => .unused}/BigTreeClassicRCUBH.fig (100%) >>>> rename appendix/rcuimpl/{ => .unused}/BigTreeClassicRCUBHdyntick.fig (100%) >>>> rename appendix/rcuimpl/{ => .unused}/FlatClassicRCU.fig (100%) >>>> rename appendix/rcuimpl/{ => .unused}/GenericRCUStateMachine.fig (100%) >>>> rename appendix/rcuimpl/{ => .unused}/GracePeriodBad.fig (100%) >>>> rename appendix/rcuimpl/{ => .unused}/RCUTreeInit.fig (100%) >>>> rename appendix/rcuimpl/{ => .unused}/RCUTreeLeafScan.fig (100%) >>>> rename appendix/rcuimpl/{ => .unused}/RCUTreeQSScan.fig (100%) >>>> rename appendix/rcuimpl/{ => .unused}/RCUbweBlock.fig (100%) >>>> rename appendix/rcuimpl/{ => .unused}/RCUpreemptCounterFlip.fig (100%) >>>> rename appendix/rcuimpl/{ => .unused}/RCUpreemptLists.fig (100%) >>>> rename appendix/rcuimpl/{ => .unused}/RCUpreemptListsCompare.fig (100%) >>>> rename appendix/rcuimpl/{ => .unused}/RCUpreemptStates.fig (100%) >>>> rename appendix/rcuimpl/{ => .unused}/RCUpreemptTimeline.fig (100%) >>>> rename appendix/rcuimpl/{ => .unused}/RCUpreemptValidation.fig (100%) >>>> rename appendix/rcuimpl/{ => .unused}/RCUrt-MBnowaste.fig (100%) >>>> rename appendix/rcuimpl/{ => .unused}/RCUrt-MBwaste.fig (100%) >>>> rename appendix/rcuimpl/{ => .unused}/TinyRCUCallbacks.fig (100%) >>>> rename appendix/rcuimpl/{ => .unused}/TreeClassicRCU.fig (100%) >>>> rename appendix/rcuimpl/{ => .unused}/TreeClassicRCUGP.fig (100%) >>>> rename appendix/rcuimpl/{ => .unused}/TreeMapping.fig (100%) >>>> rename appendix/rcuimpl/{ => .unused}/TreeRCUStateMachine.fig (100%) >>>> rename appendix/rcuimpl/{ => .unused}/srcuds.fig (100%) >>>> delete mode 100644 appendix/rcuimpl/AdvanceRCUCallbacks.eps >>>> delete mode 100644 appendix/rcuimpl/BigTreeClassicRCU.eps >>>> delete mode 100644 appendix/rcuimpl/BigTreeClassicRCUBH.eps >>>> delete mode 100644 appendix/rcuimpl/BigTreeClassicRCUBHdyntick.eps >>>> delete mode 100644 appendix/rcuimpl/FlatClassicRCU.eps >>>> delete mode 100644 appendix/rcuimpl/GenericRCUStateMachine.eps >>>> delete mode 100644 appendix/rcuimpl/GracePeriodBad.eps >>>> delete mode 100644 appendix/rcuimpl/RCUTreeInit.eps >>>> delete mode 100644 appendix/rcuimpl/RCUTreeLeafScan.eps >>>> delete mode 100644 appendix/rcuimpl/RCUTreeQSScan.eps >>>> delete mode 100644 appendix/rcuimpl/RCUbweBlock.eps >>>> delete mode 100644 appendix/rcuimpl/RCUpreemptCounterFlip.eps >>>> delete mode 100644 appendix/rcuimpl/RCUpreemptLists.eps >>>> delete mode 100644 appendix/rcuimpl/RCUpreemptListsCompare.eps >>>> delete mode 100644 appendix/rcuimpl/RCUpreemptStates.eps >>>> delete mode 100644 appendix/rcuimpl/RCUpreemptTimeline.eps >>>> delete mode 100644 appendix/rcuimpl/RCUpreemptValidation.eps >>>> delete mode 100644 appendix/rcuimpl/RCUrt-MBnowaste.eps >>>> delete mode 100644 appendix/rcuimpl/RCUrt-MBwaste.eps >>>> delete mode 100644 appendix/rcuimpl/TinyRCUCallbacks.eps >>>> delete mode 100644 appendix/rcuimpl/TreeClassicRCU.eps >>>> delete mode 100644 appendix/rcuimpl/TreeClassicRCUGP.eps >>>> delete mode 100644 appendix/rcuimpl/TreeMapping.eps >>>> delete mode 100644 appendix/rcuimpl/TreeRCUStateMachine.eps >>>> delete mode 100644 appendix/rcuimpl/srcuds.eps >>>> create mode 100644 appendix/whymb/.gitignore >>>> delete mode 100644 appendix/whymb/MESI.eps >>>> delete mode 100644 appendix/whymb/cacheSB.eps >>>> delete mode 100644 appendix/whymb/cacheSBf.eps >>>> delete mode 100644 appendix/whymb/cacheSBfIQ.eps >>>> delete mode 100644 appendix/whymb/cacheSC.eps >>>> delete mode 100644 appendix/whymb/cacheSCwrite.eps >>>> delete mode 100644 appendix/whymb/hostileordering.eps >>>> delete mode 100644 count/GlobalInc.eps >>>> delete mode 100644 count/GlobalTreeInc.eps >>>> delete mode 100644 count/PerThreadInc.eps >>>> delete mode 100644 count/count_lim.eps >>>> delete mode 100644 count/globbal.eps >>>> create mode 100644 cpu/.gitignore >>>> delete mode 100644 cpu/3DI.eps >>>> delete mode 100644 cpu/SystemArch.eps >>>> create mode 100644 datastruct/.gitignore >>>> delete mode 100644 datastruct/hashdiagram.eps >>>> create mode 100644 defer/.gitignore >>>> delete mode 100644 defer/GracePeriodGood.eps >>>> delete mode 100644 defer/Linux_hlist.eps >>>> delete mode 100644 defer/Linux_list.eps >>>> delete mode 100644 defer/Linux_list_abbr.eps >>>> delete mode 100644 defer/QSBRGracePeriod.eps >>>> delete mode 100644 defer/RCUDeletion.eps >>>> delete mode 100644 defer/RCUListDeleteClassic.eps >>>> delete mode 100644 defer/RCUReplacement.eps >>>> delete mode 100644 defer/RCUenvAPI.eps >>>> delete mode 100644 defer/rwlockRCUupdate.eps >>>> create mode 100644 formal/.gitignore >>>> delete mode 100644 formal/RCUpreemptStates.eps >>>> create mode 100644 intro/.gitignore >>>> delete mode 100644 intro/FourTaskCategories.eps >>>> delete mode 100644 intro/FourTaskOrder.eps >>>> delete mode 100644 intro/Generality.eps >>>> delete mode 100644 intro/PPGrelation.eps >>>> create mode 100644 locking/.gitignore >>>> delete mode 100644 locking/DeadlockCycle.eps >>>> delete mode 100644 locking/LayeredLockHierarchy.eps >>>> delete mode 100644 locking/LocalLockHierarchy.eps >>>> delete mode 100644 locking/NonLocalLockHierarchy.eps >>>> delete mode 100644 locking/rnplock.eps >>>> create mode 100644 toolsoftrade/.gitignore >>>> delete mode 100644 toolsoftrade/shellparallel.eps >>>> >>> >>> >> > > -- To unsubscribe from this list: send the line "unsubscribe perfbook" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html