pidhash: fork()+exit()+waitpid() in *constant time*

Alexander Kjeldaas (astor@guardian.no)
Sun, 22 Mar 1998 02:38:08 +0100


--SLDf9lqlvOQaIe6s
Content-Type: text/plain; charset=us-ascii

We have done some initial measurements on a new scheme for hashing
process groups and session ids. This removes all uses of for_each_task
in fork and exit [we did a new version of get_pid, it might be faster
or slower than the original - it's hard to say]. The initial
measurements shows that in 2.1.90, a program doing fork and waiting on
the child (which only does exit()), behaves _linearly_ with the number
of other processes on the system. 2.1.90 with a new "pidhash" scheme
doesn't have this weakness and runs out test in _constant_ time. This
means that the overhead of having 2000 running processes have no
effect on fork(), exit() or waitpid().

median times on a ppro300/128MB, new scheme (2.1.90+pidhash+mmrepair):
fork()+exit()+waitpid() = 49089 cycles running 10 background processes.
fork()+exit()+waitpid() = 50194 cycles running 2000 background processes.

median times on a ppro300/128MB, old scheme (2.1.90+mmrepair):
fork()+exit()+waitpid() = 52923 cycles running 10 background processes.
fork()+exit()+waitpid() = 271301 cycles running 2000 background processes.

[full graph: ftp://ftp.guardian.no/pub/free/linux/pidhash.gif ]

The new pidhash scheme uses the fact that a process is a member of a
process group which in turn is a member of a session. The tasks in the
tasklist are sorted so that all processes in the same process group
are grouped together, and process groups belonging to a session are
grouped together. The first task in a pgrp or session is called the
"fake" pgrp/session-leader. In many cases, the fake session-leader
will be the same as the real leader, and this might be enforced in a
later version of the patch.

pids, pgrps and sessions are all hashed in the _same_ hashtable. This
means that a process calling setsid() will not get any extra
hash-entries since its pid is already hashed. When a real session
leader dies, and there is still tasks in the session, a new fake [in
this case a real "fake"] task is hashed in the original session's
place. A process can thus have a maximum of 3 hashentries in the
pidhashtable by having pid!=pgrp!=session and being fake session
leader and fake pgrp leader.

The following new functions are defined:

for_each_task_in_pgrp(p, pgrp) - traverse a pgrp
for_each_task_in_session(p, session) - traverse a session
find_task_by_pgrp(pgrp) - find fake pgrp leader
find_task_by_session(session) - find fake session leader

On fork, we link the new task after its parent instead of at the end
of the list. On setpgid and setsid, we so some trickery to move the
task in the tasklist. In many cases, we don't move the task at all
(first in a pgrp, last in a pgrp, first in a session and last in a
session are candidates for this optimization).

To remove one of the for_each_tasks in exit required a different
change. When a task is ptraced, the parent changes to the ptracing
process. The tasks sibling-pointers are destroyed (or relinked into
the new ptracing parent process) which makes the parent-child tree
implemented by pointers in task_struct unreliable as information about
your own children. When a process dies and we set its children's
parent to init, we thus have to do a for_each_task instead of using
these unreliable pointers. To fix this problem, we introduce a member
in the task_struct called 'ptraced_children' which indicates the
number of children currently being ptraced. In most cases this will be
0 and we can use the child-pointers and only have to do a
for_each_task in the rare case when a child is ptraced.

What we "really" wanted to do was to implement random pids, but the
previous scheme made it difficult to implement them efficiently :-)
With the new scheme we only have to look in the pidhash to see if a
pid is taken or not. You're not allowed to allocate a pid which is
used by a process group or a session leader, so in the old scheme we
had to traverse all tasks to double check.

astor

-- 
 Alexander Kjeldaas, Guardian Networks AS, Trondheim, Norway
 http://www.guardian.no/

--SLDf9lqlvOQaIe6s Content-Type: application/x-gunzip Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="pidhash-6.gz"

H4sICIs4FDUCA3BpZGhhc2gtNgDsPWtz2ziSn+Vf0fZcspIl2Xr5JY2TcWI58Y1fFTs7e7vJ sWiRsliWJR5Jxc453t9+3Q2ABElQ8mNm9q7qPCmJIrqBRr/RADmONxxCfRbA2JvM7nYarfVj +9odemNX3YlvLNXr9TxY6TfXgWM7gGYTGs3uRqfb2Ibmzs72UrVazfWRQCPQVrez2W01BfQv v0C92axtQZU/f/llCX7Cf3AwDeDzGUx9N7AjbzoJ4f3p8XH/5AIuPh6ew+nnixqE3o0//g6h G0Xe5ArOj89gFxpwO538JcLP4Jr6qovbzaXqT+oKlmCt/7ez008X1t7RkfXXvU+He++O+udd bCF6tjeIHv5keiCM7IljBw68Pzja+3DOJC7VxQ/ssf6bPR7jZxgF3iCq+8E0mkbffTeE+mkL 6sPpjRfVh4F949b9qTeJ3GCpmiDvnx3uf9w7/2jt9999/vCcznA+3tBxh8iik4PDD9b7s7Ml SSp0d+HfyuK6AvU7GFSrS05O+HYwGK177e3N9Ws3mLjjdT8K7IG7NoglWQiRVo9CsNLFaCY0 oEX60tjqthp5fSlGP7cjRie92e52OqhDiQK1dzZrO1ClL1RHklmpVJpNQu9qgno3nqJyDMf2 VdgjVmHTbeBFrjWeDq4tL/iv0P7mll9Hdng99sKIb9cEfKW3VEVwO0KmDyxvMii/Hoy8sVN/ 41s+kobfTJ9j8e3AnSAGDfCpf3z61751dHjy63mZ22RDCh2lP5gFiBX1lurYeN6/yKBU9bvW 3sFF/5Noq4HqKXC/WUS7hFbKdL53cnjxHz1turOJmnDghtE0KJ4z4jzQR+hOHAuZWD4//HB+ cXomB61BE4GI7xubLeL7xman1txUfL9Fm7dmOMNgOnDD0DR9986LrMHUcZEDjh3ZvSdLRZeL 4+pymRYKhlC8IZQlWuDaziPw4GdoVO4ZueQHaHDX5RU3CKZBF7KwBAq3I7xw3MjGu5OrL5MV ObKiFr3V4lFrDYn18ER1SvX7v06rSuurcIPqAeEscCEa4QXyCGNOGLk+XHoReCFMphG59DVY XWec6MbHmV25kYVuGIcic1bk9g+OrNODA5xMBV7DPy8+7Z1Z5Ot6RT4u9PFr/eZm3Q6/TwZO 1sHlmg3eLQdTupi58O/2BJptaDS6zY1up13g2vK4WmBstbrNRrfTSvxaq71Z24YqfYlQxDxB HQSBX/429RxYnU1moetUluAeBS49Sv1NiMaHgZMiXk+/718FvrhZRQuPLOFprWhEBmFJLAsD nkWQZZZcyJo/LMedDKY3NzVYEWSsCBjvCkP9WOi3grskHUDaeoCi5x9A4Y08sz0OhYgDd2CP B+RofHQ4HklXoFfmi3Gzs0CQaYAiUaahDMLszBNmBjsjzmacFf2fE+fzJZqXmRN439wgXLf9 ZqPRWHecb5q8TI1pWZkgOCE4cC8pIWi0u63tbquVl5MRM2dyzS0tldjYIRnRlyYj9DyRN2BR YR+WY7s308m/XFwJKdICfW8Sx09NZCibG/TJ3PQSUy0WLIOv3zgGsSZNZqEm7Wx6LJgGtNro RLvNdrFINbyMQFvdzk4i0J3tJgmUvoRA74kBUTAbRHDjSMbDqvzeBTu4ojTxTxZlTAlLEgFZ jKLHstEPKj4MRnawHkXfLW9q4H6q1SyAFEgqTW9121tzZZBG1VJ0tMj2drfdScSwgcs7ShWb JA3OFBEv5mG9KWbNnKOpZ7KICjF+OA0sF9MqTkzKfgVvAXBG52tCinPq+F6F0yCEwRFxrJPP R0ckslR3mNwriZX9mqGLaq4HSa1IgPL0AqZuc8QWDkKPPyxOJg2iy0GYxZcD00XY3Om22/Fa 2yTCPHramho73aYWwppbW5zy87ewp5KI4pzT39xosRuN6IlmBPLvkdak/tZXk2tYhYPDvx33 yy4unyuYY2JGif/CCP0d2CK/Bbk0gemQk9DphJJR1F4H/Tnd8CbhzdRZS/V6QT1NXNcJIZrC pQt2RDk+Mgt/kvD/0fhKiBGSu2YQ/BBd1mw4dHVRa/fSwtUaMuLc2Ow2DAtnHUG3Q0xAGt22 5g6bOw1OQvg7FmDJ8UJ/bFMt5carhzYzBDOxcA1OMB1HEYxhgC7Tw+9oNJ1djdbW1gCU8P9s b3k9HM/CkUxULh3+ZUXhtb6gBrMMyDqd9fDbIC0G7XZOElpb6SDwYN8dID9ZGB1MH4i3W1lh 6DgZg9roNjW/uMXS4E+WhVw9l19zD7TkCSIZEvIW9jS2/w6MZ6JUiMI04drDLCHwB97UMScI yIrJMHToI8fzVEOO66nW0vlswll5a4P43thCt2Y0gjRWjvN60WhH5AUqLSgdn+5bhyfvrc/n fev96eeTi14+DL9cCC8WAc1QSWA6dmaU2YEW9IZh/Q3f7PFy+9yNQMCgm2qsgVlM3mQwnjnu Ot/AcIBubW0U89XYmhaYESRVtNuhhG5jMy+1haitBhnaRivlxGqb7MNqzQ1Zd7qH+/tG7eGh BvjvC905Pzs8sY5O3/9qfT6hr/4+x+SqTP5GdjjyPTIx/kklHnPL6sS9i3rFzas+lUsQ4CdR hU3VcxGNVg3oUr3oO8HQEneYdMbJh7ymOEO/EeyB7BUMMJi9olQxSIUYgQIXiQkcqqQ5UAeH C9/RdDYYiZj8bTrGdQvV9KkESosYt0dKUW/CbBLMJhP7cuzWoAHJ9ZsGwk1932WDFqvWhli1 7sTFVQNdq7LmVKOr+GKgLr6H6moacmVKOhDkFfMT+7oUew/X9pXLtZ+6eRjPIXhLyMQMEwMp wRRIToI9VXKykBfl6n/JrERhPs4MvqKoAoyu+vTMXET5E6TFPOL1aKtFqt5ud2qYifN2BFLq YYA+PDm8YPWm/QhBG5CTN88lhSXb4J4y2RqIz0YNXns4V86H0YYaNGVcIz4GV0NMGLUkErNV EIgXe+e/UipGq2XiTEieyed8a+gFoWCE0IOaVGI7YvzvU/RV09sJBF54vbwG7+zQ3UVyx96N F+027ppD+oPybuv4XUVwjUssuIrfkHEVhYLSBjcarBH3S42a+o98BbaGM98fA3rfcHWdWEG+ RLVRusiyo7ZkqjXtktmQfCBiXQzJyo0D6tz6slRNN+qMjZuFcq2t4Ziwd3F6fPjeIrhyo6Lo ErpCHbyWCahqGYwwy721vSgZWjTMBBPSLIgZofZS2mjvneZmrbnZYe6R2wTNWjEzFCaqNCOu D/8dyiefWNTn8OYNtHDthYaK4Q7mGPM/EvSvwhhZ+fJ9t3IqWTwwJIqYpiDrvo1EQDI3giWA 4aR8VymV8e+uQkNsV+A/Aa+p8lzW6KhDs1LJzSLby10RWnp+zxo8mTrE7LdwhYsq7FoWcNlK +EfPKRvlUmFHosz+3DrY+7VvnffPzw9PMaT29/b7n3ABjqvqL8miDaCM92gBntgF/PhRykIx mLbFkKRNy7vATWrRXUmhmUg6+/Dp7On0IFCJmjNkcJYWE0G/KgJQHzlbhCiV5ASpnoCYkBqu J+749TcUr8SOCo2QAqkY++egQrUIy/JtTjUznIzHS29oKXDTVtZbYEpxTvH4azFh0AUNl0N3 pQeKWcwueP1aMDU1BYIqJXDPJUlnEtLi8zYWJQuVOQyyJtPIkr1mmGViVW6GPfB7IEWkhisU d7pIZKlro2BY9TCwYU7PqJffY9QEMc04xWDNBEh7U/CiWwZJNGouwbyiIGpZoR9JKiNJlGIi xbKGKZSQheQVeCFnamUdUc4919gJcrYmi+zGxGkkMkhUTOXQNd9J0kX0r/Oy+PkdCGyqdHjD suwvTkQRSaKzaVDA5aJjWd1NwDkl5UHSXRBlsufCHqvpHrWeRA9QSibhU3Ls58cVADSan3QR 33yYI6uFEYNWULpAtSnWQEpgwRiIPpss1Ag5FrJLTl2VZ+k6mZWaIE121U/dl/zivKaAlDwd 2QmzLgoidEmy5DP38nLIiobEterPhVNqkmaSxuUsdxOxDamqVDgV3cJ6i9IlNfaiLsWhh5J0 NKYBdDZT7SNw447DAp5nkB9RSyE4cWAk8ZHZGQgGVFD74L6U8ZC0vbBsFWBU4uAfHw3JQHbh Vdh95XyZrFBsOjg86lsW+uKjwxO8qPQI9wFuMZK5mNdziU6lOiYbKRAJu251k7w3UkhLV/aY 1TmFDZzG4/weZzccQSU4BU0MA7QlInInlAb6KfyKw2lsmIQeuNEM5+IXG51J4OmYpM+qMA48 YUpFTFHBMMNRqbzxVDB1kdPHbEVuKj28TG6ksDxFkXu+THLUR5Ho8kIiPS8n4pSRnTshQYsU DcyJt8DidQeaQyLqmFcxd0Bs45k1yaBDOb/am8PeOarzBMaapM8pFGc4C+VPM9Q48GxdUMki l6DiTcgXaYTq5rlKoeWkqiuTamSXiUo7FipH9VmyfTqjDBJWncSJ9ovsPE+sCktjjFFuUExr 2pUt2qWOpXAv44bcCxejMMN1fj9keS7K4fPrhemTf0mI5KiHyQ+RFVqiSFpGF6C1xjFRlQwP T2QvdiTC4kqtICaWHkqluCM9QBaVf7hfrfRYMCspMuJ/inCVJWjtzuzGZ6aHcate2ATfDeqf D/fjvWQ6C3GlCmOgdcQNrjUrTpUYajqTm+ZUhNtsbdSaO1Dd2mrWWm25wyHWXOrgMS9f1WJL ldV540PyC4hhWh0rOQfqi1SHipSl9FotVb3oJQBxlQQBktJBfFdAGhrSXZdpiVgAqTfLKfGe gTpuIfDIH+kTTuavcyVZMjFWScfQO/ZTw2X4yo3VHPPkcVmWWugGkWUPUdJx7qhljiZhW5Y4 zarj9gz5JoGZbYmmhehZgmKT4kxTlVT4z2RislNFjibzTPr7kJhhXlXKgk7tZk8HTclWgPbi vnKoGXg/pjIPmrRrg6XVRXNRT1QZwZlilUkPmlMaMW6hEWbLh6yAL6gcgtr7IZdkWb/2P530 jzAS8amM08n4O+mKcae1C3Kr9Z+L4NgJElx+31g+pUGb4trefupuep841ZQ6bNagw2YNwxnO NEpmX3i729JOJ7V5Wxg/2x2xLSxO1165aH6hfeUaHTD735oyVwEIq+yKq09aZXIkV4ZjfPqk mrQ/6RGU9Pl/dfKghC2GowfJqQNMpHUQeQoh2557EkC010yOnql56sF/kS09pxgBcxO5EU7m +sYe42jl0Ptvdzosr44qNfhwcCYNgckdyeRNWmemSDUSK3liJpP5wqqHRvv9C2uNxfNW+ftI z99HlIurudIyCujeLt1K5/NlSkhQwUdQh/haJunwM8ScTOXtg+kkQnt0e9KljsT8MrWokXhc 5HoYuK788QBJ1jlSusAbnJ8Zzw2BCz4wDKY38Z4oGhY/KBKqJ0XQ6m9dsH1+5A1smLi3bEsi 1YUyaiMlYbfuXxDcHtOJPnRotG8sDWNdLv3QMSplfFrpiVUx3tZL6j02PQjUfRWy7DEA13iR yRch38CIrIrnAH8MfC1B8FNbWuLMUPoedpO7hT0W9iEZmG5POla9URfgF4BrUT7G1CO/7ES/ lSNJa9SWaUnGTwcvfmP585ECesxI5eZXwXTmK10hDWAdNm8iSsWWSyn2mcuqFsFtiQ4kWZnU ZYcl9fMr500sJSmd0iLeZeZCjy/mS44JKD0ZVtXozHCOazcSuojmj4+nOO79bV6WXT5eUIQg Jzmn2TT3zMw1hGImFO5SS4FmD4ovF3NonlhTNjdfrGYtLRStXnuIZxaXYPLaL2WslWJiLhcg LO+amF88/Y+PnHz5MSpSUVsCC7TkKRa/WFVyTBUfDzIQmasE6Ejej9zBtXhCkSsE6qi4HqBU ugMipph3YO/0MwLZ7ehUMk8b0bupGWTy/bcpnnShITbGl6qmcgXMrSoRhkcPy+dLTESwsBip BpRKWf3j/qcPsMJ0/PSKtzVAbG84wm/QRShukH5Uqx7y/600i+7KZN1ekTcIrU6PY6nfhK7f kDIT9yqqcsVMEzQj6T9rJ3/wd7UqaZ6TKqpMy+PcSvRHKVI6TZLOwjB3Rn7lfO1KleAQPCcu g+04AbzyeUWuO0Av/XP0FseWXUo2pJsx2xK52FuV30muArO1AvKiEA80RCqyd0GwVn7XHoNG QeUZeMr1zEWV1qkZp8oYmypjVMa1//n4rByura0lu3VfkmwsTIoCmj0kN6vVyexG1vysy/H0 duaHakHvBgEf0YYFfwR7NY2mmFxGvXSFEuQeXlI0EqHoYu8DNO46DfGnVS8p8aBG/GvctfLt h/uqGdubcbuw+HTlVa2U4ucU8zNV9q4BSYDIvkoazXtqfkv5DdTu3XpTqPtuvRm7k5rgYEM8 aUBxy0DCG9jQ69I8JJ9kvAJyQeIMKGdoCWnV6jwvlX/+S24lyU2ldALHisZKtHI5u4qLHssc 5MiS18O0NaezoXnZ23xSVEEu304EIsBycQKjEc1P4qgOZEJLD8xzupu+v5KQvaLPbv0qjuLZ +RingcwLOaDwk1Zw4t7GA7GgVI7SKjrvpIVhLmH5YkJyRroad+Gbx0fWse+fmkBRReWmrS77 WupIxRg9X5C7NHqwybcmkUdva731W8WY5oCUXh+ojdJHTaslVnN+HC00RSuKmHqEjLWtIKFN 1K0kz0DmBCMzpZRQOEV73Ay2IbYR9S3Wpy38yiSH6QWhdpesJ32HFXGeYLQwUUIKQE9/1WpA NGcXbyLJV9qbXhXO12Gx9Rtnyqy9kOWSiUltfWHVSi5VspRT4Lf+fCV8jvKKVjNmWrEMWq3r 02PUKWHRE3RpJ8maHqVMqizwu2iSLIjKbnt6/lEYbSb8lKglUTl+FSadxBnQMs+CA4lz8CWB Zvz4gEdxB+E8AvTzADIjpoTYki6EL7Lne0TVWALtKpi4wFiKA8gyN6l0Om8rmg5sdGNbQftI 1hALwq4KVw9Ae8KQDKpqmY8Zeq31uwwuhpKjyxXjrpZdGSo2GkdlBjC3HlXStK6pGWtOpTga 5RWFuzGs8Sf8eK96hRryhMdAOyT6cBHzCjvQ1zB6jZBsUTJF6GpN1wf9kSnBHEG9BiNX5aBT pvEzJnIOgaZKjEZYsvDXaOEPcaZAUiXUHa+M+l7Jz4BBkynE8lgWbUpo87VvU9c9LS4YvJk5 4czqfjyBR46f1v6XUHCvs6jYBOIKjDnPNBjD/HKe0Z8VWIAexhJjQmt6tGmEwiRU3WOOaaic J2Yau+IMnK5GeWsJlYPNqJom8kdPn46q/usmWewRwmwQeZZDEBTXQPPeBvIqWt8FriBUgS8s CHyVLOGhRrjuA8Ik9M03wS3NAMNM9Ck9prKccwJhNgAuICDlA15Iwr3Gn0c5AXluP4YUkS25 U90tiIriGZRsFK0Uo+f8SLxKyiS82sRkLkhPh/ouvftiYNP76lJbitCgd9gNkP2YGE7dkJ7A du+oKuxNqGIstrCY+XGtuLSoVFl0PLFR0fKr4gQntYpuxK8gTOcqc/MU6aL/9LIrby3HlC3r pFUes+rqwIjLA3Sco6vcGPsGw6ap7qiKirCiNaGilsKJC7Nlvb5akUuq/KLLjEGK+zQUpaMa ViUjuj9fbvV6Qp+QH705s1BqznRGRyB4N+X/hcZCo5JyNyl+u0GQHJhIzp7K8i0fYQjcsWuH 5nNNIB5Rkm/IImNSJ4fwLp2W6mzxm+62N+mo6e/+0tzsK0O1iJ6qzSfPKic7o1xRkP0UndIQ u8a5Xe1XIblfSg1qQBoqyoZ0nIGu0kXP4l3ppIJQeKwiQ3nqiJb/B7yMV4paHkHjIfj9QW16 9W6102rXduSRt9LQHo8v7cG1erHa016rRo/WQC47/3mXjLkOqbNAdXMdlB/OKelk6IU6arpE iq758kHvhLIqVUud2wOZjG+u1ak0gPuUD3BDQUeLXuGmLFGh85F5fgFNg9+J0um01XubCrZa 4TncV9VIYgZaI2qHIw+A/vhhKGz++GF6TkA+9wvacrS4V1IwtZPPr4khIHqZgvX30+N3h/0s THzwVUiM3lyQ1gxmUovfyt3ZVK/SLJnd1Iu4lOUG641+Wm0hYzRd55kvy5nTG6/P+vvZmbEp Rt/ssUhXeaKoBs0mznS7E5/W/4OmKl6yQzwf2phdBkKyubdai0bD8/ZSEwyD6OVf8yjiJYr8 AizxUlDkwPnhh/cfj/blK64xU6bjCqqmXtL7Em/CCdHz07bgwJ+FX+EtdNWr83oydCsSHBdH luOoinvyQvIsBEqzBo3cKQ8t4Z3/2oBkmjB3lvWnTkrjSL1wdo+bVoa5T+ftPNYuJkHGoYdF TpMzi842/x8UGvHLPjk1ki/0NgRLcdvX3mTuZ95irr/HXIXX/FvM5SE57iQGMkXh/2nvanvb toHwZ+dXMAFWOLWdSH6Pm2RIM3c12nRdsg4DhsJQHKX2bMmaZafL1v738V5IURKt2H3blxVF XYsiJfPleHd87rlSSc6Aye0900FARR5k9TY0efhmpWdFVipWRqjLKTbNo+DpqhUFT0XIKYgo +IZwOsDX6HTWouC5ShoF35B/WwkKvulA5+O/TH109fLsqRgBWyVijyAjR8yAd+Lgnga+nDdw wxBD1mQ5fY3k3BE7tc3Je7Yj2RFFHFiAIkabWTOuAsEx6k2MfpjNadrBEs2RvbFsbh0hX6n8 cOvYH6w/G23NvHgJL1vQlMGwxTpnihQa2OlBabWoz/uKcThBZoCeGXu3gP8GiMfF2W8ZWAa8 ELR34jwpVi1gSeNTxCNx/vKnV31gkSIKrLqDxGF1p1VtMm0bazOqdR0ASDF19Ms0i9LjhqiI puOIU6HekoiFgCZWaK6lCdChzmWbi3f+BpUVdA8myma9VxgBkGBNLL2QwEwyIQ/QoKLKLj8y R58DP9duzxA7QPuJ6kQEp5ByVS6ri/vi9CT53bR3qjI56A3HYXLG6SQSxOAdIzcZC3fcwcb2 gzv9DLLL2XdpgP+1U0w/kRzf7I9NIboevMtwzusHk/8ocQIQzJ8RUOOkC9ftENz7qtjS/5lp yhCwrAVMYbccrBkNg8CLlCEcBInSJU21FOn3XTCUMt8zbogg2uXxMsAQambjQM7qugNCo9Jq dat1XkOkJi6koTgJYAH/IXeDiQ9GMvJDa/Y+QHfi9hsu3iIzS7Y0UhwsNMQHOkYlYRhEfvbI kh2ENmTZKuordpt9K4O9ZtleH9hbBWNvta2ubfG0NeeayuWuFSDkKOqALJq3mnhIEp+9ZTvf 3qb+yIG2rSMXpGS70VU2yhbdJqj3U90g7K6AL/bSa7WPKTBW57QPumrVPqjIzOMFjMYuMxpb tY9sFaLVbaeI3huUP0HbfMABWSoNpOY68WaTv31x7cVy8TLf/iSUCkmA3ltYJIefwaa7JYW0 /Cmb5C0p6nIKoMz1OV+2djqXIZ8xdiHyGbuNIp1P1dHRksg93ezqkWI9B/mM8VPxtNLmUKuF C7kRO2jJejc3qFgNlQJV1mKKQh4h8QcgQUICcwr5mfYeh4tKBZtSm5OsmtDqQ8CdpiYyKOJI XYHv1+PyL4OL/uXw6fOqACm6kJdwJHTxz2/6b/pU/ufKX/l0w/pxQEvFMhB83T4SXJgJQm11 NF26bShUpUyug6YmZccl0O1U3Sa4VjtK6Uy5DWr9q8vz5+xKKHAFrPEFFPncEKBEQFxl0g1h jZXlf6q42qQU32eTCtqBe3fJt8eWDr8kep/xGqqHVHo7X4Wo8tSUnb2J32nTl6rk3qmSfyV1 JExl+oUSN2mhQ490RahEWnLTPcKharodxa/7NYaKkboESc7wqHzO0H3qqGnfaYaYBN8nAQF/ +vh95aFbLwruY4scgIt2IQAl2dSEkPRivQTAGubyr/eaToqdvN5Cw0unj+RwenFMDOfoeJj4 i4Pxab5w4V/P50trUbQYLWdQUsmWxDPvGquYlbw4OFx5I0C6ZpqDkskcLlIOP/TVtNpH7KvZ EfIGZqqmIIH7GFTR6B2RYFF8sw51fldIx0X6rD0Yfk0FqYSTBoiYTGFMvlp/8OrXs5eJ6buL 5gj+CkzvU2l1G4neIZ5BSDFmAKGwYblG30MWz/e+mPp+JMbz2Q1hSICoe+wnEV0w6TC5hYjn FH0MocTkK8JjfgTdj8ZeKPsII5fltJQLfBUfiNoPUmW84NQYtWJrcgsVHTNAcDcomRRZobiI dUEWGcep1qX90nbq1RYxOesmXvcvL57siFKGMkguMx3cwoQrMMLMy8Wiyjpu0nzKC0JRJiIT LQvlV3PjIrOzxudsWPhgIh9+wekQqvMZEoI0nsmeYFD3JBSxF/jpQAU9q9YcHCmiwNyv1piL pIUPH4T+krKSrZmDjD5VgUaOPqNK90dmCHLx5nDPVgHkX6nC/yHnOOdGGCcqxygdVIAIoHib aUe7m7qVN96Cs2+CrtlMTYvdnrSLRwHqXERkY6dzGKsHaP8SaprsCVIW3KzP0u1gq6K4aCPa 2wQwmd1K2P0Su6CMhalWlnEpG/7Myog5SJabE+UmuZOCQf5JvbsdplBaBxDYYLD0eRbZ/zUW fD1yOKkOYFFoyJacxwHBJbgvns1mci9bjmOMFINcDGN/AUkXxqsYaTYWEPZ866u9zNjI1vv0 tndnmDAXoRwy7XaL9qyjo2rDLVRIpCxi4p0vp37kNA7eJ4s38k0OqE/SzDu4l6mYUnPL/bid WsCCIydXUs/CSZ48RNjQE8oZl9vA1DN2M3Hhe6N5eIvJPGC31UOi4YbmnqfwGqaYp5Gxr5ok u9I68qMC4iJyw+nfwbYXOoxEMWGSjSDJqJLO/mdeHkpN0ogJUmpWquX1i/JbrK28xRQEh3dB PPJCw2AyrqXtJaMgm5Cu22tafFdmhYy/sNNr1E1nSVvB0JQHNrr2zVO/UuzP/BEKrweM8ChF T2gI75oGMEZpUoUU5+nQgE1bFrRQTmzYuN57UYRE7HRCbOJDEkBJENROF1IpIPAUHSkAYqjS qqvsiSBrptCaJfuvPrKATC5D9IRRUpcTuXdrmi5kBPz4zfOQ0Utv5kItWaZf6C8P41W4iEY5 P2q+KD0Z8+Wliznlh3OPYIqBE88yJy31MlOz2Wt0zdx8HUrO11EwBoSF4PG4mefSlvsS+gRm meyTSXiX7xZQpTErb/lq8OOLAQRM/gf5/Ch1n0ond6Mk++Xr855K64enXWAllyngah8xlFQ4 JFszP7jxaDGJlvHhNL4P5vMoPhglo2spSw+v5Qb0l19Jk50zyXV7LUveRVtFc4AdTBNtpABs uHVME+UmuUzlH6g6HM1nqwC6HyAK8m+Z0mvKPusPXvdo2iu+zhjk3G3ZqFdxG/LO34+/++v0 reytR/4kGgIdCIbHuiRMoLaUG6ulOD4We+deSKE4UiGTdyN5CNgT6FyAR8KvlBqZGMTk0vDE nTeTIwJPRUTH93vQkLRNZijvYE6WXdqKU9IJWD35Uz/99BQfsadueHF1HzwW0I+yB0JpSccH oCyU9e94svMv7O74FUKGAAA=

--SLDf9lqlvOQaIe6s--

- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.rutgers.edu