Re: [git patch] atang tree: make SATA Asynchronous Notification work

From: Bartlomiej Zolnierkiewicz
Date: Sun Feb 28 2010 - 13:57:04 EST


On Sunday 28 February 2010 06:52:23 pm Robert Hancock wrote:
> On Sun, Feb 28, 2010 at 8:31 AM, Bartlomiej Zolnierkiewicz
> <bzolnier@xxxxxxxxx> wrote:
> > 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(-)
>
> 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);
}

> 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
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/