enum cl_page_type cp_type:CP_TYPE_BITS;
unsigned cp_defer_uptodate:1,
cp_ra_updated:1,
- cp_ra_used:1;
- /* which slab kmem index this memory allocated from */
- short int cp_kmem_index;
+ cp_ra_used:1,
+ cp_in_kmem_array:1;
+ union {
+ /* which slab kmem index this memory allocated from */
+ short int cp_kmem_index;
+ /* or the page size if it's not in the slab kmem array */
+ short int cp_kmem_size;
+ };
/**
* Owning IO in cl_page_state::CPS_OWNED state. Sub-page can be owned
static void __cl_page_free(struct cl_page *cl_page, unsigned short bufsize)
{
- int index = cl_page->cp_kmem_index;
+ if (cl_page->cp_in_kmem_array) {
+ int index = cl_page->cp_kmem_index;
- if (index >= 0) {
LASSERT(index < ARRAY_SIZE(cl_page_kmem_array));
LASSERT(cl_page_kmem_size_array[index] == bufsize);
OBD_SLAB_FREE(cl_page, cl_page_kmem_array[index], bufsize);
struct folio_batch *fbatch)
{
struct cl_object *obj = cp->cp_obj;
- unsigned short bufsize = cl_object_header(obj)->coh_page_bufsize;
+ unsigned short bufsize;
struct page *vmpage;
ENTRY;
cs_pagestate_dec(obj, cp->cp_state);
if (cp->cp_type != CPT_TRANSIENT)
cl_object_put(env, obj);
+
+ if (cp->cp_in_kmem_array)
+ bufsize = cl_page_kmem_size_array[cp->cp_kmem_index];
+ else
+ bufsize = cp->cp_kmem_size;
+ if (unlikely(bufsize != cl_object_header(obj)->coh_page_bufsize))
+ CWARN("%s:"DFID" page bufsize %d, object bufsize now %d\n",
+ obj->co_lu.lo_dev->ld_obd->obd_name,
+ PFID(&cl_object_header(obj)->coh_lu.loh_fid),
+ bufsize, cl_object_header(obj)->coh_page_bufsize);
__cl_page_free(cp, bufsize);
EXIT;
}
if (smp_load_acquire(&cl_page_kmem_size_array[i]) == bufsize) {
OBD_SLAB_ALLOC_GFP(cl_page, cl_page_kmem_array[i],
bufsize, GFP_NOFS);
- if (cl_page)
+ if (cl_page) {
+ cl_page->cp_in_kmem_array = 1;
cl_page->cp_kmem_index = i;
+ }
return cl_page;
}
if (cl_page_kmem_size_array[i] == 0)
goto check;
} else {
OBD_ALLOC_GFP(cl_page, bufsize, GFP_NOFS);
- if (cl_page)
- cl_page->cp_kmem_index = -1;
+ if (cl_page) {
+ cl_page->cp_in_kmem_array = 0;
+ cl_page->cp_kmem_size = bufsize;
+ }
}
return cl_page;