作用 函数 devm_kzalloc() 和kzalloc()一样都是内核内存分配函数,但是devm_kzalloc()是跟设备(device)有关的, 当设备(device)被detached或者驱动(driver)卸载(unloaded)时,内存会被自动释放。另外,也可以通过函数 devm_kfree()手动释放。 而kzalloc()则需要手动释放(使用kfree()),但如果工程师检查不仔细,则有可能造成内存泄漏。 格式 static inline void * devm_kzalloc(struct device * dev,size_t size,gfp_t gfp) { return devm_kmalloc(dev,size,gfp | __GFP_ZERO); } void * devm_kmalloc(struct device *dev, size_t size, gfp_t gfp) { struct devres *dr;
dr = alloc_dr(devm_kmalloc_release, size, gfp, dev_to_node(dev)); if (unlikely(!dr)) return NULL; set_node_dbginfo(&dr->node, "devm_kzalloc_release", size); devres_add(dev, dr->data); return dr->data; } EXPORT_SYMBOL_GPL(devm_kmalloc); void devm_kfree(struct device * dev,void * p) { int rc; rc = devres_destroy(dev,devm_kmalloc_release,devm_kmalloc_match,p); WARN_ON(RC); } EXPORT_SYMBOL_GPL(devm_kfree); 示例 struct s3c2440_i2c_dev { struct device *dev; void __iomem *base; struct i2c_msg *msg; u32 frequency; int speed_mode; int slave_addr; struct i2c_adapter adap; }; static int s3c2440_i2c_probe(struct platform_device *pdev) { struct s3c2440_i2c_dev *i2c_dev; struct i2c_adapter *adap; struct device *dev = &pdev->dev; struct resource *res; i2c_dev = devm_kzalloc(&pdev->dev, sizeof(struct s3c2440_i2c_dev), GFP_KERNEL); if(!i2c_dev) return -ENOMEM;
... } |
|