mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-10-13 18:17:39 -04:00
Add IO priority handling. Currently all IO has equal priority, except the dircache scanning thread which is lower. This fixes the slow boot problem for me, with the added benefit that actual audio playback also starts faster.
Lots of the changes are due to changing storage_(read|write)sectors() from macros to wrapper functions. This means that they have to be called with IF_MD2(drive,) again. Flyspray: FS#11167 Author: Frank Gevaerts git-svn-id: svn://svn.rockbox.org/rockbox/trunk@25459 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
ba7501513a
commit
376d8d577f
10 changed files with 220 additions and 102 deletions
|
@ -19,6 +19,162 @@
|
|||
*
|
||||
****************************************************************************/
|
||||
#include "storage.h"
|
||||
#include "kernel.h"
|
||||
|
||||
#ifdef CONFIG_STORAGE_MULTI
|
||||
|
||||
#define DRIVER_MASK 0xff000000
|
||||
#define DRIVER_OFFSET 24
|
||||
#define DRIVE_MASK 0x00ff0000
|
||||
#define DRIVE_OFFSET 16
|
||||
#define PARTITION_MASK 0x0000ff00
|
||||
|
||||
static unsigned int storage_drivers[NUM_DRIVES];
|
||||
static unsigned int num_drives;
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef HAVE_IO_PRIORITY
|
||||
|
||||
/* Same for flash? */
|
||||
#define STORAGE_MINIMUM_IDLE_TIME (HZ/10)
|
||||
#define STORAGE_DELAY_UNIT (HZ/20)
|
||||
|
||||
unsigned int storage_last_thread[NUM_DRIVES];
|
||||
unsigned int storage_last_activity[NUM_DRIVES];
|
||||
|
||||
static bool storage_should_wait(int drive, int prio)
|
||||
{
|
||||
int other_prio = thread_get_io_priority(storage_last_thread[drive]);
|
||||
if(TIME_BEFORE(current_tick,storage_last_activity[drive]+STORAGE_MINIMUM_IDLE_TIME))
|
||||
{
|
||||
if(prio<=other_prio)
|
||||
{
|
||||
/* There is another active thread, but we have lower priority */
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* There is another active thread, but it has lower priority */
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* There's nothing going on anyway */
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static void storage_wait_turn(IF_MD_NONVOID(int drive))
|
||||
{
|
||||
#ifndef HAVE_MULTIDRIVE
|
||||
int drive=0;
|
||||
#endif
|
||||
int my_prio = thread_get_io_priority(thread_get_current());
|
||||
int loops=my_prio;
|
||||
while(storage_should_wait(drive, my_prio) && (loops--)>=0)
|
||||
{
|
||||
sleep(STORAGE_DELAY_UNIT);
|
||||
}
|
||||
|
||||
storage_last_thread[drive] = thread_get_current();
|
||||
storage_last_activity[drive] = current_tick;
|
||||
}
|
||||
#endif
|
||||
|
||||
int storage_read_sectors(IF_MD2(int drive,) unsigned long start, int count,
|
||||
void* buf)
|
||||
{
|
||||
#ifdef HAVE_IO_PRIORITY
|
||||
storage_wait_turn(IF_MD(drive));
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_STORAGE_MULTI
|
||||
int driver=(storage_drivers[drive] & DRIVER_MASK)>>DRIVER_OFFSET;
|
||||
int ldrive=(storage_drivers[drive] & DRIVE_MASK)>>DRIVE_OFFSET;
|
||||
|
||||
switch (driver)
|
||||
{
|
||||
#if (CONFIG_STORAGE & STORAGE_ATA)
|
||||
case STORAGE_ATA:
|
||||
return ata_read_sectors(IF_MD2(ldrive,) start,count,buf);
|
||||
#endif
|
||||
|
||||
#if (CONFIG_STORAGE & STORAGE_MMC)
|
||||
case STORAGE_MMC:
|
||||
return mmc_read_sectors(IF_MD2(ldrive,) start,count,buf);
|
||||
#endif
|
||||
|
||||
#if (CONFIG_STORAGE & STORAGE_SD)
|
||||
case STORAGE_SD:
|
||||
return sd_read_sectors(IF_MD2(ldrive,) start,count,buf);
|
||||
#endif
|
||||
|
||||
#if (CONFIG_STORAGE & STORAGE_NAND)
|
||||
case STORAGE_NAND:
|
||||
return nand_read_sectors(IF_MD2(ldrive,) start,count,buf);
|
||||
#endif
|
||||
|
||||
#if (CONFIG_STORAGE & STORAGE_RAMDISK)
|
||||
case STORAGE_RAMDISK:
|
||||
return ramdisk_read_sectors(IF_MD2(ldrive,) start,count,buf);
|
||||
#endif
|
||||
}
|
||||
|
||||
return -1;
|
||||
#else /* CONFIG_STORAGE_MULTI */
|
||||
return STORAGE_FUNCTION(read_sectors)(IF_MD2(drive,)start,count,buf);
|
||||
#endif /* CONFIG_STORAGE_MULTI */
|
||||
|
||||
}
|
||||
|
||||
int storage_write_sectors(IF_MD2(int drive,) unsigned long start, int count,
|
||||
const void* buf)
|
||||
{
|
||||
#ifdef HAVE_IO_PRIORITY
|
||||
storage_wait_turn(IF_MD(drive));
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_STORAGE_MULTI
|
||||
int driver=(storage_drivers[drive] & DRIVER_MASK)>>DRIVER_OFFSET;
|
||||
int ldrive=(storage_drivers[drive] & DRIVE_MASK)>>DRIVE_OFFSET;
|
||||
|
||||
switch (driver)
|
||||
{
|
||||
#if (CONFIG_STORAGE & STORAGE_ATA)
|
||||
case STORAGE_ATA:
|
||||
return ata_write_sectors(IF_MD2(ldrive,)start,count,buf);
|
||||
#endif
|
||||
|
||||
#if (CONFIG_STORAGE & STORAGE_MMC)
|
||||
case STORAGE_MMC:
|
||||
return mmc_write_sectors(IF_MD2(ldrive,)start,count,buf);
|
||||
#endif
|
||||
|
||||
#if (CONFIG_STORAGE & STORAGE_SD)
|
||||
case STORAGE_SD:
|
||||
return sd_write_sectors(IF_MD2(ldrive,)start,count,buf);
|
||||
#endif
|
||||
|
||||
#if (CONFIG_STORAGE & STORAGE_NAND)
|
||||
case STORAGE_NAND:
|
||||
return nand_write_sectors(IF_MD2(ldrive,)start,count,buf);
|
||||
#endif
|
||||
|
||||
#if (CONFIG_STORAGE & STORAGE_RAMDISK)
|
||||
case STORAGE_RAMDISK:
|
||||
return ramdisk_write_sectors(IF_MD2(ldrive,)start,count,buf);
|
||||
#endif
|
||||
}
|
||||
|
||||
return -1;
|
||||
#else /* CONFIG_STORAGE_MULTI */
|
||||
return STORAGE_FUNCTION(write_sectors)(IF_MD2(drive,)start,count,buf);
|
||||
#endif /* CONFIG_STORAGE_MULTI */
|
||||
}
|
||||
|
||||
#ifdef CONFIG_STORAGE_MULTI
|
||||
|
||||
#define DRIVER_MASK 0xff000000
|
||||
#define DRIVER_OFFSET 24
|
||||
|
@ -98,79 +254,6 @@ int storage_init(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int storage_read_sectors(int drive, unsigned long start, int count,
|
||||
void* buf)
|
||||
{
|
||||
int driver=(storage_drivers[drive] & DRIVER_MASK)>>DRIVER_OFFSET;
|
||||
int ldrive=(storage_drivers[drive] & DRIVE_MASK)>>DRIVE_OFFSET;
|
||||
|
||||
switch (driver)
|
||||
{
|
||||
#if (CONFIG_STORAGE & STORAGE_ATA)
|
||||
case STORAGE_ATA:
|
||||
return ata_read_sectors(ldrive,start,count,buf);
|
||||
#endif
|
||||
|
||||
#if (CONFIG_STORAGE & STORAGE_MMC)
|
||||
case STORAGE_MMC:
|
||||
return mmc_read_sectors(ldrive,start,count,buf);
|
||||
#endif
|
||||
|
||||
#if (CONFIG_STORAGE & STORAGE_SD)
|
||||
case STORAGE_SD:
|
||||
return sd_read_sectors(ldrive,start,count,buf);
|
||||
#endif
|
||||
|
||||
#if (CONFIG_STORAGE & STORAGE_NAND)
|
||||
case STORAGE_NAND:
|
||||
return nand_read_sectors(ldrive,start,count,buf);
|
||||
#endif
|
||||
|
||||
#if (CONFIG_STORAGE & STORAGE_RAMDISK)
|
||||
case STORAGE_RAMDISK:
|
||||
return ramdisk_read_sectors(ldrive,start,count,buf);
|
||||
#endif
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
int storage_write_sectors(int drive, unsigned long start, int count,
|
||||
const void* buf)
|
||||
{
|
||||
int driver=(storage_drivers[drive] & DRIVER_MASK)>>DRIVER_OFFSET;
|
||||
int ldrive=(storage_drivers[drive] & DRIVE_MASK)>>DRIVE_OFFSET;
|
||||
|
||||
switch (driver)
|
||||
{
|
||||
#if (CONFIG_STORAGE & STORAGE_ATA)
|
||||
case STORAGE_ATA:
|
||||
return ata_write_sectors(ldrive,start,count,buf);
|
||||
#endif
|
||||
|
||||
#if (CONFIG_STORAGE & STORAGE_MMC)
|
||||
case STORAGE_MMC:
|
||||
return mmc_write_sectors(ldrive,start,count,buf);
|
||||
#endif
|
||||
|
||||
#if (CONFIG_STORAGE & STORAGE_SD)
|
||||
case STORAGE_SD:
|
||||
return sd_write_sectors(ldrive,start,count,buf);
|
||||
#endif
|
||||
|
||||
#if (CONFIG_STORAGE & STORAGE_NAND)
|
||||
case STORAGE_NAND:
|
||||
return nand_write_sectors(ldrive,start,count,buf);
|
||||
#endif
|
||||
|
||||
#if (CONFIG_STORAGE & STORAGE_RAMDISK)
|
||||
case STORAGE_RAMDISK:
|
||||
return ramdisk_write_sectors(ldrive,start,count,buf);
|
||||
#endif
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
void storage_enable(bool on)
|
||||
{
|
||||
|
@ -572,3 +655,5 @@ bool storage_present(int drive)
|
|||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /*CONFIG_STORAGE_MULTI*/
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue