ZRAM_SIZE=50% 这样写有效吗
时间: 2024-03-25 10:37:26 浏览: 17
在zram的配置文件中,可以使用两种方式来指定zram的大小,分别是指定一个固定的大小和指定内存的百分比。如果你想指定内存的百分比来确定zram的大小,可以使用以下格式进行配置:
```
ZRAM_PERCENTAGE="50"
```
其中,50表示zram的大小为内存大小的50%,可以根据实际需求进行修改。请注意,使用百分比来指定zram大小时,zram的大小会随着内存的变化而变化,因此可能会对系统性能产生影响。建议根据实际情况进行调整。
相关问题
zramswap文件里ZRAM_SIZE=50% 这样写有效吗
在zram的配置文件中,可以使用两种方式来指定zram的大小,分别是指定一个固定的大小和指定内存的百分比。如果你想指定内存的百分比来确定zram的大小,可以使用以下格式进行配置:
```
ZRAM_PERCENTAGE="50"
```
其中,50表示zram的大小为内存大小的50%,可以根据实际需求进行修改。请注意,使用百分比来指定zram大小时,zram的大小会随着内存的变化而变化,因此可能会对系统性能产生影响。建议根据实际情况进行调整。而 `ZRAM_SIZE=50%` 这种写法是无效的,需要使用 `ZRAM_PERCENTAGE` 来设置zram的大小百分比。
优化一下下面这个函数 static u64 read_one_extent(struct zram *zram, u32 eid, u16 gid) { struct erdio *erdio = NULL; u32 ext_size = 0; int ret; struct erdio_priv *priv = NULL; priv = kmalloc(sizeof(struct erdio_priv), GFP_NOIO); if (!priv) goto err; priv->gid = gid; priv->zram = zram; erdio = extramdisk_io_get(eid, GFP_NOIO, REQ_OP_READ); if (!erdio) goto err; ext_size = extramdisk_extent_size(eid); ret = extramdisk_read_async(erdio, read_endio, priv); if (ret) goto err; return ext_size; err: extramdisk_io_put(erdio); kfree(priv); return 0; }
可以尝试以下优化:
1. 将 kmalloc() 和 kfree() 改为使用栈分配和动态分配:
```
static u64 read_one_extent(struct zram *zram, u32 eid, u16 gid) {
struct erdio *erdio = NULL;
u32 ext_size = 0;
int ret;
struct erdio_priv priv = {
.gid = gid,
.zram = zram,
};
erdio = extramdisk_io_get(eid, GFP_NOIO, REQ_OP_READ);
if (!erdio)
return 0;
ext_size = extramdisk_extent_size(eid);
ret = extramdisk_read_async(erdio, read_endio, &priv);
if (ret) {
extramdisk_io_put(erdio);
return 0;
}
extramdisk_io_put(erdio);
return ext_size;
}
```
2. 可以考虑使用 static inline 函数,这样可以避免函数调用的开销:
```
static inline struct erdio_priv *allocate_erdio_priv(u16 gid, struct zram *zram) {
struct erdio_priv *priv = kmalloc(sizeof(struct erdio_priv), GFP_NOIO);
if (!priv)
return NULL;
priv->gid = gid;
priv->zram = zram;
return priv;
}
static u64 read_one_extent(struct zram *zram, u32 eid, u16 gid) {
struct erdio *erdio = NULL;
u32 ext_size = 0;
int ret;
struct erdio_priv *priv = allocate_erdio_priv(gid, zram);
if (!priv)
return 0;
erdio = extramdisk_io_get(eid, GFP_NOIO, REQ_OP_READ);
if (!erdio) {
kfree(priv);
return 0;
}
ext_size = extramdisk_extent_size(eid);
ret = extramdisk_read_async(erdio, read_endio, priv);
if (ret) {
extramdisk_io_put(erdio);
kfree(priv);
return 0;
}
extramdisk_io_put(erdio);
return ext_size;
}
```
3. 可以考虑使用 GOTO 语句的替代方案,例如使用 if-else:
```
static inline struct erdio_priv *allocate_erdio_priv(u16 gid, struct zram *zram) {
struct erdio_priv *priv = kmalloc(sizeof(struct erdio_priv), GFP_NOIO);
if (!priv)
return NULL;
priv->gid = gid;
priv->zram = zram;
return priv;
}
static u64 read_one_extent(struct zram *zram, u32 eid, u16 gid) {
struct erdio *erdio = NULL;
u32 ext_size = 0;
int ret;
struct erdio_priv *priv = allocate_erdio_priv(gid, zram);
if (!priv)
return 0;
erdio = extramdisk_io_get(eid, GFP_NOIO, REQ_OP_READ);
if (erdio) {
ext_size = extramdisk_extent_size(eid);
ret = extramdisk_read_async(erdio, read_endio, priv);
if (!ret) {
extramdisk_io_put(erdio);
return ext_size;
}
extramdisk_io_put(erdio);
}
kfree(priv);
return 0;
}
```