Jeff Garzik wrote:
NAK, there is no reason why a global poll list is needed. Simply having
a struct workqueue in each schedule-able entity implicitly creates such
a list. But regardless, this is another example of adding
cross-controller synchronization, where none is needed.
If the worker fired per-host_set, then you could use an ata_port dynamic
flag to indicate the poll-active ports, for the ata_hp_poll_worker() loop.
If the worker fires per-port, then no loop or mutex is needed at all.
You could simply call the hp_poll hook.
It was basically an optimization to reduce storage usage and spread all
polling operations at least by polling interval even when there are many
ports to poll. Cross-port synchronization aside, it's very simple too.
Hmm... I don't think it makes much difference either way though. I'll
convert to per-port workqueue + timer.
@@ -633,6 +637,10 @@ struct ata_port_operations {
void (*error_handler) (struct ata_port *ap);
void (*post_internal_cmd) (struct ata_queued_cmd *qc);
+ void (*hp_poll_activate) (struct ata_port *ap);
+ void (*hp_poll_deactivate) (struct ata_port *ap);
+ int (*hp_poll) (struct ata_port *ap);
+
irqreturn_t (*irq_handler)(int, void *, struct pt_regs *);
void (*irq_clear) (struct ata_port *);
All new hooks require at least a one-two sentence description in the
DocBook docs, telling driver writers how to use them.
Will do.
--
tejun
-
: send the line "unsubscribe linux-ide" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html