Skip to contentSkip to conversation

atang tree: make SATA Asynchronous Notification work

PATCH In review Bartlomiej Zolnierkiewicz 2 participants 3 messages Feb 28, 2010 libata

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 atang tree: make SATA Asynchronous Notification work

DISCLAIMER: the fact of getting patches merged into atang tree means that from now on they will be getting updates for changes happening in atang tree and it should not be treated as an indication regarding decisions taken by 'upstream' kernel trees

Fix Asynchronous Notification (AN) support for SATA ATAPI devices (drives which support this feature will send a notification when new media is inserted and removed, preventing the need for user space to poll for new media needlessly consuming energy and CPU resources).

Originally AN support was added to kernel in 2007, unfortunately some relevant bits were lost in the merge process and the feature remains non-functional in modern Linux distributions. Lets fix it by adding kernel patch by Robert Hancock (from Oct 2009) addressing the issue.

User-space part (HAL daemon in particular) still won't automatically disable media polling but it can be done manually by executing:

  hal-disable-polling --device /dev/sr0

command as root.

[ To check if your ATAPI device supports AN:

  # hdparm -I /dev/sr0|grep "Asynchronous notification"

To check if it is properly recognized by kernel & user-space:

  $ lshal|grep support_async_notification ]

PS1 if you have PLDS DS-8A3S drive in your laptop (like me) you may need to update the drive's firmware to the one containing AN support (HA28 for Asus' OEM drives and HD52 for Dell's ones)

PS2 I will be rebasing atang on top of 2.6.33 in the near future

The following changes since commit cad2f21db052f21beafd44d3396a565d9a485073:
Bartlomiej Zolnierkiewicz (1):
block: fix SSD performance regression

are available in the git repository at:

git://git.kernel.org/pub/scm/linux/kernel/git/bart/misc.git atang-v4.9

Robert Hancock (1):
scsi: properly export media change notification capability in block device flags

 drivers/scsi/sd.c |    2 ++
 drivers/scsi/sr.c |    2 ++
 2 files changed, 4 insertions(+), 0 deletions(-)
#1 lore raw
Quoted 43 lines · Bartlomiej Zolnierkiewicz

DISCLAIMER: the fact of getting patches merged into atang tree means that from now on they will be getting updates for changes happening in atang tree and it should not be treated as an indication regarding decisions taken by 'upstream' kernel trees

Fix Asynchronous Notification (AN) support for SATA ATAPI devices (drives which support this feature will send a notification when new media is inserted and removed, preventing the need for user space to poll for new media needlessly consuming energy and CPU resources).

Originally AN support was added to kernel in 2007, unfortunately some relevant bits were lost in the merge process and the feature remains non-functional in modern Linux distributions.  Lets fix it by adding kernel patch by Robert Hancock (from Oct 2009) addressing the issue.

User-space part (HAL daemon in particular) still won't automatically disable media polling but it can be done manually by executing:

 hal-disable-polling --device /dev/sr0

command as root.

[ To check if your ATAPI device supports AN:

 # hdparm -I /dev/sr0|grep "Asynchronous notification"

 To check if it is properly recognized by kernel & user-space:

 $ lshal|grep support_async_notification ]

PS1 if you have PLDS DS-8A3S drive in your laptop (like me) you may need to update the drive's firmware to the one containing AN support (HA28 for Asus' OEM drives and HD52 for Dell's ones)

PS2 I will be rebasing atang on top of 2.6.33 in the near future

The following changes since commit cad2f21db052f21beafd44d3396a565d9a485073:
 Bartlomiej Zolnierkiewicz (1):
       block: fix SSD performance regression

are available in the git repository at:

Quoted 8 lines

 git://git.kernel.org/pub/scm/linux/kernel/git/bart/misc.git atang-v4.9

Robert Hancock (1):
     scsi: properly export media change notification capability in block device flags

 drivers/scsi/sd.c |    2 ++
 drivers/scsi/sr.c |    2 ++

 2 files changed, 4 insertions(+), 0 deletions(-)

I think that patch is still applicable, but as you noted it doesn't really have much effect on HAL by itself other than reporting the "supports asynchronous notification" flag, there's nothing in HAL that automatically stops polling when that's detected (at least last I checked).

As I recall the new HAL replacement (DeviceKit-disks I believe) doesn't depend on that particular flag to detect AN support.

#2 lore raw
Quoted 54 lines · Robert Hancock
Quoted 43 lines · Bartlomiej Zolnierkiewicz

DISCLAIMER: the fact of getting patches merged into atang tree means that from now on they will be getting updates for changes happening in atang tree and it should not be treated as an indication regarding decisions taken by 'upstream' kernel trees

Fix Asynchronous Notification (AN) support for SATA ATAPI devices (drives which support this feature will send a notification when new media is inserted and removed, preventing the need for user space to poll for new media needlessly consuming energy and CPU resources).

Originally AN support was added to kernel in 2007, unfortunately some relevant bits were lost in the merge process and the feature remains non-functional in modern Linux distributions. Lets fix it by adding kernel patch by Robert Hancock (from Oct 2009) addressing the issue.

User-space part (HAL daemon in particular) still won't automatically disable media polling but it can be done manually by executing:

hal-disable-polling --device /dev/sr0

command as root.

[ To check if your ATAPI device supports AN:

 # hdparm -I /dev/sr0|grep "Asynchronous notification"

To check if it is properly recognized by kernel & user-space:

 $ lshal|grep support_async_notification ]

PS1 if you have PLDS DS-8A3S drive in your laptop (like me) you may need to update the drive's firmware to the one containing AN support (HA28 for Asus' OEM drives and HD52 for Dell's ones)

PS2 I will be rebasing atang on top of 2.6.33 in the near future

The following changes since commit cad2f21db052f21beafd44d3396a565d9a485073:
Bartlomiej Zolnierkiewicz (1):
block: fix SSD performance regression

are available in the git repository at:

Quoted 8 lines

git://git.kernel.org/pub/scm/linux/kernel/git/bart/misc.git atang-v4.9

Robert Hancock (1):
scsi: properly export media change notification capability in block device flags

 drivers/scsi/sd.c |    2 ++
 drivers/scsi/sr.c |    2 ++
 2 files changed, 4 insertions(+), 0 deletions(-)
Quoted 5 lines

I think that patch is still applicable, but as you noted it doesn't really have much effect on HAL by itself other than reporting the "supports asynchronous notification" flag, there's nothing in HAL that automatically stops polling when that's detected (at least last I checked).

The real issue is that without the said flag being set media change notification will stop working after you manually disable polling, see the code in hald/linux/blockdev.c:

void
hotplug_event_refresh_blockdev (gchar *sysfs_path, HalDevice *d, void *end_token)

{
        HAL_INFO (("block_change: sysfs_path=%s", sysfs_path));

        if (hal_device_property_get_bool (d, "storage.removable.support_async_notification")) {
                blockdev_rescan_device (d);
        }

        /* done with change event */
        hotplug_event_end (end_token);
}
Quoted 2 lines

As I recall the new HAL replacement (DeviceKit-disks I believe) doesn't depend on that particular flag to detect AN support.

Well, current distributions (i.e. openSUSE 11.2) still use HAL and I want AN now, not in another 'x' years... but I also took a look at udisks now (which is a newer/re-branded DeviceKit-disks), src/device.c:

/* device_is_media_change_detected, device_is_media_change_detection_* properties */ static gboolean
update_info_media_detection (Device *device)
{
gboolean detected;
gboolean polling;
gboolean inhibitable;
gboolean inhibited;

  detected = FALSE;
  polling = FALSE;
  inhibitable = FALSE;
  inhibited = FALSE;

  if (device->priv->device_is_removable)
    {
      guint64 evt_media_change;
      GUdevDevice *parent;
      evt_media_change = sysfs_get_uint64 (device->priv->native_path, "../../evt_media_change");
      if (evt_media_change & 1)
        {
          /* SATA AN capabable drive */

          polling = FALSE;
          detected = TRUE;
          goto determined;

...

so DeviceKit should work fine but at the cost of relying on SCSI interfaces instead of more generic block ones..

--
Bartlomiej Zolnierkiewicz