HI Fiona

>-----Original Message-----
>From: Trahe, Fiona [mailto:fiona.tr...@intel.com]
>Sent: 15 February 2018 17:16
>To: Verma, Shally <shally.ve...@cavium.com>; dev@dpdk.org; Athreya, Narayana 
>Prasad <narayanaprasad.athr...@cavium.com>;
>Murthy, Nidadavolu <nidadavolu.mur...@cavium.com>; Sahu, Sunila 
><sunila.s...@cavium.com>; Gupta, Ashish
><ashish.gu...@cavium.com>; Doherty, Declan <declan.dohe...@intel.com>; 
>Keating, Brian A <brian.a.keat...@intel.com>; Griffin,
>John <john.grif...@intel.com>
>Cc: De Lara Guarch, Pablo <pablo.de.lara.gua...@intel.com>; Trahe, Fiona 
><fiona.tr...@intel.com>
>Subject: RE: [dpdk-dev] [RFC v1 1/1] lib/cryptodev: add support of asymmetric 
>crypto
>
>Hi Shally,
>
>> -----Original Message-----
>> From: Verma, Shally [mailto:shally.ve...@cavium.com]
>> Sent: Thursday, February 15, 2018 5:33 AM
>> To: Trahe, Fiona <fiona.tr...@intel.com>; dev@dpdk.org; Athreya, Narayana 
>> Prasad
>> <narayanaprasad.athr...@cavium.com>; Murthy, Nidadavolu 
>> <nidadavolu.mur...@cavium.com>;
>> Sahu, Sunila <sunila.s...@cavium.com>; Gupta, Ashish 
>> <ashish.gu...@cavium.com>; Doherty, Declan
>> <declan.dohe...@intel.com>; Keating, Brian A <brian.a.keat...@intel.com>; 
>> Griffin, John
>> <john.grif...@intel.com>
>> Cc: De Lara Guarch, Pablo <pablo.de.lara.gua...@intel.com>
>> Subject: RE: [dpdk-dev] [RFC v1 1/1] lib/cryptodev: add support of 
>> asymmetric crypto
>>
>> HI Fiona
>>
>> Thanks for your feedback. Response below.
>>
>> >-----Original Message-----
>> >From: Trahe, Fiona [mailto:fiona.tr...@intel.com]
>> >Sent: 09 February 2018 23:43
>> >To: dev@dpdk.org; Athreya, Narayana Prasad 
>> ><narayanaprasad.athr...@cavium.com>; Murthy,
>> Nidadavolu
>> ><nidadavolu.mur...@cavium.com>; Sahu, Sunila <sunila.s...@cavium.com>; 
>> >Gupta, Ashish
>> <ashish.gu...@cavium.com>; Verma,
>> >Shally <shally.ve...@cavium.com>; Doherty, Declan 
>> ><declan.dohe...@intel.com>; Keating, Brian A
>> <brian.a.keat...@intel.com>;
>> >Griffin, John <john.grif...@intel.com>
>> >Cc: Trahe, Fiona <fiona.tr...@intel.com>; De Lara Guarch, Pablo 
>> ><pablo.de.lara.gua...@intel.com>
>> >Subject: RE: [dpdk-dev] [RFC v1 1/1] lib/cryptodev: add support of 
>> >asymmetric crypto
>> >
>> >Hi Shally,
>> >Comments below.
>> >
>> >> -----Original Message-----
>> >> From: dev [mailto:dev-boun...@dpdk.org] On Behalf Of Shally Verma
>> >> Sent: Tuesday, January 23, 2018 9:54 AM
>> >> To: Doherty, Declan <declan.dohe...@intel.com>
>> >> Cc: dev@dpdk.org; pathr...@caviumnetworks.com; nmur...@caviumnetworks.com;
>> >> ss...@caviumnetworks.com; agu...@caviumnetworks.com; Shally Verma
>> >> <sve...@caviumnetworks.com>
>> >> Subject: [dpdk-dev] [RFC v1 1/1] lib/cryptodev: add support of asymmetric 
>> >> crypto
>> >>
>> >> From: Shally Verma <sve...@caviumnetworks.com>
>> >>
>> >> Add support for asymmetric crypto operations in DPDK lib cryptodev
>> >>
>> >> Key feature include:
>> >> - Only session based asymmetric crypto operations
>> >> - new get and set APIs for symmetric and asymmetric session private
>> >>   data and other informations
>> >> - APIs to create, configure and attch queue pair to asymmetric sessions
>> >> - new capabilities in struct device_info to indicate
>> >>   -- number of dedicated queue pairs available for symmetric and
>> >>      asymmetric operations, if any
>> >>   -- number of asymmetric sessions possible per qp
>> >>
>> >[Fiona] Though it's probably premature to include on the API have you 
>> >considered
>> >providing for pre-loaded keys in future, i.e. the ability to wrap keys or 
>> >refer to keys
>> >already stored securely on the device, as an alternative to passing the 
>> >keys on the API?
>> >
>> [Shally] Current intention of DPDK asym spec is to expose HW capabilities to 
>> application to offload these
>> compute intensive ops.
>> Though your use-case is very much a practical requirement , but to achieve 
>> this I believe we need a layer
>> above this spec and need different interfaces. Such as, some public/secure 
>> key library which provide
>> interfaces to generate / store/ perform op using an opaque key handles which 
>> internally can use DPDK
>> to do part of it. For such case, I envision dpdk (or library above) will 
>> likely run on some secure processor.
>> Thus, currently I kept such use-case out of current spec scope.
>[Fiona] ok
>
>> >
>> >> Proposed asymmetric cryptographic operations are:
>> >> - rsa
>> >> - dsa
>> >> - deffie-hellman key pair generation and shared key computation
>> >> - ecdeffie-hellman
>> >> - fundamental elliptic curve operations
>> >> - elliptic curve DSA
>> >> - modular exponentiation and inversion
>> >>
>> >> This patch primarily defines PMD operations and device capabilities
>> >> to perform asymmetric crypto ops on queue pairs and intend to
>> >> invite feedbacks on current proposal so as to ensure it encompass
>> >> all kind of crypto devices with different capabilities and queue
>> >> pair management.
>> >>
>> >> List of TBDs:
>> >> - Currently, patch only updated for RSA xform and associated params.
>> >>   Other algoritms to be added in subsequent versions.
>> >> - per-service stats update
>> >>
>> >> Signed-off-by: Shally Verma <sve...@caviumnetworks.com>
>> >> ---
>> >>
>> >> It is derivative of RFC v2 asymmetric crypto patch series initiated by
>> >> Umesh Kartha(mailto:umesh.kar...@caviumnetworks.com):
>> >>
>> >>  http://dpdk.org/dev/patchwork/patch/24245/
>> >>  http://dpdk.org/dev/patchwork/patch/24246/
>> >>  http://dpdk.org/dev/patchwork/patch/24247/
>> >>
>> >> And inclusive of all review comments given on RFC v2.
>> >>  ( See complete discussion thread here:
>> >> http://dev.dpdk.narkive.com/yqTFFLHw/dpdk-dev-rfc-specifications-for-asymmetric-crypto-
>> >> algorithms#post12)
>> >>
>> >> Some of the RFCv2 Review comments pending for closure:
>> >> > " [Fiona] The count fn isn't used at all for sym - probably no need to 
>> >> > add for asym
>> >>      better instead to remove the sym fn."
>> >>
>> >>      It is still present in dpdk-next-crypto for sym, so what has been 
>> >> decision
>> >>      on it?
>> >[Fiona] No change. The rte_cryptodev_ops fn is still not called so useless 
>> >and should be removed.
>> >rte_cryptodev_queue_pair_count() returns the num_qps configured in
>> >rte_cryptodev_configure(), but never calls the PMD 
>> >dev_ops.queue_pair_count().
>> >So cryptodev_sym_queue_pair_count_t should be deprecated.
>> >And no point in adding one for asym.
>> >
>>
>> [Shally] Ok
>>
>> >>
>> >> >"[Fiona] if each qp can handle only a specific service, i.e. a subset 
>> >> >off the capabilities
>> >>     Indicated by the device capability list, there's a need for a new API 
>> >> to query
>> >>     the capability of a qp."
>> >>
>> >>     Current proposal doesn’t distinguish between device capability and qp 
>> >> capability.
>> >>     It rather leave such differences handling internal to PMDs. Thus no 
>> >> capability
>> >>     or API added for qp in current version. It is subject to revisit 
>> >> based on review
>> >>     feedback on current proposal.
>> >[Fiona] This would not work for some devices, comments below.
>> >
>> >>
>> >> - Sessionless Support.
>> >>     Current proposal only support Session-based because:
>> >>      1. All one-time setup i.e.  algos and associated params, such as, 
>> >> public-private keys
>> >>         or modulus length can be done in control path using session-init 
>> >> API
>> >>      2. it’s an easier way to dedicate qp to do specific service (using 
>> >> queue_pair_attach())
>> >>         which cannot be case in sessionless
>> >>      3. Couldn’t find any significant advantage going sessionless way. 
>> >> Also existing most of PMDs are
>> >> session-based.
>> >>
>> >>     It could be added in subsequent versions, if requirement is 
>> >> identified, based on review comment
>> >>     on this RFC.
>> >[Fiona] Our preference would be for sessionless, as it would need fewer API 
>> >calls (no
>> session_create/session_clear)
>> >and e.g. DH and ECDH sessions are likely to be only used for a single op. 
>> >However this is not a blocker
>> for
>> >this API, we can POC it later and propose an extension to the API if it 
>> >gives a performance
>> improvement.
>> >
>> [Shally] You mean you recommend to have session-less support along with 
>> session-based?
>[Fiona] Yes. But as stated, it's ok to start without it and add later.
>
>
>> >>
>> >> Summary
>> >> -------
>> >>
>> >> This section provides an overview of key feature enabled in current 
>> >> specification.
>> >> It comprise of key design challenges as have been identified on RFCv2 and
>> >> summary description of new interfaces and definitions added to handle 
>> >> same.
>> >>
>> >> Description
>> >> -----------
>> >>
>> >> This API set assumes that the max_nb_queue_pairs on a
>> >> device can be allocated to any mix of sym or asym. Some devices
>> >> may have a fixed max per service. Thus, rte_cryptodev_info
>> >> is updated with max_sym_nb_queues and max_asym_nb_queues with rule:
>> >>
>> >> max_nb_queue_pair = max_nb_sym_qp + max_nb_asym_qp.
>> >>
>> >> If device has no restrictions on qp to be used per service, such PMDs can 
>> >> leave
>> >> max_nb_sym_qp = max_nb_asym_qp = 0. In such case, application can setup 
>> >> any of
>> >> the service upto limit defined by max_nb_queue_pair.
>> >[Fiona] This seems awkward if a genuine 0  e.g. An appl wants to set up a 
>> >sym qp, and
>> >sees that max_nb_queue_pair=4. Can't trust this - needs to look deeper. Sees
>> >max_nb_sym_qp=0. Doesn't know if that means it can set up 4 sym qps or no 
>> >qps
>> >until it also checks max_nb_asym_qp. If=4 then it can't set up any sym qp, 
>> >if=0 it can set up 4.
>> >Would it be better if
>> >    max_nb_queue_pair = max(max_nb_sym_qp, max_nb_asym_qp).
>> >    max_nb_sym_qp = 0..max_nb_queue_pair
>> >    max_nb_asym_qp = 0..max_nb_queue_pair
>> >
>>
>> [Shally] Ok. I can change definition to replace 0 by max num for no-limit 
>> case with slight modification  to
>> the condition i.e.
>> max_nb_queue_pair >=  max(max_nb_sym_qp, max_nb_asym_qp)
>>
>> because device can have distribution of (max_nb_queue_pair, max_nb_sym_qp, 
>> max_nb_asym_qp) as
>> (4,4,4) or (4,3,1)
>> where total number of qp setup by application cannot exceed 
>> max_nb_queue_pairs.
>>
>> >> Here, max_nb_sym_qp and max_nb_asym_qp, if non-zero, just define limit on 
>> >> qp which are
>> >> available for each service and *are not* ids to be used during qp setup 
>> >> and enqueue i.e.
>> >> if device supports both symmetric and asymmetric with n qp, then any of 
>> >> them
>> >> can be configured for symmetric or asymmetric subject to limit defined by
>> >> max_nb_sym_qp and max_nb_asym_qp. For example,
>> >> if device has 6 queues and 5 for symmetric and 1 for asymmetric that imply
>> >> application can setup only 1 out of any 6 qp for asymmetric and rest for
>> >> symmetric.
>> >>
>> >> Additionally, application can dedicate qp to perform specific service via 
>> >> optional
>> >> queue_pair_attach_sym/asym_session() API.
>> >[Fiona] This is too late - some devices have qps which need to know at 
>> >setup which
>> >service they'll be used for, as they reserve resources based on the service.
>> >e.g. a device reports in info that it can support qps(max 4, max_sym 2, max 
>> >asym 2)
>> >An application just wants to use 1 sym qp and 1 asym, so configures device 
>> >with
>> >qps(max 2, max_sym 1, max asym 1)
>> >Now appl calls qp_setup for qp index 0. Wants to start with running 
>> >asymmetric
>> >service and will set up the symmetric later, maybe in a separate thread.
>> >Our devices need to know at setup time which service will be used on the qp.
>> >So haven't been given enough information to setup the qp.
>> >
>> >Even if the PMD could set up service-agnostic qps and just map later, you
>> >suggest the qp_attach_sym/asym_session() would be optional. How could the 
>> >appl
>> >make the decision whether to call it or not in above case? It needs to know 
>> >whether
>> >the created qp is agnostic or not, so a capability must be reported by the 
>> >PMD.
>> >OR the API should not be optional, must be called for every session.
>> >But that's perf impacting and not helpful if a device could support 
>> >service-agnostic qps.
>> >
>> >I don't have a solution for service-agnostic qps. For our devices that's 
>> >not necessary.
>> >Is it likely that anyone wants to set up a qp to process both sym and asym 
>> >ops?
>> >Is it sufficient to accommodate qps which can support either
>> >service, but one must be picked at setup after which the qp supports only 
>> >that service?
>> >How about the following - :
>> > - device reports in info qps(max, max_sym, max asym) where
>> >    max = max(max_sym, max_asym).
>> >    max_sym = 0..max
>> >    max_asym = 0..max
>> >    So if a device reports 4,2,2, it has 4 total, 2 can be setup for sym, 2 
>> > for asym
>> >    Or if it reports 4,4,4, all 4 of them can be setup as sym or all 4 as
>> >    asym or a mix, but total setup can't be more than 4.
>> > - appl configures qps(max, max_sym, max_asym)
>> >    If it specifies 4,1,3 it wants to use 4 in total, 1 for sym, 3 for asym.
>> >    If it specifies 1,1,0 it wants to use 1 in total, 1 for sym, 0 for asym.
>> >    The numbers it configures must be <= those reported in info.
>> > - appl calls qp_setup(dev, qp, service) where service = sym or asym
>> >    qp index must be between 0..max-1
>> >    The PMD maps that index to an internal qp which can support the 
>> > requested service.
>> >    If qp_setup is called on an index and the max configured qps have 
>> > already
>> >    been setup for that service then the setup fails.
>> >In case the appl forgets which qp it set up for which service, I think it 
>> >would be necessary to add a new
>> API
>> >    rte_cryptodev_qp_info() which would return what service is configured 
>> > on the qp
>> >
>> >If it's necessary to support service-agnostic qps, then one way would be to 
>> >specify a third service above
>> as
>> > - sym+asym.
>> >And have devices report max_sym_asym_qps?
>> >
>> >It's difficult to find a solution for this without breaking the current API 
>> >- see simpler
>> >alternative below.
>> >
>> >> Except the ones mentioned above, specification doesn't define any 
>> >> restrictions on
>> >> enqueue/dequeue API for different crypto services. Application can 
>> >> enqueue both symmetric
>> >> and asymmetric operations to same device and qp if device info indicate 
>> >> support of both
>> >> symmetric and asymmetric and qp is not dedicated to any. However in 
>> >> practice, it could
>> >> result in head-of-line blocking due to the asym ops taking longer than 
>> >> the symmetric ops.
>> >>
>> >> Some HW accelerators avoid this issue by supporting sym and asym ops
>> >> on different qps on the same device.  Such devices can set max_nb_sym_qp 
>> >> and
>> >> max_nb_asym_qp to number of queues available for each respective service.
>> >>
>> >> This may give problem in indexing on enqueue/dequeue i.e.
>> >> if 2 asym qps and 2 sym qps are created on the same device,
>> >> the queue_pair_ids are duplicated. To handle such scenario,
>> >> 2 alternatives are proposed for PMD design:
>> >>
>> >> 1. Allow all qp to input any operation type virtually. Say,
>> >>
>> >>     Consider device with symmetric and asymmetric capability having
>> >>     max_nb_queue_pair as 6, then by design, all 6 are capable to input
>> >>     both op types.
>> >>
>> >>     If PMD uses fixed set of qp, then internally, can map qp id to
>> >>     actual physical qp id to be used according to session/op type.
>> >>     If such mapping is done on data path, may impact performance of PMDs.
>> >>     Thus, to handle such mapping out of data path, library provides an API
>> >>     queue_pair_attach_sym/asym_session() which facilitate application to
>> >>     dedicate qp id to perform specific (sym/asym) service in control path
>> >>     and should be called before 1st call to enqueue_burst().
>> >>     Here PMD can bind app provided logical qp id to actual physical qp id 
>> >> to use
>> >>     depending on session type , OR alternatively
>> >>
>> >> 2. PMDs can split it into two PMDs, one with symmetric ONLY capability 
>> >> and other
>> >>     with asymmetric ONLY capability (also proposed by Fiona in RFCv2).
>> >>     This may require some  changes to EAL to facilitate pci device 
>> >> sharing between
>> >>     PMDs, enabling separation of sym and  asym services onto different 
>> >> PMDs.
>> >>     As per RFCv2 feedback, Intel  proposed to submit a patch to  enable 
>> >> this.
>> >[Fiona] The eal changes were problematic, and feedback from the Dublin 
>> >userspace
>> >event last September was that several others have tried similar but 
>> >reverted to resolving
>> >the problem within the PMD. This is what we are also in the process of 
>> >doing.
>> >With this we intend to avoid all the above complications.
>> >i.e. one pci device, in its probe fn, can create multiple API device 
>> >instances.
>> >One instance of cryptodev will provide a sym crypto service, one instance of
>> >compressdev will provide a compression service and a second cryptodev 
>> >instance will
>> >provide the asymmetric service. All qps on each API device instance can 
>> >then support all
>> >of the capabilities reported by that device.
>> >
>> >A suggestion for keeping the simplicity on the API would be to follow the 
>> >same pattern.
>> >i.e. don't provide any support for specification of sym or asym qps. Expect 
>> >all
>> >qps on each device to support all capabilities reported.
>> >
>> >
>>
>> [Shally] Initially I had thought of same proposal to add an input field in 
>> qp_conf so that PMD can know
>> at qp_setup time which service it going to be used for.
>> However looking that spec already had qp_attach_sym/asym APIs and also the 
>> possibility that some
>> device can support service - agnostic qp, I initiated with current proposal.
>> I marked them optional with a disclaimer that , if not attached, then PMD 
>> will then need to map logical
>> qpid to physical during enqueue_burst() which might result in impacted 
>> performance.
>> This is particularly applicable to devices which internally have fixed qps 
>> per each service and set
>> max_nb_sym/asym_qp to indicate same.
>> And thus for such devices, I primarily recommended that they should appear 
>> as two separate PMDs
>> where one support sym and other asym.
>> However, only point to is to see how well suited is this for each device 
>> driver design as it might rather
>> turn to be simpler for some implementation to just have single way to 
>> dedicate a qp to a service via
>> attach or qp_setup change than having two separate instances.
>>
>> But, I concur from your thoughts. We can start with simple definition and 
>> remove concept of
>> max_nb_sym_qp and max_nb_asym_qp in first version and say
>> -if device support service agnostic qp, that means all of its qp can be set 
>> up for any service. PMD can
>> show in its feature flag support for symmetric and asymmetric crypto. 
>> Application can set up qp the way
>> it want, spec define no recommended way of usage here.
>[Fiona] I would word this differently, as no mechanism is provided for an appl 
>to setup a qp for a specific service.
>If PMD shows in its feature flag that it supports both sym and asym then it 
>must support those on all its qps.
>Application may choose to direct all asym ops to one qp and all asym to a 
>different qp to avoid
>head-of-line blocking, but there is nothing in the qp setup or capabilities to 
>prevent the application
>from sending an enqueue_burst() with a mix of asym and sym ops all to the same 
>qp and it should work.
>

[Shally] Clear.

>> -if device has fixed set of qp per each service, then it should split itself 
>> into two : symmetric only and
>> asymmetric only.
>[Fiona] For us this is ok, but it would be good to get feedback from other 
>providers of hw acceleration
>as it is quite a constraint.
>

[Shally] That's the intention but until then I assume we agree to current 
proposal?!

If yes, then just to align and close on our discussion on this here’s the 
summary :
- There's no differentiation to device capability and qp capability.  If PMD 
shows in its feature flag that it supports both sym and asym then it must 
support those on all its qps.
- if PMD support both but internally has hw with dedicated qp for each service 
then it *can* split itself into two: symmetric only and asymmetric only PMD 
instances.
- Currently we don’t see a requirement to dedicate qp to a service, thus no 
need for max_nb_sym/asym_qp or service_type info during qp_setup. However this 
is open for review and discussion and can be added later, if any requirement is 
identified for same.

Is that correct?

Thanks
Shally
>> This is well suited for session-less also.  IMO, If any issues reported with 
>> these rules, then we can add
>> this support later based on the then identified requirement. However, if we 
>> end up adding the support
>> back of max_nb_sym/asym_qp in spec later, then attach/detach_qp APIs will 
>> not be sufficient as they
>> are session specific. Given that, having an input param during qp_setup() is 
>> more generic way that suit
>> both session and sessionless way. Does this all sounds right?
>[Fiona] agreed.
>
>>
>> I will wait to close on this design discussion first before giving feedback 
>> to rest of the comment further
>> below. But consider all feedback regarding typo and licensing as 
>> acknowledged.
>>
>> Thanks
>> Shally
>>

Reply via email to