On Mon, Jan 22, 2024 at 10:45:28AM +0200, Danielle Ratson wrote: > +int ethtool_cmis_page_init(struct ethtool_module_eeprom *page_data, > + u8 page, u32 offset, u32 length) > +{ > + page_data->page = page; > + page_data->offset = offset; > + page_data->length = length; > + page_data->i2c_address = ETHTOOL_CMIS_CDB_PAGE_I2C_ADDR; > + page_data->data = kmalloc(page_data->length, GFP_KERNEL); > + if (!page_data->data) > + return -ENOMEM; Hmm, so every use is forced to use kmalloc() even when it's just one byte? That seems rather wasteful. > +/* See section 9.4.1 "CMD 0040h: Module Features" in CMIS standard revision 5.2. > + * struct cmis_cdb_module_features_rpl is structured layout of the flat > + * array, ethtool_cmis_cdb_rpl::payload. > + */ > +struct cmis_cdb_module_features_rpl { > + u8 resv1[CMIS_CDB_MODULE_FEATURES_RESV_DATA]; > + __be16 max_completion_time; > +}; Does this structure need to be packed? I would suggest it does to ensure that the __be16 is correctly placed after the 34 bytes of u8. Overall, I think the idea of always kmalloc()ing the data is a bad idea at the moment. We have no implementations that DMA to/from this buffer, and it means extra cycles spent, and an extra failure point each time we want to do a CMIS command. It also introduces extra complexity, where we could just be passing a pointer to a function local variable or function local structure. Unless we decide that the data pointer should be DMA-able from (in which case, that needs documenting as such) then I would suggest getting rid of the extra kmalloc()...kfree() bits. Thanks. -- RMK's Patch system: https://www.armlinux.org.uk/developer/patches/ FTTP is here! 80Mbps down 10Mbps up. Decent connectivity at last!