Ticket #3007: 0001-Remove-excessive-locking-from-cache-operations.patch

File 0001-Remove-excessive-locking-from-cache-operations.patch, 2.9 KB (added by munster, on 05/11/17 at 14:25:40)
  • c/src/lib/libbsp/arm/shared/arm-l2c-310/cache_.h

    From a90b74c2593ddf8a63fa34532590d2794f062097 Mon Sep 17 00:00:00 2001
    From: munster <something@my.door>
    Date: Thu, 11 May 2017 14:33:10 +0100
    Subject: [PATCH 1/2] Remove excessive locking from cache operations.
    
    According to manual, the used operations (Clean Line by PA, Clean and Invalidate Line by PA, Cache Sync) are atomic and do not require locking.
    ---
     c/src/lib/libbsp/arm/shared/arm-l2c-310/cache_.h | 44 +++++-------------------
     1 file changed, 9 insertions(+), 35 deletions(-)
    
    diff --git a/c/src/lib/libbsp/arm/shared/arm-l2c-310/cache_.h b/c/src/lib/libbsp/arm/shared/arm-l2c-310/cache_.h
    index f7017b7688..81b34a62fa 100644
    a b l2c_310_flush_range( const void* d_addr, const size_t n_bytes ) 
    882882    & ~L2C_310_DATA_LINE_MASK;
    883883  const uint32_t ADDR_LAST         =
    884884    (uint32_t)( (size_t)d_addr + n_bytes - 1 );
    885   uint32_t       block_end         =
    886     L2C_310_MIN( ADDR_LAST, adx + L2C_310_MAX_LOCKING_BYTES );
    887885  volatile L2CC *l2cc = (volatile L2CC *) BSP_ARM_L2C_310_BASE;
    888886
    889887  if ( n_bytes == 0 ) {
    890888    return;
    891889  }
    892890
    893   for (;
    894        adx      <= ADDR_LAST;
    895        adx       = block_end + 1,
    896        block_end = L2C_310_MIN( ADDR_LAST, adx + L2C_310_MAX_LOCKING_BYTES )) {
    897     rtems_interrupt_lock_context lock_context;
    898 
    899     rtems_interrupt_lock_acquire( &l2c_310_lock, &lock_context );
    900 
    901     for (; adx <= block_end; adx += CPU_DATA_CACHE_ALIGNMENT ) {
    902       l2c_310_flush_1_line( l2cc, adx );
    903     }
    904 
    905     l2c_310_sync( l2cc );
    906 
    907     rtems_interrupt_lock_release( &l2c_310_lock, &lock_context );
     891  for (; adx <= ADDR_LAST; adx += CPU_DATA_CACHE_ALIGNMENT ) {
     892    l2c_310_flush_1_line( l2cc, adx );
    908893  }
     894
     895  l2c_310_sync( l2cc );
    909896}
    910897
    911898static inline void
    l2c_310_invalidate_range( const void* d_addr, const size_t n_bytes ) 
    950937    & ~L2C_310_DATA_LINE_MASK;
    951938  const uint32_t ADDR_LAST         =
    952939    (uint32_t)( (size_t)d_addr + n_bytes - 1 );
    953   uint32_t       block_end         =
    954     L2C_310_MIN( ADDR_LAST, adx + L2C_310_MAX_LOCKING_BYTES );
    955940  volatile L2CC *l2cc = (volatile L2CC *) BSP_ARM_L2C_310_BASE;
    956941
    957942  if ( n_bytes == 0 ) {
    958943    return;
    959944  }
    960945
    961   for (;
    962        adx      <= ADDR_LAST;
    963        adx       = block_end + 1,
    964        block_end = L2C_310_MIN( ADDR_LAST, adx + L2C_310_MAX_LOCKING_BYTES )) {
    965     rtems_interrupt_lock_context lock_context;
    966 
    967     rtems_interrupt_lock_acquire( &l2c_310_lock, &lock_context );
    968 
    969     for (; adx <= block_end; adx += CPU_DATA_CACHE_ALIGNMENT ) {
    970       /* Invalidate L2 cache line */
    971       l2cc->inv_pa = adx;
    972     }
    973 
    974     l2c_310_sync( l2cc );
    975 
    976     rtems_interrupt_lock_release( &l2c_310_lock, &lock_context );
     946  for (; adx <= ADDR_LAST; adx += CPU_DATA_CACHE_ALIGNMENT ) {
     947    /* Invalidate L2 cache line */
     948    l2cc->inv_pa = adx;
    977949  }
     950
     951  l2c_310_sync( l2cc );
    978952}
    979953
    980954