All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Akira Yokosawa <akiyks@gmail.com>
Cc: perfbook@vger.kernel.org
Subject: Re: [RFT GIT PULL] Makefile: Add ".fig -> .eps" rule
Date: Thu, 11 Aug 2016 10:54:03 -0700	[thread overview]
Message-ID: <20160811175403.GB3482@linux.vnet.ibm.com> (raw)
In-Reply-To: <2d788653-610c-bc99-0d70-f86b96056c7e@gmail.com>

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?

							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
> 


  reply	other threads:[~2016-08-11 22:28 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-08-11 15:14 [RFT GIT PULL] Makefile: Add ".fig -> .eps" rule Akira Yokosawa
2016-08-11 17:54 ` Paul E. McKenney [this message]
2016-08-11 23:23   ` Akira Yokosawa
2016-08-11 23:24     ` Akira Yokosawa
2016-08-11 23:39     ` Paul E. McKenney
2016-08-11 23:47       ` Akira Yokosawa
2016-08-12  0:11         ` Paul E. McKenney
2016-08-12  1:56         ` [RFT GIT PULL v2] " Akira Yokosawa
2016-08-14  2:16           ` Paul E. McKenney

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160811175403.GB3482@linux.vnet.ibm.com \
    --to=paulmck@linux.vnet.ibm.com \
    --cc=akiyks@gmail.com \
    --cc=perfbook@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.