-
Notifications
You must be signed in to change notification settings - Fork 9
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
It's really difficult to debug when cgroup or css refs leak. Let's add a debug option to force the refcnt function to not be inlined so that they can be kprobed for debugging. Signed-off-by: Tejun Heo <tj@kernel.org>
- Loading branch information
Showing
4 changed files
with
117 additions
and
85 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,90 @@ | ||
/** | ||
* css_get - obtain a reference on the specified css | ||
* @css: target css | ||
* | ||
* The caller must already have a reference. | ||
*/ | ||
CGROUP_REF_FN_ATTRS | ||
void css_get(struct cgroup_subsys_state *css) | ||
{ | ||
if (!(css->flags & CSS_NO_REF)) | ||
percpu_ref_get(&css->refcnt); | ||
} | ||
|
||
/** | ||
* css_get_many - obtain references on the specified css | ||
* @css: target css | ||
* @n: number of references to get | ||
* | ||
* The caller must already have a reference. | ||
*/ | ||
CGROUP_REF_FN_ATTRS | ||
void css_get_many(struct cgroup_subsys_state *css, unsigned int n) | ||
{ | ||
if (!(css->flags & CSS_NO_REF)) | ||
percpu_ref_get_many(&css->refcnt, n); | ||
} | ||
|
||
/** | ||
* css_tryget - try to obtain a reference on the specified css | ||
* @css: target css | ||
* | ||
* Obtain a reference on @css unless it already has reached zero and is | ||
* being released. This function doesn't care whether @css is on or | ||
* offline. The caller naturally needs to ensure that @css is accessible | ||
* but doesn't have to be holding a reference on it - IOW, RCU protected | ||
* access is good enough for this function. Returns %true if a reference | ||
* count was successfully obtained; %false otherwise. | ||
*/ | ||
CGROUP_REF_FN_ATTRS | ||
bool css_tryget(struct cgroup_subsys_state *css) | ||
{ | ||
if (!(css->flags & CSS_NO_REF)) | ||
return percpu_ref_tryget(&css->refcnt); | ||
return true; | ||
} | ||
|
||
/** | ||
* css_tryget_online - try to obtain a reference on the specified css if online | ||
* @css: target css | ||
* | ||
* Obtain a reference on @css if it's online. The caller naturally needs | ||
* to ensure that @css is accessible but doesn't have to be holding a | ||
* reference on it - IOW, RCU protected access is good enough for this | ||
* function. Returns %true if a reference count was successfully obtained; | ||
* %false otherwise. | ||
*/ | ||
CGROUP_REF_FN_ATTRS | ||
bool css_tryget_online(struct cgroup_subsys_state *css) | ||
{ | ||
if (!(css->flags & CSS_NO_REF)) | ||
return percpu_ref_tryget_live(&css->refcnt); | ||
return true; | ||
} | ||
|
||
/** | ||
* css_put - put a css reference | ||
* @css: target css | ||
* | ||
* Put a reference obtained via css_get() and css_tryget_online(). | ||
*/ | ||
CGROUP_REF_FN_ATTRS | ||
void css_put(struct cgroup_subsys_state *css) | ||
{ | ||
if (!(css->flags & CSS_NO_REF)) | ||
percpu_ref_put(&css->refcnt); | ||
} | ||
|
||
/** | ||
* css_put_many - put css references | ||
* @css: target css | ||
* @n: number of references to put | ||
* | ||
* Put references obtained via css_get() and css_tryget_online(). | ||
*/ | ||
CGROUP_REF_FN_ATTRS | ||
void css_put_many(struct cgroup_subsys_state *css, unsigned int n) | ||
{ | ||
if (!(css->flags & CSS_NO_REF)) | ||
percpu_ref_put_many(&css->refcnt, n); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters