How to get the hci_dev from an adv instance's work struct in a linked list?
Hi!
I got quite far today refactoring from
struct hci_dev { ... struct adv_info adv_instance; ... };
to
struct hci_dev { ... struct list_head adv_instances; ... };
But in the end I got stuck on refactoring the adv timeout callback. Originally it looked like this:
static void adv_timeout_expired(struct work_struct *work) {
struct hci_dev *hdev = container_of(work, struct hci_dev,
adv_instance.timeout_exp.work);
...
}
But now I would have to construct a pointer to the hci_dev struct from a list entry:
static void adv_timeout_expired(struct work_struct *work) {
struct adv_info *adv_instance = container_of(work, struct adv_info,
timeout_exp.work);
...
}
I couldn't find a way to get the list head of the adv info list entry so that I could retrieve its containing hci_dev structure, though.
How would I construct the required hci_dev struct from the work pointer in this case? Any ideas?
Florian
Hi Florian,
Quoted 27 lines · Florian Grandel
Hi!
I got quite far today refactoring from
struct
hci_dev{ ... structadv_infoadv_instance; ... };to
struct
hci_dev{ ... structlist_headadv_instances; ... };But in the end I got stuck on refactoring the adv timeout callback. Originally it looked like this:
static void
adv_timeout_expired(struct work_struct *work){
structhci_dev*hdev = container_of(work, structhci_dev,adv_instance.timeout_exp.work);...
}But now I would have to construct a pointer to the
hci_devstruct from a list entry:static void
adv_timeout_expired(struct work_struct *work){
structadv_info*adv_instance= container_of(work, structadv_info,
Quoted 7 lines
timeout_exp.work);...
}I couldn't find a way to get the list head of the adv info list entry so that I could retrieve its containing
hci_devstructure, though.
Once simple solution is to add a struct hci_dev pointer to struct adv_info. Once you get the pointer to the instance then you can obtain the hci_dev pointer that way.
Quoted 9 lines
How would I construct the required
hci_devstruct from the work pointer in this case? Any ideas?Florian
--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Thanks,
Arman
Hi Arman,
it's impressive how responsive you are on this list here. Really cool. :-)
Quoted 28 lines
Quoted 28 lines
I got quite far today refactoring from
struct
hci_dev{ ... structadv_infoadv_instance; ... };to
struct
hci_dev{ ... structlist_headadv_instances; ... };But in the end I got stuck on refactoring the adv timeout callback. Originally it looked like this:
static void
adv_timeout_expired(struct work_struct *work){ struct hci_dev *hdev = container_of(work, struct hci_dev, adv_instance.timeout_exp.work); ... }But now I would have to construct a pointer to the
hci_devstruct from a list entry:static void
adv_timeout_expired(struct work_struct *work){ struct adv_info *adv_instance = container_of(work, struct adv_info, timeout_exp.work); ... }
Quoted 7 lines
Quoted 3 lines
I couldn't find a way to get the list head of the adv info list entry so that I could retrieve its containing
hci_devstructure, though.Once simple solution is to add a struct
hci_devpointer to structadv_info. Once you get the pointer to the instance then you can obtain thehci_devpointer that way.
Yes, that's an obvious solution albeit it's a bit ugly as it introduces extra redundancy. I thought of it, too, but I hoped I could avoid it. Maybe I can solve it like that for now and then we see whether another solution emerges once we got the refactored code in front of us.
Florian