-#define list_top(h, type, member) \
- (list_empty(h) ? NULL : list_entry((h)->n.next, type, member))
+#define list_top(h, type, member) \
+ ((type *)list_top_((h), container_off((h)->n.next, type, member)))
+
+static inline const void *list_top_(const struct list_head *h, size_t off)
+{
+ if (list_empty(h))
+ return NULL;
+ return (const char *)h->n.next - off;
+}