mbox series

[v7,00/19] simplify crypto wait for async op

Message ID 1503584350-7831-1-git-send-email-gilad@benyossef.com
Headers show
Series simplify crypto wait for async op | expand

Message

Gilad Ben-Yossef Aug. 24, 2017, 2:18 p.m. UTC
Many users of kernel async. crypto services have a pattern of
starting an async. crypto op and than using a completion
to wait for it to end.

This patch set simplifies this common use case in two ways:

First, by separating the return codes of the case where a
request is queued to a backlog due to the provider being
busy (-EBUSY) from the case the request has failed due
to the provider being busy and backlogging is not enabled
(-EAGAIN).

Next, this change is than built on to create a generic API
to wait for a async. crypto operation to complete.

The end result is a smaller code base and an API that is
easier to use and more difficult to get wrong.

The patch set was boot tested on x86_64 and arm64 which
at the very least tests the crypto users via testmgr and
tcrypt but I do note that I do not have access to some
of the HW whose drivers are modified nor do I claim I was
able to test all of the corner cases.

The patch set is based upon linux-next release tagged
next-20170824.

Changes from v6:
- Fix brown paper bag compile error on marvell/cesa
  code.

Changes from v5:
- Remove redundant new line as spotted by Jonathan
  Cameron.
- Reworded dm-verity change commit message to better
  clarify potential issue averted by change as
  pointed out by Mikulas Patocka.

Changes from v4:
- Rebase on top of latest algif changes from Stephan
  Mueller.
- Fix typo in ccp patch title.

Changes from v3:
- Instead of changing the return code to indicate
  backlog queueing, change the return code to indicate
  transient busy state, as suggested by Herbert Xu.

Changes from v2:
- Patch title changed from "introduce crypto wait for
  async op" to better reflect the current state.
- Rebase on top of latest linux-next.
- Add a new return code of -EIOCBQUEUED for backlog
  queueing, as suggested by Herbert Xu.
- Transform more users to the new API.
- Update the drbg change to account for new init as
  indicated by Stephan Muller.

Changes from v1:
- Address review comments from Eric Biggers.
- Separated out bug fixes of existing code and rebase
  on top of that patch set.
- Rename 'ecr' to 'wait' in fscrypto code.
- Split patch introducing the new API from the change
  moving over the algif code which it originated from
  to the new API.
- Inline crypto_wait_req().
- Some code indentation fixes.

Gilad Ben-Yossef (19):
  crypto: change transient busy return code to -EAGAIN
  crypto: ccp: use -EAGAIN for transient busy indication
  crypto: remove redundant backlog checks on EBUSY
  crypto: marvell/cesa: remove redundant backlog checks on EBUSY
  crypto: introduce crypto wait for async op
  crypto: move algif to generic async completion
  crypto: move pub key to generic async completion
  crypto: move drbg to generic async completion
  crypto: move gcm to generic async completion
  crypto: move testmgr to generic async completion
  fscrypt: move to generic async completion
  dm: move dm-verity to generic async completion
  cifs: move to generic async completion
  ima: move to generic async completion
  crypto: tcrypt: move to generic async completion
  crypto: talitos: move to generic async completion
  crypto: qce: move to generic async completion
  crypto: mediatek: move to generic async completion
  crypto: adapt api sample to use async. op wait

 Documentation/crypto/api-samples.rst |  52 ++-------
 crypto/af_alg.c                      |  27 -----
 crypto/ahash.c                       |  12 +--
 crypto/algapi.c                      |   6 +-
 crypto/algif_aead.c                  |   8 +-
 crypto/algif_hash.c                  |  50 +++++----
 crypto/algif_skcipher.c              |   9 +-
 crypto/api.c                         |  13 +++
 crypto/asymmetric_keys/public_key.c  |  28 +----
 crypto/cryptd.c                      |   4 +-
 crypto/cts.c                         |   6 +-
 crypto/drbg.c                        |  36 ++-----
 crypto/gcm.c                         |  32 ++----
 crypto/lrw.c                         |   8 +-
 crypto/rsa-pkcs1pad.c                |  16 +--
 crypto/tcrypt.c                      |  84 +++++----------
 crypto/testmgr.c                     | 204 ++++++++++++-----------------------
 crypto/xts.c                         |   8 +-
 drivers/crypto/ccp/ccp-crypto-main.c |   8 +-
 drivers/crypto/ccp/ccp-dev.c         |   7 +-
 drivers/crypto/marvell/cesa.c        |   3 +-
 drivers/crypto/marvell/cesa.h        |   2 +-
 drivers/crypto/mediatek/mtk-aes.c    |  31 +-----
 drivers/crypto/qce/sha.c             |  30 +-----
 drivers/crypto/talitos.c             |  38 +------
 drivers/md/dm-verity-target.c        |  81 ++++----------
 drivers/md/dm-verity.h               |   5 -
 fs/cifs/smb2ops.c                    |  30 +-----
 fs/crypto/crypto.c                   |  28 +----
 fs/crypto/fname.c                    |  36 ++-----
 fs/crypto/fscrypt_private.h          |  10 --
 fs/crypto/keyinfo.c                  |  21 +---
 include/crypto/drbg.h                |   3 +-
 include/crypto/if_alg.h              |  15 +--
 include/linux/crypto.h               |  40 +++++++
 security/integrity/ima/ima_crypto.c  |  56 +++-------
 36 files changed, 310 insertions(+), 737 deletions(-)

-- 
2.1.4

Comments

Harsh Jain Aug. 31, 2017, 12:31 p.m. UTC | #1
HI Gilad,

I think we need an update in ESP also. Now EBUSY return means driver
has accepted, Packet should not be dropped in

esp_output_tail() function.

.

Regards
Harsh Jain



On Thu, Aug 24, 2017 at 7:48 PM, Gilad Ben-Yossef <gilad@benyossef.com> wrote:
> Many users of kernel async. crypto services have a pattern of

> starting an async. crypto op and than using a completion

> to wait for it to end.

>

> This patch set simplifies this common use case in two ways:

>

> First, by separating the return codes of the case where a

> request is queued to a backlog due to the provider being

> busy (-EBUSY) from the case the request has failed due

> to the provider being busy and backlogging is not enabled

> (-EAGAIN).

>

> Next, this change is than built on to create a generic API

> to wait for a async. crypto operation to complete.

>

> The end result is a smaller code base and an API that is

> easier to use and more difficult to get wrong.

>

> The patch set was boot tested on x86_64 and arm64 which

> at the very least tests the crypto users via testmgr and

> tcrypt but I do note that I do not have access to some

> of the HW whose drivers are modified nor do I claim I was

> able to test all of the corner cases.

>

> The patch set is based upon linux-next release tagged

> next-20170824.

>

> Changes from v6:

> - Fix brown paper bag compile error on marvell/cesa

>   code.

>

> Changes from v5:

> - Remove redundant new line as spotted by Jonathan

>   Cameron.

> - Reworded dm-verity change commit message to better

>   clarify potential issue averted by change as

>   pointed out by Mikulas Patocka.

>

> Changes from v4:

> - Rebase on top of latest algif changes from Stephan

>   Mueller.

> - Fix typo in ccp patch title.

>

> Changes from v3:

> - Instead of changing the return code to indicate

>   backlog queueing, change the return code to indicate

>   transient busy state, as suggested by Herbert Xu.

>

> Changes from v2:

> - Patch title changed from "introduce crypto wait for

>   async op" to better reflect the current state.

> - Rebase on top of latest linux-next.

> - Add a new return code of -EIOCBQUEUED for backlog

>   queueing, as suggested by Herbert Xu.

> - Transform more users to the new API.

> - Update the drbg change to account for new init as

>   indicated by Stephan Muller.

>

> Changes from v1:

> - Address review comments from Eric Biggers.

> - Separated out bug fixes of existing code and rebase

>   on top of that patch set.

> - Rename 'ecr' to 'wait' in fscrypto code.

> - Split patch introducing the new API from the change

>   moving over the algif code which it originated from

>   to the new API.

> - Inline crypto_wait_req().

> - Some code indentation fixes.

>

> Gilad Ben-Yossef (19):

>   crypto: change transient busy return code to -EAGAIN

>   crypto: ccp: use -EAGAIN for transient busy indication

>   crypto: remove redundant backlog checks on EBUSY

>   crypto: marvell/cesa: remove redundant backlog checks on EBUSY

>   crypto: introduce crypto wait for async op

>   crypto: move algif to generic async completion

>   crypto: move pub key to generic async completion

>   crypto: move drbg to generic async completion

>   crypto: move gcm to generic async completion

>   crypto: move testmgr to generic async completion

>   fscrypt: move to generic async completion

>   dm: move dm-verity to generic async completion

>   cifs: move to generic async completion

>   ima: move to generic async completion

>   crypto: tcrypt: move to generic async completion

>   crypto: talitos: move to generic async completion

>   crypto: qce: move to generic async completion

>   crypto: mediatek: move to generic async completion

>   crypto: adapt api sample to use async. op wait

>

>  Documentation/crypto/api-samples.rst |  52 ++-------

>  crypto/af_alg.c                      |  27 -----

>  crypto/ahash.c                       |  12 +--

>  crypto/algapi.c                      |   6 +-

>  crypto/algif_aead.c                  |   8 +-

>  crypto/algif_hash.c                  |  50 +++++----

>  crypto/algif_skcipher.c              |   9 +-

>  crypto/api.c                         |  13 +++

>  crypto/asymmetric_keys/public_key.c  |  28 +----

>  crypto/cryptd.c                      |   4 +-

>  crypto/cts.c                         |   6 +-

>  crypto/drbg.c                        |  36 ++-----

>  crypto/gcm.c                         |  32 ++----

>  crypto/lrw.c                         |   8 +-

>  crypto/rsa-pkcs1pad.c                |  16 +--

>  crypto/tcrypt.c                      |  84 +++++----------

>  crypto/testmgr.c                     | 204 ++++++++++++-----------------------

>  crypto/xts.c                         |   8 +-

>  drivers/crypto/ccp/ccp-crypto-main.c |   8 +-

>  drivers/crypto/ccp/ccp-dev.c         |   7 +-

>  drivers/crypto/marvell/cesa.c        |   3 +-

>  drivers/crypto/marvell/cesa.h        |   2 +-

>  drivers/crypto/mediatek/mtk-aes.c    |  31 +-----

>  drivers/crypto/qce/sha.c             |  30 +-----

>  drivers/crypto/talitos.c             |  38 +------

>  drivers/md/dm-verity-target.c        |  81 ++++----------

>  drivers/md/dm-verity.h               |   5 -

>  fs/cifs/smb2ops.c                    |  30 +-----

>  fs/crypto/crypto.c                   |  28 +----

>  fs/crypto/fname.c                    |  36 ++-----

>  fs/crypto/fscrypt_private.h          |  10 --

>  fs/crypto/keyinfo.c                  |  21 +---

>  include/crypto/drbg.h                |   3 +-

>  include/crypto/if_alg.h              |  15 +--

>  include/linux/crypto.h               |  40 +++++++

>  security/integrity/ima/ima_crypto.c  |  56 +++-------

>  36 files changed, 310 insertions(+), 737 deletions(-)

>

> --

> 2.1.4

>
Gilad Ben-Yossef Sept. 3, 2017, 6:17 a.m. UTC | #2
On Thu, Aug 31, 2017 at 3:31 PM, Harsh Jain <harshjain.prof@gmail.com> wrote:
> HI Gilad,

>

> I think we need an update in ESP also. Now EBUSY return means driver

> has accepted, Packet should not be dropped in

>

> esp_output_tail() function.


Good catch. You are right and the same holds true for ah_output() in ah4.c.

But I do wonder, the code there now treats -EBUSY as a special case
and returns NET_XMIT_DROP
but if an AEAD or AHASH transformation return some other error, like
-ENOMEM or -EINVAL shouldn't
we return NET_XMIT_DROP in that case too?

Any ideas?

Gilad

>

>

> On Thu, Aug 24, 2017 at 7:48 PM, Gilad Ben-Yossef <gilad@benyossef.com> wrote:

>> Many users of kernel async. crypto services have a pattern of

>> starting an async. crypto op and than using a completion

>> to wait for it to end.

>>

>> This patch set simplifies this common use case in two ways:

>>

>> First, by separating the return codes of the case where a

>> request is queued to a backlog due to the provider being

>> busy (-EBUSY) from the case the request has failed due

>> to the provider being busy and backlogging is not enabled

>> (-EAGAIN).

>>

>> Next, this change is than built on to create a generic API

>> to wait for a async. crypto operation to complete.

>>

>> The end result is a smaller code base and an API that is

>> easier to use and more difficult to get wrong.

>>

>> The patch set was boot tested on x86_64 and arm64 which

>> at the very least tests the crypto users via testmgr and

>> tcrypt but I do note that I do not have access to some

>> of the HW whose drivers are modified nor do I claim I was

>> able to test all of the corner cases.

>>

>> The patch set is based upon linux-next release tagged

>> next-20170824.

>>

>> Changes from v6:

>> - Fix brown paper bag compile error on marvell/cesa

>>   code.

>>

>> Changes from v5:

>> - Remove redundant new line as spotted by Jonathan

>>   Cameron.

>> - Reworded dm-verity change commit message to better

>>   clarify potential issue averted by change as

>>   pointed out by Mikulas Patocka.

>>

>> Changes from v4:

>> - Rebase on top of latest algif changes from Stephan

>>   Mueller.

>> - Fix typo in ccp patch title.

>>

>> Changes from v3:

>> - Instead of changing the return code to indicate

>>   backlog queueing, change the return code to indicate

>>   transient busy state, as suggested by Herbert Xu.

>>

>> Changes from v2:

>> - Patch title changed from "introduce crypto wait for

>>   async op" to better reflect the current state.

>> - Rebase on top of latest linux-next.

>> - Add a new return code of -EIOCBQUEUED for backlog

>>   queueing, as suggested by Herbert Xu.

>> - Transform more users to the new API.

>> - Update the drbg change to account for new init as

>>   indicated by Stephan Muller.

>>

>> Changes from v1:

>> - Address review comments from Eric Biggers.

>> - Separated out bug fixes of existing code and rebase

>>   on top of that patch set.

>> - Rename 'ecr' to 'wait' in fscrypto code.

>> - Split patch introducing the new API from the change

>>   moving over the algif code which it originated from

>>   to the new API.

>> - Inline crypto_wait_req().

>> - Some code indentation fixes.

>>

>> Gilad Ben-Yossef (19):

>>   crypto: change transient busy return code to -EAGAIN

>>   crypto: ccp: use -EAGAIN for transient busy indication

>>   crypto: remove redundant backlog checks on EBUSY

>>   crypto: marvell/cesa: remove redundant backlog checks on EBUSY

>>   crypto: introduce crypto wait for async op

>>   crypto: move algif to generic async completion

>>   crypto: move pub key to generic async completion

>>   crypto: move drbg to generic async completion

>>   crypto: move gcm to generic async completion

>>   crypto: move testmgr to generic async completion

>>   fscrypt: move to generic async completion

>>   dm: move dm-verity to generic async completion

>>   cifs: move to generic async completion

>>   ima: move to generic async completion

>>   crypto: tcrypt: move to generic async completion

>>   crypto: talitos: move to generic async completion

>>   crypto: qce: move to generic async completion

>>   crypto: mediatek: move to generic async completion

>>   crypto: adapt api sample to use async. op wait

>>

>>  Documentation/crypto/api-samples.rst |  52 ++-------

>>  crypto/af_alg.c                      |  27 -----

>>  crypto/ahash.c                       |  12 +--

>>  crypto/algapi.c                      |   6 +-

>>  crypto/algif_aead.c                  |   8 +-

>>  crypto/algif_hash.c                  |  50 +++++----

>>  crypto/algif_skcipher.c              |   9 +-

>>  crypto/api.c                         |  13 +++

>>  crypto/asymmetric_keys/public_key.c  |  28 +----

>>  crypto/cryptd.c                      |   4 +-

>>  crypto/cts.c                         |   6 +-

>>  crypto/drbg.c                        |  36 ++-----

>>  crypto/gcm.c                         |  32 ++----

>>  crypto/lrw.c                         |   8 +-

>>  crypto/rsa-pkcs1pad.c                |  16 +--

>>  crypto/tcrypt.c                      |  84 +++++----------

>>  crypto/testmgr.c                     | 204 ++++++++++++-----------------------

>>  crypto/xts.c                         |   8 +-

>>  drivers/crypto/ccp/ccp-crypto-main.c |   8 +-

>>  drivers/crypto/ccp/ccp-dev.c         |   7 +-

>>  drivers/crypto/marvell/cesa.c        |   3 +-

>>  drivers/crypto/marvell/cesa.h        |   2 +-

>>  drivers/crypto/mediatek/mtk-aes.c    |  31 +-----

>>  drivers/crypto/qce/sha.c             |  30 +-----

>>  drivers/crypto/talitos.c             |  38 +------

>>  drivers/md/dm-verity-target.c        |  81 ++++----------

>>  drivers/md/dm-verity.h               |   5 -

>>  fs/cifs/smb2ops.c                    |  30 +-----

>>  fs/crypto/crypto.c                   |  28 +----

>>  fs/crypto/fname.c                    |  36 ++-----

>>  fs/crypto/fscrypt_private.h          |  10 --

>>  fs/crypto/keyinfo.c                  |  21 +---

>>  include/crypto/drbg.h                |   3 +-

>>  include/crypto/if_alg.h              |  15 +--

>>  include/linux/crypto.h               |  40 +++++++

>>  security/integrity/ima/ima_crypto.c  |  56 +++-------

>>  36 files changed, 310 insertions(+), 737 deletions(-)

>>

>> --

>> 2.1.4

>>




-- 
Gilad Ben-Yossef
Chief Coffee Drinker

"If you take a class in large-scale robotics, can you end up in a
situation where the homework eats your dog?"
 -- Jean-Baptiste Queru
Harsh Jain Sept. 5, 2017, 11:23 a.m. UTC | #3
On Sun, Sep 3, 2017 at 11:47 AM, Gilad Ben-Yossef <gilad@benyossef.com> wrote:
> On Thu, Aug 31, 2017 at 3:31 PM, Harsh Jain <harshjain.prof@gmail.com> wrote:

>> HI Gilad,

>>

>> I think we need an update in ESP also. Now EBUSY return means driver

>> has accepted, Packet should not be dropped in

>>

>> esp_output_tail() function.

>

> Good catch. You are right and the same holds true for ah_output() in ah4.c.

>

> But I do wonder, the code there now treats -EBUSY as a special case

> and returns NET_XMIT_DROP

> but if an AEAD or AHASH transformation return some other error, like

> -ENOMEM or -EINVAL shouldn't

> we return NET_XMIT_DROP in that case too?

I think we should not,  XMIT_DROP implies drop current packet only,
later on when device is recovered from busy state, Upper layer
protocol(TCP) will re-transmit the packet. It helps in flow control.
>

> Any ideas?

>

> Gilad

>

>>

>>

>> On Thu, Aug 24, 2017 at 7:48 PM, Gilad Ben-Yossef <gilad@benyossef.com> wrote:

>>> Many users of kernel async. crypto services have a pattern of

>>> starting an async. crypto op and than using a completion

>>> to wait for it to end.

>>>

>>> This patch set simplifies this common use case in two ways:

>>>

>>> First, by separating the return codes of the case where a

>>> request is queued to a backlog due to the provider being

>>> busy (-EBUSY) from the case the request has failed due

>>> to the provider being busy and backlogging is not enabled

>>> (-EAGAIN).

>>>

>>> Next, this change is than built on to create a generic API

>>> to wait for a async. crypto operation to complete.

>>>

>>> The end result is a smaller code base and an API that is

>>> easier to use and more difficult to get wrong.

>>>

>>> The patch set was boot tested on x86_64 and arm64 which

>>> at the very least tests the crypto users via testmgr and

>>> tcrypt but I do note that I do not have access to some

>>> of the HW whose drivers are modified nor do I claim I was

>>> able to test all of the corner cases.

>>>

>>> The patch set is based upon linux-next release tagged

>>> next-20170824.

>>>

>>> Changes from v6:

>>> - Fix brown paper bag compile error on marvell/cesa

>>>   code.

>>>

>>> Changes from v5:

>>> - Remove redundant new line as spotted by Jonathan

>>>   Cameron.

>>> - Reworded dm-verity change commit message to better

>>>   clarify potential issue averted by change as

>>>   pointed out by Mikulas Patocka.

>>>

>>> Changes from v4:

>>> - Rebase on top of latest algif changes from Stephan

>>>   Mueller.

>>> - Fix typo in ccp patch title.

>>>

>>> Changes from v3:

>>> - Instead of changing the return code to indicate

>>>   backlog queueing, change the return code to indicate

>>>   transient busy state, as suggested by Herbert Xu.

>>>

>>> Changes from v2:

>>> - Patch title changed from "introduce crypto wait for

>>>   async op" to better reflect the current state.

>>> - Rebase on top of latest linux-next.

>>> - Add a new return code of -EIOCBQUEUED for backlog

>>>   queueing, as suggested by Herbert Xu.

>>> - Transform more users to the new API.

>>> - Update the drbg change to account for new init as

>>>   indicated by Stephan Muller.

>>>

>>> Changes from v1:

>>> - Address review comments from Eric Biggers.

>>> - Separated out bug fixes of existing code and rebase

>>>   on top of that patch set.

>>> - Rename 'ecr' to 'wait' in fscrypto code.

>>> - Split patch introducing the new API from the change

>>>   moving over the algif code which it originated from

>>>   to the new API.

>>> - Inline crypto_wait_req().

>>> - Some code indentation fixes.

>>>

>>> Gilad Ben-Yossef (19):

>>>   crypto: change transient busy return code to -EAGAIN

>>>   crypto: ccp: use -EAGAIN for transient busy indication

>>>   crypto: remove redundant backlog checks on EBUSY

>>>   crypto: marvell/cesa: remove redundant backlog checks on EBUSY

>>>   crypto: introduce crypto wait for async op

>>>   crypto: move algif to generic async completion

>>>   crypto: move pub key to generic async completion

>>>   crypto: move drbg to generic async completion

>>>   crypto: move gcm to generic async completion

>>>   crypto: move testmgr to generic async completion

>>>   fscrypt: move to generic async completion

>>>   dm: move dm-verity to generic async completion

>>>   cifs: move to generic async completion

>>>   ima: move to generic async completion

>>>   crypto: tcrypt: move to generic async completion

>>>   crypto: talitos: move to generic async completion

>>>   crypto: qce: move to generic async completion

>>>   crypto: mediatek: move to generic async completion

>>>   crypto: adapt api sample to use async. op wait

>>>

>>>  Documentation/crypto/api-samples.rst |  52 ++-------

>>>  crypto/af_alg.c                      |  27 -----

>>>  crypto/ahash.c                       |  12 +--

>>>  crypto/algapi.c                      |   6 +-

>>>  crypto/algif_aead.c                  |   8 +-

>>>  crypto/algif_hash.c                  |  50 +++++----

>>>  crypto/algif_skcipher.c              |   9 +-

>>>  crypto/api.c                         |  13 +++

>>>  crypto/asymmetric_keys/public_key.c  |  28 +----

>>>  crypto/cryptd.c                      |   4 +-

>>>  crypto/cts.c                         |   6 +-

>>>  crypto/drbg.c                        |  36 ++-----

>>>  crypto/gcm.c                         |  32 ++----

>>>  crypto/lrw.c                         |   8 +-

>>>  crypto/rsa-pkcs1pad.c                |  16 +--

>>>  crypto/tcrypt.c                      |  84 +++++----------

>>>  crypto/testmgr.c                     | 204 ++++++++++++-----------------------

>>>  crypto/xts.c                         |   8 +-

>>>  drivers/crypto/ccp/ccp-crypto-main.c |   8 +-

>>>  drivers/crypto/ccp/ccp-dev.c         |   7 +-

>>>  drivers/crypto/marvell/cesa.c        |   3 +-

>>>  drivers/crypto/marvell/cesa.h        |   2 +-

>>>  drivers/crypto/mediatek/mtk-aes.c    |  31 +-----

>>>  drivers/crypto/qce/sha.c             |  30 +-----

>>>  drivers/crypto/talitos.c             |  38 +------

>>>  drivers/md/dm-verity-target.c        |  81 ++++----------

>>>  drivers/md/dm-verity.h               |   5 -

>>>  fs/cifs/smb2ops.c                    |  30 +-----

>>>  fs/crypto/crypto.c                   |  28 +----

>>>  fs/crypto/fname.c                    |  36 ++-----

>>>  fs/crypto/fscrypt_private.h          |  10 --

>>>  fs/crypto/keyinfo.c                  |  21 +---

>>>  include/crypto/drbg.h                |   3 +-

>>>  include/crypto/if_alg.h              |  15 +--

>>>  include/linux/crypto.h               |  40 +++++++

>>>  security/integrity/ima/ima_crypto.c  |  56 +++-------

>>>  36 files changed, 310 insertions(+), 737 deletions(-)

>>>

>>> --

>>> 2.1.4

>>>

>

>

>

> --

> Gilad Ben-Yossef

> Chief Coffee Drinker

>

> "If you take a class in large-scale robotics, can you end up in a

> situation where the homework eats your dog?"

>  -- Jean-Baptiste Queru