ide misc leftovers
cover ide misc leftovers
Hi Bart,
here is Linus' reworked ide-floppy reduce-stack-usage patch. It has been tested here on current pata tree with your latest 3 patches adding the per-device request queue locks. Along with that are 2 small cleanups.
drivers/ide/ide-cd.c | 8 +++++ drivers/ide/ide-cd.h | 8 ----- drivers/ide/ide-floppy.c | 26 +++++++++--------- drivers/ide/ide-floppy_ioctl.c | 58 +++++++++++++++++++-------------------- include/linux/ide.h | 48 ++++++++++++++++---------------- 5 files changed, 73 insertions(+), 75 deletions(-)
PATCH 1/3 ide-cd: move debug defines into header
--- drivers/ide/ide-cd.c | 8 -------- drivers/ide/ide-cd.h | 8 ++++++++ 2 files changed, 8 insertions(+), 8 deletions(-)
drivers/ide/ide-cd.c +0 -8
@@ -53,14 +53,6 @@#include "ide-cd.h" -#define IDECD_DEBUG_LOG 1 - -#if IDECD_DEBUG_LOG -#define ide_debug_log(lvl, fmt, args...) __ide_debug_log(lvl, fmt, args) -#else -#define ide_debug_log(lvl, fmt, args...) do {} while (0) -#endif -static DEFINE_MUTEX (idecd_ref_mutex);static void ide_cd_release (struct kref *);
drivers/ide/ide-cd.h +8 -0
@@ -8,6 +8,14 @@#include <linux/cdrom.h> #include <asm/byteorder.h> +#define IDECD_DEBUG_LOG 0 + +#if IDECD_DEBUG_LOG +#define ide_debug_log(lvl, fmt, args...) __ide_debug_log(lvl, fmt, args) +#else +#define ide_debug_log(lvl, fmt, args...) do {} while (0) +#endif +/* * typical timeout for packet command */
Signature · 1 line
1.6.0.4
PATCH 2/3 ide: make IDE_AFLAG_.. numbering continuous again
In reply to Borislav Petkov--- include/linux/ide.h | 48 ++++++++++++++++++++++++------------------------ 1 files changed, 24 insertions(+), 24 deletions(-)
include/linux/ide.h +24 -24
@@ -473,53 +473,53 @@ enum {/* ide-cd */ /* Drive cannot eject the disc. */ -IDE_AFLAG_NO_EJECT = (1 <<3 ), +IDE_AFLAG_NO_EJECT = (1 <<1 ),/* Drive is a pre ATAPI 1.2 drive. */ -IDE_AFLAG_PRE_ATAPI12 = (1 <<4 ), +IDE_AFLAG_PRE_ATAPI12 = (1 <<2 ),/* TOC addresses are in BCD. */ -IDE_AFLAG_TOCADDR_AS_BCD = (1 <<5 ), +IDE_AFLAG_TOCADDR_AS_BCD = (1 <<3 ),/* TOC track numbers are in BCD. */ -IDE_AFLAG_TOCTRACKS_AS_BCD = (1 <<6 ), +IDE_AFLAG_TOCTRACKS_AS_BCD = (1 <<4 ),/* * Drive does not provide data in multiples of SECTOR_SIZE * when more than one interrupt is needed. */ -IDE_AFLAG_LIMIT_NFRAMES = (1 <<7 ), +IDE_AFLAG_LIMIT_NFRAMES = (1 <<5 ),/* Saved TOC information is current. */ -IDE_AFLAG_TOC_VALID = (1 <<9 ), +IDE_AFLAG_TOC_VALID = (1 <<6 ),/* We think that the drive door is locked. */ -IDE_AFLAG_DOOR_LOCKED = (1 <<10 ), +IDE_AFLAG_DOOR_LOCKED = (1 <<7 ),/* SET_CD_SPEED command is unsupported. */ -IDE_AFLAG_NO_SPEED_SELECT = (1 <<11 ), -IDE_AFLAG_VERTOS_300_SSD = (1 <<12 ), -IDE_AFLAG_VERTOS_600_ESD = (1 <<13 ), -IDE_AFLAG_SANYO_3CD = (1 <<14 ), -IDE_AFLAG_FULL_CAPS_PAGE = (1 <<15 ), -IDE_AFLAG_PLAY_AUDIO_OK = (1 <<16 ), -IDE_AFLAG_LE_SPEED_FIELDS = (1 <<17 ), +IDE_AFLAG_NO_SPEED_SELECT = (1 <<8 ), +IDE_AFLAG_VERTOS_300_SSD = (1 <<9 ), +IDE_AFLAG_VERTOS_600_ESD = (1 <<10 ), +IDE_AFLAG_SANYO_3CD = (1 <<11 ), +IDE_AFLAG_FULL_CAPS_PAGE = (1 <<12 ), +IDE_AFLAG_PLAY_AUDIO_OK = (1 <<13 ), +IDE_AFLAG_LE_SPEED_FIELDS = (1 <<14 ),/* ide-floppy */ /* Avoid commands not supported in Clik drive */ -IDE_AFLAG_CLIK_DRIVE = (1 <<19 ), +IDE_AFLAG_CLIK_DRIVE = (1 <<15 ),/* Requires BH algorithm for packets */ -IDE_AFLAG_ZIP_DRIVE = (1 <<20 ), +IDE_AFLAG_ZIP_DRIVE = (1 <<16 ),/* Supports format progress report */ -IDE_AFLAG_SRFP = (1 <<22 ), +IDE_AFLAG_SRFP = (1 <<17 ),/* ide-tape */ -IDE_AFLAG_IGNORE_DSC = (1 <<23 ), +IDE_AFLAG_IGNORE_DSC = (1 <<18 ),/* 0 When the tape position is unknown */ -IDE_AFLAG_ADDRESS_VALID = (1 <<24 ), +IDE_AFLAG_ADDRESS_VALID = (1 <<19 ),/* Device already opened */ -IDE_AFLAG_BUSY = (1 <<25 ), +IDE_AFLAG_BUSY = (1 <<20 ),/* Attempt to auto-detect the current user block size */ -IDE_AFLAG_DETECT_BS = (1 <<26 ), +IDE_AFLAG_DETECT_BS = (1 <<21 ),/* Currently on a filemark */ -IDE_AFLAG_FILEMARK = (1 <<27 ), +IDE_AFLAG_FILEMARK = (1 <<22 ),/* 0 = no tape is loaded, so we don't rewind after ejecting */ -IDE_AFLAG_MEDIUM_PRESENT = (1 <<28 ), +IDE_AFLAG_MEDIUM_PRESENT = (1 <<23 ), - IDE_AFLAG_NO_AUTOCLOSE = (1 << 29), + IDE_AFLAG_NO_AUTOCLOSE = (1 << 24), };/* device flags */
Signature · 1 line
1.6.0.4
PATCH 3/3 ide-floppy: allocate only toplevel packet commands
In reply to Borislav PetkovThis makes the top-level function just allocate a single pc entry, and then pass it down as a pointer to all the helper functions that also need one of those "struct ide_atapi_pc" things. As far as I can tell, the use of these things never overlaps each other, BUT I DID NOT CHECK VERY CLOSELY!
So I'm not guaranteeing this is correct, and I don't have the hardware. It would be good for somebody who knows the code more, and has the hardware, could please test this?
With this, ide-floppy still has fairly big stack usage, but instead of
idefloppy_ioctl [vmlinux]: 1208 ide_floppy_get_capacity [vmlinux]: 872 idefloppy_release [vmlinux]: 408 idefloppy_open [vmlinux]: 408
where those two first ones are at the very top of the list of stack users for me, it's now
ide_floppy_get_capacity [vmlinux]: 404
ide_floppy_ioctl [vmlinux]: 364
ie they are still high, but they are no longer at the top.
Borislav: Since ide_floppy_get_capacity is passed as a function pointer to other parts of the kernel (e.g., block layer) we need that ide_atapi_pc to be created on stack. Also, redid stack users numbers above. The two functions missing from Linus' original 'make stackusage' output are due to ide being rewritten/reorganized atm.
--- drivers/ide/ide-floppy.c | 26 +++++++++--------- drivers/ide/ide-floppy_ioctl.c | 58 ++++++++++++++++++++------------------- 2 files changed, 43 insertions(+), 41 deletions(-)
drivers/ide/ide-floppy.c +13 -13
@@ -342,38 +342,38 @@ static ide_startstop_t ide_floppy_do_request(ide_drive_t *drive,* Look at the flexible disk page parameters. We ignore the CHS capacity * parameters and use the LBA parameters instead. */ -static int ide_floppy_get_flexible_disk_page (ide_drive_t *drive) +static int ide_floppy_get_flexible_disk_page (ide_drive_t *drive, +struct ide_atapi_pc *pc) {struct ide_disk_obj *floppy = drive->driver_data;struct gendisk *disk = floppy->disk; -struct ide_atapi_pc pc;u8 *page;int capacity, lba_capacity;u16 transfer_rate, sector_size, cyls, rpm;u8 heads, sectors; -ide_floppy_create_mode_sense_cmd (&pc,IDEFLOPPY_FLEXIBLE_DISK_PAGE ); +ide_floppy_create_mode_sense_cmd (pc,IDEFLOPPY_FLEXIBLE_DISK_PAGE ); -if (ide_queue_pc_tail (drive, disk, &pc)) { +if (ide_queue_pc_tail (drive, disk, pc)) { printk(KERN_ERR PFX "Can't get flexible disk page params\n");return 1 ; } -if (pc.buf[3 ] &0x80 ) +if (pc->buf[3 ] &0x80 ) drive->dev_flags |=IDE_DFLAG_WP ;else drive->dev_flags &= ~IDE_DFLAG_WP ;set_disk_ro (disk, !!(drive->dev_flags &IDE_DFLAG_WP )); - page = &pc.buf[8 ]; + page = &pc->buf[8 ]; - transfer_rate =be16_to_cpup ((__be16 *)&pc.buf[8 +2 ]); - sector_size =be16_to_cpup ((__be16 *)&pc.buf[8 +6 ]); - cyls =be16_to_cpup ((__be16 *)&pc.buf[8 +8 ]); - rpm =be16_to_cpup ((__be16 *)&pc.buf[8 +28 ]); - heads = pc.buf[8 +4 ]; - sectors = pc.buf[8 +5 ]; + transfer_rate =be16_to_cpup ((__be16 *)&pc->buf[8 +2 ]); + sector_size =be16_to_cpup ((__be16 *)&pc->buf[8 +6 ]); + cyls =be16_to_cpup ((__be16 *)&pc->buf[8 +8 ]); + rpm =be16_to_cpup ((__be16 *)&pc->buf[8 +28 ]); + heads = pc->buf[8 +4 ]; + sectors = pc->buf[8 +5 ]; capacity = cyls * heads * sectors * sector_size;
@@ -499,7 +499,7 @@ static int ide_floppy_get_capacity(ide_drive_t *drive)/* Clik! disk does not support get_flexible_disk_page */ if (!(drive->atapi_flags &IDE_AFLAG_CLIK_DRIVE )) - (void )ide_floppy_get_flexible_disk_page (drive); + (void )ide_floppy_get_flexible_disk_page (drive, &pc);return rc; }
drivers/ide/ide-floppy_ioctl.c +30 -28
142 lines not on this page · raw message
Signature · 1 line
1.6.0.4
Quoted 5 lines · Borislav Petkov
Hi Bart,
here is Linus' reworked ide-floppy reduce-stack-usage patch. It has been tested here on current pata tree with your latest 3 patches adding the per-device request queue locks. Along with that are 2 small cleanups.
Thanks, I applied all patches.