25 Dec, 2008

15 commits

  • Previous commit for interrupt mitigation moved the done interrupt
    acknowlegement from the isr to the talitos_done tasklet.
    This patch moves the done interrupt acknowledgement back
    into the isr so that done interrupts will always be acknowledged.
    This covers the case for acknowledging interrupts for channel done processing
    that has actually already been completed by the tasklet prior to fielding
    a pending interrupt.

    Signed-off-by: Lee Nipper
    Signed-off-by: Kim Phillips
    Signed-off-by: Herbert Xu

    Lee Nipper
     
  • Base versions handle constant folding just fine.

    Signed-off-by: Harvey Harrison
    Signed-off-by: Herbert Xu

    Harvey Harrison
     
  • Use KM_SOFTIRQ instead of KM_IRQ in tasklet context.
    Added bug_on on input no-page condition.

    Signed-off-by: Evgeniy Polyakov
    Signed-off-by: Herbert Xu

    Evgeniy Polyakov
     
  • Fix queue management. Change ring size and perform its check not
    one after another descriptor, but using stored pointers to the last
    checked descriptors.

    Signed-off-by: Evgeniy Polyakov
    Signed-off-by: Herbert Xu

    Evgeniy Polyakov
     
  • Signed-off-by: Patrick McHardy
    Signed-off-by: Evgeniy Polyakov
    Signed-off-by: Herbert Xu

    Patrick McHardy
     
  • Signed-off-by: Patrick McHardy
    Signed-off-by: Evgeniy Polyakov
    Signed-off-by: Herbert Xu

    Patrick McHardy
     
  • HIFN uses the transform context to store per-request data, which breaks
    when more than one request is outstanding. Move per request members from
    struct hifn_context to a new struct hifn_request_context and convert
    the code to use this.

    Signed-off-by: Patrick McHardy
    Signed-off-by: Evgeniy Polyakov
    Signed-off-by: Herbert Xu

    Patrick McHardy
     
  • Signed-off-by: Patrick McHardy
    Signed-off-by: Evgeniy Polyakov
    Signed-off-by: Herbert Xu

    Patrick McHardy
     
  • Signed-off-by: Patrick McHardy
    Signed-off-by: Evgeniy Polyakov
    Signed-off-by: Herbert Xu

    Patrick McHardy
     
  • Resetting the control word is quite expensive. Fortunately this
    isn't an issue for the common operations such as CBC and ECB as
    the whole operation is done through a single call. However, modes
    such as LRW and XTS have to call padlock over and over again for
    one operation which really hurts if each call resets the control
    word.

    This patch uses an idea by Sebastian Siewior to store the last
    control word used on a CPU and only reset the control word if
    that changes.

    Note that any task switch automatically resets the control word
    so we only need to be accurate with regard to the stored control
    word when no task switches occur.

    Signed-off-by: Herbert Xu

    Herbert Xu
     
  • In commit ec6644d6325b5a38525f1d5b20fd4bf7db05cf2a "crypto: talitos - Preempt
    overflow interrupts", the test in atomic_inc_not_zero was interpreted by the
    author to be applied after the increment operation (not before). This off-by-one
    fix prevents overflow error interrupts from occurring when requests are frequent
    and large enough to do so.

    Signed-off-by: Vishnu Suresh
    Signed-off-by: Kim Phillips
    Signed-off-by: Herbert Xu

    Vishnu Suresh
     
  • SEC version 2.1 and above adds the capability to do the IPSec ICV
    memcmp in h/w. Results of the cmp are written back in the descriptor
    header, along with the done status. A new callback is added that
    checks these ICCR bits instead of performing the memcmp on the core,
    and is enabled by h/w capability.

    Signed-off-by: Kim Phillips

    After testing on different parts, another condition was added
    before using h/w auth check because different
    SEC revisions require different handling.

    The SEC 3.0 allows a more flexible link table where
    the auth data can span separate link table entries.
    The SEC 2.4/2.1 does not support this case.
    So a test was added in the decrypt routine
    for a fragmented case; the h/w auth check is disallowed for
    revisions not having the extent in the link table;
    in this case the hw auth check is done by software.

    A portion of a previous change for SEC 3.0 link table handling
    was removed since it became dead code with the hw auth check supported.

    This seems to be the best compromise for using hw auth check
    on supporting SEC revisions; it keeps the link table logic
    simpler for the fragmented cases.

    Signed-off-by: Lee Nipper
    Signed-off-by: Herbert Xu

    Kim Phillips
     
  • In talitos_interrupt, upon one done interrupt, mask further done interrupts,
    and ack only any error interrupt.
    In talitos_done, unmask done interrupts after completing processing.
    In flush_channel, ack each done channel processed.
    Keep done overflow interrupts masked because even though each pkt
    is ack'ed, a few done overflows still occur.

    Signed-off-by: Lee Nipper
    Signed-off-by: Kim Phillips
    Signed-off-by: Herbert Xu

    Lee Nipper
     
  • Since we ack early, the re-read interrupt status in talitos_error
    may be already updated with a new value. Pass the error ISR value
    directly in order to report and handle the error based on the correct
    error status.

    Also remove unused error tasklet.

    Signed-off-by: Kim Phillips
    Signed-off-by: Lee Nipper
    Signed-off-by: Herbert Xu

    Kim Phillips
     
  • On Tue, Sep 23, 2008 at 08:06:32PM +0200, Dimitri Puzin (max@psycast.de) wrote:
    > With this patch applied it still doesn't work as expected. The overflow
    > messages are gone however syslog shows
    > [ 120.924266] hifn0: abort: c: 0, s: 1, d: 0, r: 0.
    > when doing cryptsetup luksFormat as in original e-mail. At this point
    > cryptsetup hangs and can't be killed with -SIGKILL. I've attached
    > SysRq-t dump of this condition.

    Yes, I was wrong with the patch: HIFN does not support 64-bit addresses
    afaics.

    Attached patch should not allow HIFN to be registered on 64-bit arch, so
    crypto layer will fallback to the software algorithms.

    Signed-off-by: Evgeniy Polyakov
    Signed-off-by: Herbert Xu

    Evgeniy Polyakov
     

01 Dec, 2008

1 commit

  • talitos_remove() can be called from talitos_probe() on failure
    exit path, so it can't be __devexit.

    Signed-off-by: Al Viro
    Signed-off-by: Linus Torvalds

    Al Viro
     

15 Sep, 2008

1 commit

  • The SEC's h/w IV out implementation DMAs the trailing encrypted payload
    block of the last encryption to ctx->iv. Since the last encryption may
    still be pending completion, we can sufficiently prevent successive
    packets from being transmitted with the same IV by xoring with sequence
    number.

    Also initialize alg_list earlier to prevent oopsing on a failed probe.

    Signed-off-by: Kim Phillips
    Signed-off-by: Lee Nipper
    Signed-off-by: Herbert Xu

    Kim Phillips
     

13 Aug, 2008

2 commits

  • Wolfgang Walter reported this oops on his via C3 using padlock for
    AES-encryption:

    ##################################################################

    BUG: unable to handle kernel NULL pointer dereference at 000001f0
    IP: [] __switch_to+0x30/0x117
    *pde = 00000000
    Oops: 0002 [#1] PREEMPT
    Modules linked in:

    Pid: 2071, comm: sleep Not tainted (2.6.26 #11)
    EIP: 0060:[] EFLAGS: 00010002 CPU: 0
    EIP is at __switch_to+0x30/0x117
    EAX: 00000000 EBX: c0493300 ECX: dc48dd00 EDX: c0493300
    ESI: dc48dd00 EDI: c0493530 EBP: c04cff8c ESP: c04cff7c
    DS: 007b ES: 007b FS: 0000 GS: 0033 SS: 0068
    Process sleep (pid: 2071, ti=c04ce000 task=dc48dd00 task.ti=d2fe6000)
    Stack: dc48df30 c0493300 00000000 00000000 d2fe7f44 c03b5b43 c04cffc8 00000046
    c0131856 0000005a dc472d3c c0493300 c0493470 d983ae00 00002696 00000000
    c0239f54 00000000 c04c4000 c04cffd8 c01025fe c04f3740 00049800 c04cffe0
    Call Trace:
    [] ? schedule+0x285/0x2ff
    [] ? pm_qos_requirement+0x3c/0x53
    [] ? acpi_processor_idle+0x0/0x434
    [] ? cpu_idle+0x73/0x7f
    [] ? rest_init+0x61/0x63
    =======================

    Wolfgang also found out that adding kernel_fpu_begin() and kernel_fpu_end()
    around the padlock instructions fix the oops.

    Suresh wrote:

    These padlock instructions though don't use/touch SSE registers, but it behaves
    similar to other SSE instructions. For example, it might cause DNA faults
    when cr0.ts is set. While this is a spurious DNA trap, it might cause
    oops with the recent fpu code changes.

    This is the code sequence that is probably causing this problem:

    a) new app is getting exec'd and it is somewhere in between
    start_thread() and flush_old_exec() in the load_xyz_binary()

    b) At pont "a", task's fpu state (like TS_USEDFPU, used_math() etc) is
    cleared.

    c) Now we get an interrupt/softirq which starts using these encrypt/decrypt
    routines in the network stack. This generates a math fault (as
    cr0.ts is '1') which sets TS_USEDFPU and restores the math that is
    in the task's xstate.

    d) Return to exec code path, which does start_thread() which does
    free_thread_xstate() and sets xstate pointer to NULL while
    the TS_USEDFPU is still set.

    e) At the next context switch from the new exec'd task to another task,
    we have a scenarios where TS_USEDFPU is set but xstate pointer is null.
    This can cause an oops during unlazy_fpu() in __switch_to()

    Now:

    1) This should happen with or with out pre-emption. Viro also encountered
    similar problem with out CONFIG_PREEMPT.

    2) kernel_fpu_begin() and kernel_fpu_end() will fix this problem, because
    kernel_fpu_begin() will manually do a clts() and won't run in to the
    situation of setting TS_USEDFPU in step "c" above.

    3) This was working before the fpu changes, because its a spurious
    math fault which doesn't corrupt any fpu/sse registers and the task's
    math state was always in an allocated state.

    With out the recent lazy fpu allocation changes, while we don't see oops,
    there is a possible race still present in older kernels(for example,
    while kernel is using kernel_fpu_begin() in some optimized clear/copy
    page and an interrupt/softirq happens which uses these padlock
    instructions generating DNA fault).

    This is the failing scenario that existed even before the lazy fpu allocation
    changes:

    0. CPU's TS flag is set

    1. kernel using FPU in some optimized copy routine and while doing
    kernel_fpu_begin() takes an interrupt just before doing clts()

    2. Takes an interrupt and ipsec uses padlock instruction. And we
    take a DNA fault as TS flag is still set.

    3. We handle the DNA fault and set TS_USEDFPU and clear cr0.ts

    4. We complete the padlock routine

    5. Go back to step-1, which resumes clts() in kernel_fpu_begin(), finishes
    the optimized copy routine and does kernel_fpu_end(). At this point,
    we have cr0.ts again set to '1' but the task's TS_USEFPU is stilll
    set and not cleared.

    6. Now kernel resumes its user operation. And at the next context
    switch, kernel sees it has do a FP save as TS_USEDFPU is still set
    and then will do a unlazy_fpu() in __switch_to(). unlazy_fpu()
    will take a DNA fault, as cr0.ts is '1' and now, because we are
    in __switch_to(), math_state_restore() will get confused and will
    restore the next task's FP state and will save it in prev tasks's FP state.
    Remember, in __switch_to() we are already on the stack of the next task
    but take a DNA fault for the prev task.

    This causes the fpu leakage.

    Fix the padlock instruction usage by calling them inside the
    context of new routines irq_ts_save/restore(), which clear/restore cr0.ts
    manually in the interrupt context. This will not generate spurious DNA
    in the context of the interrupt which will fix the oops encountered and
    the possible FPU leakage issue.

    Reported-and-bisected-by: Wolfgang Walter
    Signed-off-by: Suresh Siddha
    Signed-off-by: Herbert Xu

    Suresh Siddha
     
  • Later SEC revision requires the link table (used for scatter/gather)
    to have an extra entry to account for the total length in descriptor [4],
    which contains cipher Input and ICV.
    This only applies to decrypt, not encrypt.
    Without this change, on 837x, a gather return/length error results
    when a decryption uses a link table to gather the fragments.
    This is observed by doing a ping with size of 1447 or larger with AES,
    or a ping with size 1455 or larger with 3des.

    So, add check for SEC compatible "fsl,3.0" for using extra link table entry.

    Signed-off-by: Lee Nipper
    Signed-off-by: Kim Phillips
    Signed-off-by: Herbert Xu

    Lee Nipper
     

07 Aug, 2008

1 commit


17 Jul, 2008

6 commits


13 Jul, 2008

1 commit

  • Without CRYPTO_AUTHENC the driver fails to build:
    drivers/built-in.o: In function `ixp_module_init':
    ixp4xx_crypto.c:(.init.text+0x3250): undefined reference to `crypto_aead_type'

    Signed-off-by: Imre Kaloz
    Signed-off-by: Herbert Xu

    Imre Kaloz
     

10 Jul, 2008

13 commits