UBI: use vmalloc for large buffers
UBI allocates temporary buffers of PEB size, which may be 256KiB. Use vmalloc instead of kmalloc for such big temporary buffers. Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
This commit is contained in:
@@ -524,7 +524,7 @@ retry:
|
||||
goto write_error;
|
||||
|
||||
data_size = offset + len;
|
||||
new_buf = kmalloc(data_size, GFP_KERNEL);
|
||||
new_buf = vmalloc(data_size);
|
||||
if (!new_buf) {
|
||||
err = -ENOMEM;
|
||||
goto out_put;
|
||||
@@ -535,7 +535,7 @@ retry:
|
||||
if (offset > 0) {
|
||||
err = ubi_io_read_data(ubi, new_buf, pnum, 0, offset);
|
||||
if (err && err != UBI_IO_BITFLIPS) {
|
||||
kfree(new_buf);
|
||||
vfree(new_buf);
|
||||
goto out_put;
|
||||
}
|
||||
}
|
||||
@@ -544,11 +544,11 @@ retry:
|
||||
|
||||
err = ubi_io_write_data(ubi, new_buf, new_pnum, 0, data_size);
|
||||
if (err) {
|
||||
kfree(new_buf);
|
||||
vfree(new_buf);
|
||||
goto write_error;
|
||||
}
|
||||
|
||||
kfree(new_buf);
|
||||
vfree(new_buf);
|
||||
ubi_free_vid_hdr(ubi, vid_hdr);
|
||||
|
||||
vol->eba_tbl[lnum] = new_pnum;
|
||||
@@ -977,7 +977,7 @@ int ubi_eba_copy_leb(struct ubi_device *ubi, int from, int to,
|
||||
data_size = aldata_size =
|
||||
ubi->leb_size - ubi32_to_cpu(vid_hdr->data_pad);
|
||||
|
||||
buf = kmalloc(aldata_size, GFP_KERNEL);
|
||||
buf = vmalloc(aldata_size);
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -987,7 +987,7 @@ int ubi_eba_copy_leb(struct ubi_device *ubi, int from, int to,
|
||||
*/
|
||||
err = leb_write_lock(ubi, vol_id, lnum);
|
||||
if (err) {
|
||||
kfree(buf);
|
||||
vfree(buf);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -1082,7 +1082,7 @@ int ubi_eba_copy_leb(struct ubi_device *ubi, int from, int to,
|
||||
* We've written the data and are going to read it back to make
|
||||
* sure it was written correctly.
|
||||
*/
|
||||
buf1 = kmalloc(aldata_size, GFP_KERNEL);
|
||||
buf1 = vmalloc(aldata_size);
|
||||
if (!buf1) {
|
||||
err = -ENOMEM;
|
||||
goto out_unlock;
|
||||
@@ -1111,15 +1111,15 @@ int ubi_eba_copy_leb(struct ubi_device *ubi, int from, int to,
|
||||
vol->eba_tbl[lnum] = to;
|
||||
|
||||
leb_write_unlock(ubi, vol_id, lnum);
|
||||
kfree(buf);
|
||||
kfree(buf1);
|
||||
vfree(buf);
|
||||
vfree(buf1);
|
||||
|
||||
return 0;
|
||||
|
||||
out_unlock:
|
||||
leb_write_unlock(ubi, vol_id, lnum);
|
||||
kfree(buf);
|
||||
kfree(buf1);
|
||||
vfree(buf);
|
||||
vfree(buf1);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user