On Mon, Feb 26, 2018 at 11:04:57PM +0800, Kai-Heng Feng wrote: > +static char quirks_param[128]; > +module_param_string(quirks, quirks_param, sizeof(quirks_param), 0644); > +MODULE_PARM_DESC(quirks, "Add/modify USB quirks by specifying quirks=vendorID:productID:quirks"); > + > +static char quirks_param_orig[128]; > +static u32 usb_detect_dynamic_quirks(struct usb_device *udev) > +{ > + u16 vid = le16_to_cpu(udev->descriptor.idVendor); > + u16 pid = le16_to_cpu(udev->descriptor.idProduct); > + struct quirk_entry *quirk; > + > + mutex_lock(&quirk_mutex); > + if (strcmp(quirks_param, quirks_param_orig) != 0) { > + strcpy(quirks_param_orig, quirks_param); What happens if the user is writing to quirks_param at the same time that you memcpy it? I think you're going about this wrong by trying to use the module_param_string machinery. You should be using module_param_cb() to build the quirks list when the user writes it (and then translate back into a string when the user wants to read from it. Also, you won't need to use a linked list for this; you can just allocate an array of quirks. -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html